2010-03-17 41 views
12

我想知道Java中是否有任何類能夠使用它自己的標準檢查字符串等於另一個字符串的多少。 例子:檢查字符串聽起來像另一個Java中的字符數

  • William Shakespeare/William Shakespeare : might be 100%
  • William Shakespe**a**re/William Shakespe**e**re : might have above 90%
  • William Shakespeare/Shakespeare, William : might have above 70% (just examples)
+3

你應該知道,探測法和萊文斯坦是兩個完全不同的事情! Levenshtein可以幫助你發現錯別字。例如。用戶輸入「Wrich」而不是「Erich」,儘管當大聲說出這些單詞時聽起來並不相似。 Soundex可以讓你找到聽起來類似的單詞,不管它們有多少共同的字母,例如在尋找「Eryk」時可能會讓你找到「Erich」。 – 2010-03-17 10:01:08

回答

5

一般來說,有levenshtein算法,它只是輸出了多少插入/更新/刪除操作,你就必須執行(面向字符)以便將一個字符串轉換爲另一個字符串。 Apache的StringUtils類有一個實現。

+3

AFAIK levenshtein不考慮單詞的「聲音」。 – 2010-03-17 09:47:25

7

你必須使用一個 「軟」 字符串指標:

還有很多其他的,請參閱String Metrics的概述。

最好的算法高度依賴於問題領域。例如,如果您想比較「真實世界」單詞的相似性,SoundEx會降低東歐名稱,而漢明距離對您的幫助不大。

2

對於多種實現,這稱爲SoundEx,查找java soundex

其中之一是apache soundex看起來不錯(雖然我沒有使用它自己)。

14

我看到兩個主要候選人:

  • Soundex編碼,通過Apache Commons實現。但是,請注意,它主要用於單個相對較短的單詞。它不會在你的第三個例子中找到相似之處。另外,它確實只適用於英文單詞。
  • Levenshtein distance(再次實施在Apache Commons)。這是語言不可知的,但在第三個例子中,切換部分的相似性會相對較低(更像是40%)。像Damerau–Levenshtein distance這樣的修改可能會產生更好的結果。
+4

(+1)的共享編解碼器'Metaphone'和'DoubleMetaphone'算法提供更好的結果是SOUNDEX,在我的經驗。 – skaffman 2010-03-17 09:54:30

0

字符串匹配是非常具體的問題,因爲大多數情況下,您的字符串中要有相同的噪聲特徵來匹配,無論是多餘的標點符號,拼寫錯誤還是拼寫錯誤。如果您正在大範圍地進行此操作,您需要找到適合於輸入數據中問題的算法。

探測法會給你一個置信度兩個字符串發音相同,但您可能需要首先做一些前期的清洗(如消除標點符號和令牌化串入單獨的詞)。

你可以做的最好的事情就是運行一個測試,可以使用大量不同的算法,levenshtein是一個很好的,和soundex一樣(儘管你的里程會隨你的問題區域而變化)。這兩種算法也有不同,BTW。

我建議看看simmetricssecond string庫有哪些字符串匹配實現的負載(我更喜歡第二個字符串庫)。

這聽起來像你有一個有趣的問題來解決,祝你好運!

0

嘗試SimMetrics - 開源庫包括的SoundEx和ChapmanMatchingSoundex這將使對給出的例子一個更好的成績。即Will Shake vs Shake,這種方法是否會在SoundEx上使用一種匹配方法。您可能想要嘗試的另一個度量標準,儘管不是語音評分得分非常好(如果在不同的名稱匹配任務中不是更好),則是同一個庫中的q-Grams度量標準。