【问题标题】:Appropriate matching of the string as per scoring using fuzzywuzzy and python3.6使用fuzzywuzzy和python3.6根据评分适当匹配字符串
【发布时间】:2018-01-09 02:57:40
【问题描述】:

我正在尝试在我的 python 应用程序中使用模糊逻辑库fuzzywuzzy 匹配字符串。我发现,即使得分相等,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)]

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

【问题讨论】:

  • 你先pip install python-levenshtein了吗?
  • 是的,我做到了。然后只有它向我显示了结果,否则有一个与安装`python-Levenshtein`相关的通知
  • 先尝试将所有内容都设为小写。 jwalsh 实际上与 Jonathan Walsh 并没有比 Patrick Walsh 更接近,因为 'j' 和 'J' 是不同的。
  • 我也试过了。仍然对结果排列没有影响。
  • 这种模糊匹配问题有解决方案吗?

标签: python python-3.x string-matching fuzzy-search fuzzywuzzy


【解决方案1】:

这类似于another question I answered recently

由于您没有指定记分器,因此 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)]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多