首先你使用的是一个“坏”的得分手。根据你的分数你可能使用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