我需要刪除帶有許多段落的文本中的重複段落。如何比較兩段文字?
我使用類java.security.MessageDigest
中的函數來計算每個段落的MD5哈希值,然後將這些哈希值添加到Set
中。
如果add()
'ed成功,則表示最新的段落是重複的。
有沒有這種方式的風險?
除String.equals()
之外,有沒有其他方法可以做到這一點?
我需要刪除帶有許多段落的文本中的重複段落。如何比較兩段文字?
我使用類java.security.MessageDigest
中的函數來計算每個段落的MD5哈希值,然後將這些哈希值添加到Set
中。
如果add()
'ed成功,則表示最新的段落是重複的。
有沒有這種方式的風險?
除String.equals()
之外,有沒有其他方法可以做到這一點?
我認爲這是一個好方法。然而,有一些事情要記住:
如果MD5散列尚未在集合中,則表示段落是唯一的。但事實恰恰相反。所以如果你發現哈希已經在集合中,你可以用潛在地具有一個非重複的哈希值。這是不太可能的,但你必須對所有其他人測試該段落,以確保。爲此String.equals會做。另外,你應該很好地考慮你所說的獨特(關於錯字,空格,首都等等),但任何方法都是如此。
沒有必要計算MD5散列,只需使用HashSet
並嘗試將字符串本身放入該集合。這將使用String#hashCode()
方法來計算字符串的散列值並檢查它是否已經在集合中。使用LinkedHashSet
甚至保持段落的原始順序。
正如其他人所建議的,您應該意識到標點符號,空格,換行符等的細微差別可能會導致您的哈希因段落基本相同而不同。也許你應該考慮一個不太脆弱的指標,比如說。 Cosine Similarity這非常適合用於匹配段落。
歡呼聲,
散列之前,你可以正常化段落例如,刪除標點符號,轉換爲小寫字母並刪除額外的空格。 標準化後,只有不同的段落纔會得到相同的散列。
我認爲這是一個更好的方法,而不是做字符串比較。 – 2013-03-13 10:15:10
我同意拉文德拉。 MD5不會產生獨特的哈希。 – 2013-03-13 10:15:55
他們需要匹配_exactly_還是忽略前導/尾隨空格? – 2013-03-13 10:19:03