使用fuzzywuzzy 的字符串匹配——是使用Levenshtein 距离还是Ratcliff/Obershelp 模式匹配算法?

pra*_*nth 5 python string-matching levenshtein-distance

Fuzzywuzzy是一个非常流行的字符串匹配库。根据库的文档,提到它使用 Levenshtein 距离来计算序列之间的差异。但是仔细检查后,我发现它实际上使用SequenceMatcherdifflib库中的函数。根据文档,此函数使用 Ratcliff/Obershelp 模式匹配算法。

根据定义,Levenshtein 距离是将一个字符串转换为另一个字符串所需的最小编辑次数,Ratcliff/Obershelp 模式匹配算法计算匹配字符的两倍数除以两个字符串中的字符总数。比较两者的密切相关帖子

当我运行一个例子时,我得到了 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
Run Code Online (Sandbox Code Playgroud)

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

Isa*_*aac 7

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

如果您没有安装 python-Levenshtein,那么 fuzzywuzzy 根本不使用 Levenshtein。Fuzzywuzzy 的主页在这方面具有误导性,尽管它确实建议安装 python-Levenshtein。

python-Levenshtein 安装有一些问题;我使用了对此 stackoverflow问题的第二个回答来解决它。

如果您没有安装 python-Levenshtein,FuzzyWuzzy 会使用difflib,这对于许多输入值都是相同的,但并非全部。开发人员建议使用 python-Levenshtein。请参阅fuzzywuzzy 的 git 上的此问题,其中包含一个示例案例,其中使用包的结果与不使用包的结果不同。这可能不应该发生,或者至少文档应该清楚地说明这一点,但 FuzzyWuzzy 的开发人员似乎至少对功能感到满意。