【问题标题】:String Matching using fuzzywuzzy- is it using Levenshtein distance or the Ratcliff/Obershelp pattern-matching algorithm?使用fuzzywuzzy 进行字符串匹配——是使用Levenshtein 距离还是Ratcliff/Obershelp 模式匹配算法?
【发布时间】:2019-05-27 13:15:43
【问题描述】:

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

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

当我运行一个示例时,我得到的 SequenceMatcher 和模糊模糊中的比率函数的结果相同。

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 距离的?

【问题讨论】:

  • 文档可能已经过时了。当然最好的提问方式是在 github 站点上创建问题。

标签: python string-matching levenshtein-distance


【解决方案1】:

FuzzyWuzzy.ratio using python-Levenshtein 不返回 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 的开发人员似乎至少对功能感到满意。

【讨论】:

  • 我也有同样的看法,认为主页具有误导性。我也尝试在有和没有 python-Levenshtein 包的情况下找到匹配分数,结果是一样的。可能是软件包只会加快计算速度。结果是一样的。
  • 检查我的最终链接 - 它提供了一个结果不同的示例。我已经在自己的系统上验证了这一点。
  • 只是想知道为什么结果应该不同。这是否意味着有和没有包裹的分数会完全不同。通常情况并非如此。
  • 完全不同可能言过其实。在某些情况下,两者是不同的。不过我同意这不应该发生,但 FuzzyWuzzy 的开发人员似乎很满足;他们关闭了这个问题,就好像它没有改变任何东西就解决了一样。
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 2020-11-11
  • 2012-05-11
  • 2014-12-30
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多