2010-03-28 13 views
4

我知道SOUNDEX和(雙)Metaphone,但這些不會讓我測試整個詞的相似性 - 例如「Hi」聽起來很像「Bye」 ,但這兩種方法都會將它們標記爲完全不同。在Ruby中檢測類似的聲音詞

Ruby中的任何庫,或者您知道的任何方法都能夠確定兩個單詞之間的相似性嗎? (或者布爾值是/不相似,或者數字類似40%)

編輯:如果有一種簡單的方法可以'放入'不同的方言或語言!

回答

8

我認爲你正在描述levenshtein距離。是的,這裏有寶石。如果你進入純粹的Ruby去尋找文字寶石。

$ gem install text 

The docs有更多的細節,但這裏的問題的癥結所在:

Text::Levenshtein.distance('test', 'test') # => 0 
Text::Levenshtein.distance('test', 'tent') # => 1 

如果你確定與原生擴展...

$ gem install levenshtein 

It's usage is similar。它的表現非常好。 (它可以在我的系統上每分鐘處理大約1000次拼寫更正。)

如果您需要知道兩個單詞的相似程度,請使用單詞長度上的距離。

如果你想要一個簡單的相似性測試,可以考慮這樣的事情:

未經檢驗的,而是直截了當:

String.module_eval do 
    def similar?(other, threshold=2) 
    distance = Text::Levenshtein.distance(self, other) 
    distance <= threshold 
    end 
end 
+1

我還應該提到,levenshtein距離並不在乎你使用的語言。維基百科可以在這裏提供很好的細節:http://en.wikipedia.org/wiki/Levenshtein_distance – Levi 2010-03-28 13:26:36

+0

你可能真的很喜歡,並根據輸入字符串的大小計算閾值。如果這個詞很短(即搜索詞),您可能需要較低的閾值。 – Levi 2010-03-28 13:44:05

+0

哇!這是太棒了!我試圖通過發音(以給定的方言)編譯(字典)單詞列表及其唯一性。作爲它的所有親戚,我認爲我會遍歷每一個單詞的組合,將每個單詞的距離相加,然後除以列表中的最大值。我們的目標是製作一個網址'shortener',以便製作清晰易記的聲音網址。我可能會嘗試在每種方言中使用IPA表示方式(「草」和「麪食」,美式相似和「南方」式英語口音相對不同) – 2010-03-28 14:58:46

-1

您可能首先使用同義詞庫數據庫預處理單詞,該數據庫將具有相似含義的單詞轉換爲同一單詞。有不同的詞庫數據庫,不幸的是我找不到一個適合英語的免費詞庫(http://www.gutenberg.org/etext/3202是我找到的那個詞,但是這並沒有說明具體詞有什麼關係(如相似;相反;其他含義等) 。),所以在同一行上的所有單詞都一些關係,但你不會知道,關係是什麼)

但例如匈牙利有一個很好的免費詞庫數據庫,但是你沒有soundex/metaphone匈牙利文本...

如果你有數據庫編寫一個預處理文本的程序不是太難(最終它是一個簡單的搜索替換,但你可能想要使用單工預處理敘詞表數據庫要麼甲殼電話太)

+0

含義在這裏並不重要的話,我會想「嗨」和「高「來得到100%的相似度,」嗨「,」再見「和」死「在每個之間接近100%,但」腦電圖「和」茶杯「爲0%。通過詞庫轉換會混淆我認爲的問題! – 2010-03-28 11:16:13