fuzzywuzzy是一个非常流行的字符串匹配库。根据该库的文档,它提到它使用Levenshtein距离来计算序列之间的差异。但经过仔细检查,我发现它实际上使用difflib
库中的SequenceMatcher
函数。根据文档,该函数使用拉特克利夫/Obershelp模式匹配算法。
根据定义,Levenshtein distance是将一个字符串转换为另一个字符串所需的最小编辑次数,Ratcliff/Obershelp pattern-matching algorithm计算匹配字符的两倍数除以两个字符串中的字符总数。
当我运行一个例子的时候,我得到了同样的结果,对于序列匹配器和fuzzywuzzy中的比率函数。
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距离?
2条答案
按热度按时间33qvvth11#
使用python-Levenshtein的FuzzyWuzzy.ratio不会返回Levenshtein分数,而是返回Levenshtein比率,即(a+b - LevenshteinScore)/(a+b),其中a和b是被比较的两个字符串的长度。
如果你没有安装python-Levenshtein,那么fuzzywuzzy根本就不会使用Levenshtein。Fuzzywuzzy的主页在这方面是误导性的,尽管它确实建议安装python-Levenshtein。
python-Levenshtein有一些安装问题;我使用this stackoverflow问题的第二个响应来解决它。
如果你没有安装python-Levenshtein,FuzzyWuzzy会使用difflib,这对于很多输入值是一样的,但不是所有的。开发人员推荐使用python-Levenshtein。参见this issue on fuzzywuzzy's git,其中包含一个例子,与没有安装包相比,结果是不同的。这可能不应该发生,或者至少文档应该清楚地说明这一点。但FuzzyWuzzy的开发人员似乎至少满足于功能。
oo7oh9g92#
从FuzzyWuzzyhere的创建者那里找到一篇优秀的文章。
字符串相似性比较两个字符串最简单的方法是使用编辑距离度量。例如,下面两个字符串非常相似:看起来像是一个无害的拼写错误。我们能量化它吗?使用python的difflib,这很容易
看起来这两个字符串有96%是相同的。非常好!我们经常使用这个模式,我们写了一个helper方法来封装它