Python的fuzzywuzzy返回不可预测的结果

时间:2016-09-20 15:02:36

标签: python string-matching fuzzywuzzy

我正在使用python中的模糊wuzzy,虽然它声称它与levenshtein距离有效,但我发现许多具有单个字符的字符串会产生不同的结果。例如。

>>>fuzz.ratio("vendedor","vendedora")
94
>>>fuzz.ratio("estagiário","estagiária")
90
>>> fuzz.ratio("abcdefghijlmnopqrst","abcdefghijlmnopqrsty")
97
>>>fuzz.ratio("abc","abcd")
86
>>>fuzz.ratio("a","ab")
67

我想levenshtein距离应该与所有示例中的单个字符距离相同,但我知道这不是简单的距离,它是某种某种“平等百分比”。

我试图理解它是如何工作的,但我似乎无法理解。我的长字符串给出了97而非短的67.我想这意味着字符串越大,对单个字符的影响就越小。然而,对于“vendedor”,“vendedora”和“estagiário”,“estagiária”的例子,情况并非如此,因为后者比前者大。

这是如何运作的?

我目前正在匹配用户输入的职位名称,尝试使用正确键入的名称连接错误的名称等等。我的任务有更好的包吗?

1 个答案:

答案 0 :(得分:3)

关于模糊一般的工作原理你是对的。来自fuzz.ratio函数的较大输出数意味着字符串彼此更接近(100是完美匹配)。我执行了几个额外的测试用例来检查它是如何工作的。他们在这里:

fuzz.ratio("abc", "abce") #to show which extra letter doesn't matter.
86
fuzz.ratio("abcd", "abce") #to show that replacing a number is worse than adding.
75
fuzz.ratio("abc", "abc") #to find what a match gives.
100

从这些测试中,我们可以看到,替换一个数字对比率计算的影响大于添加一个字母(这就是为什么estagiário/estagiária不像vendedor / vendedora那样匹配,尽管时间更长)。根据{{​​3}},该软件包还可以用于从可能的匹配列表中自动选择最佳选择,因此我认为这对于您的预期目的来说是一个不错的选择。