많은 단락이있는 텍스트에서 중복 된 단락을 제거해야합니다.텍스트의 두 단락을 비교하는 방법?
클래스 java.security.MessageDigest
의 함수를 사용하여 각 단락의 MD5 해시 값을 계산 한 다음 Set
에 해시 값을 추가합니다.
add()
이 성공적으로 실행되면 최신 단락이 중복 된 것입니다.
이런 식으로 위험이 있습니까?
String.equals()
을 제외하고 다른 방법이 있습니까?
많은 단락이있는 텍스트에서 중복 된 단락을 제거해야합니다.텍스트의 두 단락을 비교하는 방법?
클래스 java.security.MessageDigest
의 함수를 사용하여 각 단락의 MD5 해시 값을 계산 한 다음 Set
에 해시 값을 추가합니다.
add()
이 성공적으로 실행되면 최신 단락이 중복 된 것입니다.
이런 식으로 위험이 있습니까?
String.equals()
을 제외하고 다른 방법이 있습니까?
나는 이것이 좋은 방법이라고 생각합니다. 그러나 염두에 두어야 할 몇 가지 사항이 있습니다.
MD5 해시가 아직 설정되지 않은 경우 단락이 고유하다는 의미입니다. 그러나 그 반대는 사실이 아닙니다. 따라서 해시가 이미 설정되어있는 경우 의 해시 값이 중복되지 않을 수 있습니다. 이것은 거의있을 법하지 않지만 다른 모든 사람들과 확실히 단락을 테스트해야합니다. 그 String.equals 할 것이다.
또한 고유 한 텍스트 (오타, 공백, 대문자 등)를 고려해야합니다. 그러나 모든 방법에서 그럴 수 있습니다.
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
을 사용하면 단락의 원래 순서를 유지할 수도 있습니다.
구두점, 공백, 줄 바꿈 등의 미세한 차이로 인해 본질적으로 동일한 단락의 해시가 달라질 수 있습니다.
아마도 예를 들어 덜 취약한 측정 항목을 고려해야합니다. Cosine Similarity은 단락 매칭에 매우 적합합니다.
건배,
당신이 단락 예를 정상화 할 수 해싱 전에 문장 부호 제거, 소문자로 변환 및 공백 추가 제거. 정규화가 끝난 후 단락이 다른 단락은 동일한 해시를 얻습니다.
문자열 비교를하는 대신 더 나은 방법이라고 생각합니다. –
나는 Ravindra에 동의합니다. MD5는 독특한 해시를 생성하지 않습니다. –
그들은 정확히 일치해야합니까, 아니면 앞/뒤 공백을 무시합니까? –