2016-09-20 56 views
1

我正在使用Python中的模糊wuzzy,雖然它聲稱它與levenshtein距離一起工作,但我發現許多單個字符不同的字符串會產生不同的結果。例如。Python的fuzzywuzzy返回不可預知的結果

>>>fuzz.ratio("vendedor","vendedora") 
94 
>>>fuzz.ratio("estagiário","estagiária") 
90 
>>> fuzz.ratio("abcdefghijlmnopqrst","abcdefghijlmnopqrsty") 
97 
>>>fuzz.ratio("abc","abcd") 
86 
>>>fuzz.ratio("a","ab") 
67 

我想Levenshtein距離應該是相同的,因爲在所有的例子單個字符的距離,但我知道這不是簡單的距離,這是某種形式的某種「比例平等」的。

我試圖理解它是如何工作的,但我似乎無法理解。我很長的字符串給出了一個97和很短的一個67.我想這意味着字符串越大,對單個字符的影響就越小。然而,對於「vendedor」,「vendedora」和「estagiário」,「estagiária」的例子,情況並非如此,因爲後者比前者大。

這是如何工作的?

我目前正在匹配用戶輸入職位名稱,嘗試將錯誤輸入的姓名與正確類型的名稱連接起來。是否有更好的工作包用於我的任務?

+2

'fuzz.ratio'基於levenshtein距離返回字符串相似程度的百分比。 –

回答

3

你對一般的模糊工作原理是否正確。來自fuzz.ratio函數的較大輸出數表示字符串彼此更接近(100是完美匹配)。我預製了幾個額外的測試用例來檢查它是如何工作的。它們是:

fuzz.ratio("abc", "abce") #to show which extra letter doesn't matter. 
86 
fuzz.ratio("abcd", "abce") #to show that replacing a number is worse than adding. 
75 
fuzz.ratio("abc", "abc") #to find what a match gives. 
100 

從這些測試中,我們可以看到,更換數對比率計算比添加一個字母一個更大的效果(這就是爲什麼estagiário/estagiária較少的匹配比vendedor/vendedora的儘管時間更長)。根據this,該軟件包也可用於從可能的匹配列表中自動選擇最佳選擇,因此我認爲這對您的預期目標來說是一個不錯的選擇。