2013-03-13 102 views
6

我需要刪除帶有許多段落的文本中的重複段落。如何比較兩段文字?

我使用類java.security.MessageDigest中的函數來計算每個段落的MD5哈希值,然後將這些哈希值添加到Set中。

如果add()'ed成功,則表示最新的段落是重複的。

有沒有這種方式的風險?

String.equals()之外,有沒有其他方法可以做到這一點?

+0

我認爲這是一個更好的方法,而不是做字符串比較。 – 2013-03-13 10:15:10

+0

我同意拉文德拉。 MD5不會產生獨特的哈希。 – 2013-03-13 10:15:55

+0

他們需要匹配_exactly_還是忽略前導/尾隨空格? – 2013-03-13 10:19:03

回答

0

我認爲這是一個好方法。然而,有一些事情要記住:

  1. 請注意,計算哈希是一個沉重的操作。如果你不得不重複數百萬段落,這可能導致你的程序變慢。
  2. 即使以這種方式,您最終可能會得到稍微不同的段落(例如打字錯誤,例如),從而導致未檢測到。如果是這種情況,則應在計算散列之前對其段落進行規格化(將其置於小寫,刪除額外空格等等)。
1

如果MD5散列尚未在集合中,則表示段落是唯一的。但事實恰恰相反。所以如果你發現哈希已經在集合中,你可以用潛在地具有一個非重複的哈希值。這是不太可能的,但你必須對所有其他人測試該段落,以確保。爲此String.equals會做。另外,你應該很好地考慮你所說的獨特(關於錯字,空格,首都等等),但任何方法都是如此。

1

沒有必要計算MD5散列,只需使用HashSet並嘗試將字符串本身放入該集合。這將使用String#hashCode()方法來計算字符串的散列值並檢查它是否已經在集合中。使用LinkedHashSet甚至保持段落的原始順序。

1

正如其他人所建議的,您應該意識到標點符號,空格,換行符等的細微差別可能會導致您的哈希因段落基本相同而不同。也許你應該考慮一個不太脆弱的指標,比如說。 Cosine Similarity這非常適合用於匹配段落。

歡呼聲,

2

散列之前,你可以正常化段落例如,刪除標點符號,轉換爲小寫字母並刪除額外的空格。 標準化後,只有不同的段落纔會得到相同的散列。