簡體   English   中英

如何比較兩段文字?

[英]How to compare two paragraphs of text?

我需要刪除包含許多段落的文本中的重復段落。

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

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

這種方式有風險嗎?

除了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甚至可以保留段落的原始順序。

正如其他人所建議的那樣,你應該知道標點符號,空格,換行符等的微小差異可能會使你的哈希值與基本相同的段落不同。

也許您應該考慮一個不太脆弱的指標,例如。 余弦相似度非常適合匹配段落。

干杯,

我認為這是一個好方法。 但是,有一些事情要記住:

  1. 請注意,計算哈希是一項繁重的操作。 如果您不得不重復數百萬段,這可能會使您的程序變慢。
  2. 即使以這種方式,你可能會得到一些略有不同的段落(錯別字段,例如錯別字)。 如果是這種情況,您應該在計算哈希值之前對段落進行規范化(將其放入小寫,刪除多余空格等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM