6

多くの段落を含むテキストで重複した段落を削除する必要があります。

クラスの関数を使用してjava.security.MessageDigest各段落の MD5 ハッシュ値を計算し、これらのハッシュ値をSet.

成功した場合add()は、最新の段落が重複していることを意味します。

この方法のリスクはありますか?

を除いてString.equals()、それを行う他の方法はありますか?

4

5 に答える 5

1

MD5 ハッシュがまだセットに含まれていない場合は、段落が一意であることを意味します。しかし、その逆は正しくありません。そのため、ハッシュが既にセットに含まれていることがわかった場合、同じハッシュ値で重複していない可能性があります。これは非常にありそうもないことですが、確実にするために、その段落を他のすべての段落に対してテストする必要があります。そのためには String.equals で十分です。

さらに、固有と呼ぶもの (タイプミス、空白、大文字など) を十分に考慮する必要がありますが、それはどのメソッドにも当てはまります。

于 2013-03-13T10:23:16.850 に答える
1

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すると、段落の元の順序が維持されます。

于 2013-03-13T10:28:14.327 に答える
1

他の人が示唆しているように、句読点、空白、改行などのわずかな違いにより、本質的に同じ段落のハッシュが異なる場合があることに注意してください。

おそらく、次のような脆弱でないメトリックを検討する必要があります。段落の一致に適したコサイン類似度。

乾杯、

于 2013-03-13T10:28:56.733 に答える
0

これは良い方法だと思います。ただし、次の点に注意してください。

  1. ハッシュの計算は重い操作であることに注意してください。何百万もの段落を繰り返す必要がある場合、これによりプログラムが遅くなる可能性があります。
  2. この方法でも、わずかに異なる段落 (タイプミスなど) が検出されない可能性があります。この場合、ハッシュを計算する前に段落を正規化する必要があります (小文字にする、余分なスペースを削除するなど)。
于 2013-03-13T10:22:48.083 に答える