2013-03-13 3 views
6

많은 단락이있는 텍스트에서 중복 된 단락을 제거해야합니다.텍스트의 두 단락을 비교하는 방법?

클래스 java.security.MessageDigest의 함수를 사용하여 각 단락의 MD5 해시 값을 계산 한 다음 Set에 해시 값을 추가합니다.

add()이 성공적으로 실행되면 최신 단락이 중복 된 것입니다.

이런 식으로 위험이 있습니까?

String.equals()을 제외하고 다른 방법이 있습니까?

+0

문자열 비교를하는 대신 더 나은 방법이라고 생각합니다. –

+0

나는 Ravindra에 동의합니다. MD5는 독특한 해시를 생성하지 않습니다. –

+0

그들은 정확히 일치해야합니까, 아니면 앞/뒤 공백을 무시합니까? –

답변

0

나는 이것이 좋은 방법이라고 생각합니다. 그러나 염두에 두어야 할 몇 가지 사항이 있습니다.

  1. 해시 계산은 많은 작업입니다. 수백만 개의 단락을 반복해야한다면 프로그램이 느려질 수 있습니다.
  2. 이런 식으로조차도, 약간 다른 단락으로 끝날 수 있습니다 (예를 들어, 오타가있는 경우). 이 경우 해시를 계산하기 전에 단락을 표준화해야합니다 (소문자로 넣고 여분의 공백을 제거하는 등).
1

MD5 해시가 아직 설정되지 않은 경우 단락이 고유하다는 의미입니다. 그러나 그 반대는 사실이 아닙니다. 따라서 해시가 이미 설정되어있는 경우 의 해시 값이 중복되지 않을 수 있습니다. 이것은 거의있을 법하지 않지만 다른 모든 사람들과 확실히 단락을 테스트해야합니다. 그 String.equals 할 것이다.

또한 고유 한 텍스트 (오타, 공백, 대문자 등)를 고려해야합니다. 그러나 모든 방법에서 그럴 수 있습니다.

1

MD5 해시를 계산할 필요가 없습니다. HashSet을 사용하고 문자열 자체를이 집합에 넣으려고합니다. 이 경우 String#hashCode() 메서드를 사용하여 String의 해시 값을 계산하고 해당 문자열이 이미 세트에 있는지 확인합니다.

public Set removeDuplicates(String[] paragraphs) { 
    Set<String> set = new LinkedHashSet<String>(); 
    for (String p : paragraphs) { 
     set.add(p); 
    } 
    return set; 
} 

LinkedHashSet을 사용하면 단락의 원래 순서를 유지할 수도 있습니다.

1

구두점, 공백, 줄 바꿈 등의 미세한 차이로 인해 본질적으로 동일한 단락의 해시가 달라질 수 있습니다.

아마도 예를 들어 덜 취약한 측정 항목을 고려해야합니다. Cosine Similarity은 단락 매칭에 매우 적합합니다.

건배,

2

당신이 단락 예를 정상화 할 수 해싱 전에 문장 부호 제거, 소문자로 변환 및 공백 추가 제거. 정규화가 끝난 후 단락이 다른 단락은 동일한 해시를 얻습니다.