我正在尝试使用 process.extract from thefuzz (fuzzywuzzy) 使用目标词对单个长“单词”执行模糊搜索。但是,我得到的是单个字母/数字,而不是部分匹配(通过 fuzz.partial_ratio 检测到)。我如何获得与partial_ratio检测到的序列相匹配的序列?
片段:
from thefuzz import fuzz, process
target = "1234"
source = "012345"
print(fuzz.partial_ratio(target, source))
print(process.extract(target, source, limit=2))
第一个打印产生的partial_ratio为100,清楚地表明目标位于源内部。然而,提取返回;
[('1', 90), ('2', 90)]
与(我所期待的)相反;
[('1234', 100)]
我做错了什么和/或误解了什么?
要解决您的问题,请将最后一个打印行修改为以下内容:
print(process.extract(target, [source], scorer=fuzz.partial_ratio))
# [('012345', 100)]
您的代码不起作用的原因有两个。
source
应该是 一个列表或类似字典的对象。这就是为什么你会得到“1”、“2”等,因为该函数正在迭代字符串并获取字符。process.extract
使用与 partial_ratio
不同的记分器(使用
fuzz.WRatio
)要解决 1),请将源设为列表
print(process.extract(target, [source], limit=2))
# [('012345', 90)]
注意 limit 在这里没有任何作用,因为如果有多个源字符串要搜索,它会为您提供更多结果,例如
target = '1234'
sources = ['012345', '324423', '0123567']
print(process.extract(target, sources, scorer=fuzz.partial_ratio, limit=2))
# [('012345', 100), ('0123567', 75)]
解决2)并得到你想要的结果
print(process.extract(target, [source], scorer=fuzz.partial_ratio))
# [('012345', 100)]
注意您在这里不会得到“1234”,因为结果告诉您与哪个源字符串进行比较并以此精度找到目标。它不仅仅是像您想象的那样给您目标。