0

我正在尝试使用fuzzywuzzy我的 python 应用程序中的模糊逻辑库来匹配字符串。我发现,即使得分相等,fuzzywuzzy 也没有给出适当的结果,它在第一个位置列出了错误的结果。
这是示例:

>>> d = ['John Welsh','Patrick Walsh','Jonathan Walsh']
>>> e = process.extract('jwalsh', d)
>>> e = sorted(e,key=lambda k:k[1],reverse=True)
>>> e
[('Patrick Walsh', 75), ('Jonathan Walsh', 75), ('John Welsh', 62)]

可以看到,字符串 is jwalsh,最合适的结果是Jonathan Walsh,它应该在结果中的第一个位置,因为它是第二个。
请建议我如何更正结果并显示最合适的结果。由于这是相同得分的情况,因此存在可以以较少得分获得适当结果的情况。
我该怎么做才能获得最佳输出?除了 有什么建议fuzzywuzzy吗?请让我知道。

4

1 回答 1

0

这类似于我最近回答的另一个问题

由于您没有指定记分器,因此 process.extract 默认使用 fuzz.WRatio。由于您的选择长度与查询长度之比至少为 1.66 (10/6),因此 WRatio 允许使用 fuzz.partial_ratio 给“Patrick Walsh”和“Jonathan Walsh”相同的分数,因为它们两者都包含字符串“Walsh”。

要解决此问题,您应该考虑使用两个或多个不同评分者的平均值(或加权平均值)。前任:

x = process.extract('jwalsh',d,scorer=fuzz.ratio)
[('John Welsh', 62), ('Jonathan Walsh', 60), ('Patrick Walsh', 53)]

y = process.extract('jwalsh',d,scorer=fuzz.partial_ratio)
[('Patrick Walsh', 83), ('Jonathan Walsh', 83), ('John Welsh', 67)]

我对元组的处理有点生疏,所以我没有确切的代码来将它们平均在一起,但是这些分数的直接平均值会给出:

[('Patrick Walsh', 68), ('Jonathan Walsh', 71.5), ('John Welsh', 64.5)]

在这种情况下,它指定了正确的答案。显然,随着查询和选择的更多变化,您可能需要调整使用的评分器和平均权重,但这应该为您指明正确的方向。

于 2017-11-27T20:53:12.640 回答