使用Fuzzywuzzy进行字符串匹配-是使用Levenshtein距离还是使用Ratcliff / Obershelp模式匹配算法?

时间:2018-12-30 18:02:24

标签: python string-matching levenshtein-distance

fuzzywuzzy是一个非常流行的字符串匹配库。根据该库的documentation,提到它使用Levenshtein距离来计算序列之间的差异。但是在关闭inspection时,我发现它实际上使用了SequenceMatcher库中的difflib函数。根据{{​​3}},此函数使用Ratcliff / Obershelp模式匹配算法。

根据定义,documentation是将一个字符串转换为另一个字符串所需的最小编辑次数,Levenshtein distance计算出匹配字符的两倍数除以两个字符串。密切相关的Ratcliff/Obershelp pattern-matching algorithm将两者进行比较。

当我运行示例时,在Fuzzywuzzy中我得到了SequenceMatcher和ratio函数的相同结果。

from difflib import SequenceMatcher
from fuzzywuzzy import fuzz
s = SequenceMatcher(None, "abcd", "bcde")
s.ratio()
# 0.75
fuzz.ratio("abcd", "bcde")
# 75

如果我手动计算两个字符串之间的Levenshtein距离,我猜想它只是2。在这种情况下,如何使用贡献者在文档中所写的Levenshtein距离?

1 个答案:

答案 0 :(得分:1)

FuzzyWuzzy.ratio using python-Levenshtein不会返回Levenshtein得分,而是Levenshtein比率,即(a + b-LevenshteinScore)/(a + b),其中a和b是两个字符串的长度比较。

如果您没有安装python-Levenshtein,则Fuzzywuzzy根本不会使用Levenshtein。尽管它建议安装python-Levenshtein,但Fuzzywuzzy的主页在此方面具有误导性。

python-Levenshtein在安装时存在一些问题;我使用了this stackoverflow问题的第二个答案来解决它。

如果未安装python-Levenshtein,则FuzzyWuzzy改用difflib,这对于许多输入值都是相同的,但不是全部。开发人员建议使用python-Levenshtein。请参见this issue on fuzzywuzzy's git,其中包括一个示例示例,其中与不使用包装相比,包装的结果不同。这可能不应该发生,或者至少文档应该对此予以明确,但是FuzzyWuzzy的Devs似乎至少对功能感到满意。