首先你使用的是一個「壞」的得分手。根據你的分數你可能使用difflib。您應該切換到基於python-Levenshtein
的實施。這可以通過參數scorer
完成。
from fuzzywuzzy import process
from fuzzywuzzy import fuzz
def MyScorer(s1, s2):
fratio = fuzz.ratio(s1, s2)
fratio -= (s2.find(s1)*5)
return fratio
choices = ['account', 'update', 'query']
dex = process.extract('u', choices, scorer=fuzz.token_sort_ratio)
mex = process.extract('u', choices, scorer=MyScorer)
print("Default Scorer:", dex)
print("MyScorer:", mex)
現在輸出
[('query', 33), ('update', 29), ('account', 25)]
哪個更好,但Levenshtein
並沒有真正關心的位置,
Levenshtein距離(LD)是衡量兩個字符串之間的相似性,我們將其稱爲源字符串和目標字符串(t)。距離是將s轉換爲t所需的刪除,插入或替換的數量。
這就是爲什麼我添加了MyScorer()
的定義,您可以在其中實現您自己的算法,將該位置考慮在內。我還添加了一個考慮位置的實現示例(但我沒有真正設計這些算法的經驗,所以不要指望這個算法是完美的或者甚至是可用的)。無論如何,MyScorer的輸出是:
[('update', 29), ('query', 28), ('account', 5)]
感謝您的解釋。我很好奇 - 這不是大多數模糊搜索的自然行爲嗎?例如,在Sublime Text/Visual Studio Code中使用** CMD + SHIFT + P **並鍵入* u *將突出顯示命令中的* u *字符,但它總是以* u *開頭的命令顯示。 –
我想他們要麼創建了自己的模糊匹配算法,要麼他們只是使用了不同的庫。 [fuzzyset](https://github.com/axiak/fuzzyset)開箱即可出色完成工作,你可能想嘗試一下。 (不要使用pip軟件包,它已經過時了!下載github軟件倉庫和easy_install軟件) – Skynet