多くの段落を含むテキストで重複した段落を削除する必要があります。
クラスの関数を使用してjava.security.MessageDigest
各段落の MD5 ハッシュ値を計算し、これらのハッシュ値をSet
.
成功した場合add()
は、最新の段落が重複していることを意味します。
この方法のリスクはありますか?
を除いてString.equals()
、それを行う他の方法はありますか?
MD5 ハッシュがまだセットに含まれていない場合は、段落が一意であることを意味します。しかし、その逆は正しくありません。そのため、ハッシュが既にセットに含まれていることがわかった場合、同じハッシュ値で重複していない可能性があります。これは非常にありそうもないことですが、確実にするために、その段落を他のすべての段落に対してテストする必要があります。そのためには String.equals で十分です。
さらに、固有と呼ぶもの (タイプミス、空白、大文字など) を十分に考慮する必要がありますが、それはどのメソッドにも当てはまります。
MD5 ハッシュを計算する必要はありません。単に a を使用してHashSet
、文字列自体をこのセットに入れてみてください。これは、String#hashCode()
メソッドを使用して文字列のハッシュ値を計算し、それが既にセットに含まれているかどうかを確認します。
public Set removeDuplicates(String[] paragraphs) {
Set<String> set = new LinkedHashSet<String>();
for (String p : paragraphs) {
set.add(p);
}
return set;
}
偶数を使用LinkedHashSet
すると、段落の元の順序が維持されます。
他の人が示唆しているように、句読点、空白、改行などのわずかな違いにより、本質的に同じ段落のハッシュが異なる場合があることに注意してください。
おそらく、次のような脆弱でないメトリックを検討する必要があります。段落の一致に適したコサイン類似度。
乾杯、
これは良い方法だと思います。ただし、次の点に注意してください。