You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中TheFuzz库ratio函数的计算逻辑求解

TheFuzz库中fuzz.ratio()的计算逻辑

fuzz.ratio()基于Levenshtein编辑距离计算字符串相似度(若安装python-Levenshtein库则用其高效实现,否则用纯Python版编辑距离),核心公式如下:

相似度百分比 = round(100 * (len(s1) + len(s2) - 编辑距离(s1, s2)) / (len(s1) + len(s2)))

公式说明

  • 编辑距离:将s1转换为s2所需的最少单字符操作次数(包含插入、删除、替换)。
  • 最终结果会四舍五入为整数,取值范围在0-100之间。

标准案例验证

针对你给出的第一个示例:

from thefuzz import fuzz
a = 'house'  # 长度5
b = 'mouse'  # 长度5
print(fuzz.ratio(a, b))  # 实际返回90,而非你提到的80

计算过程:

  1. house与mouse的编辑距离为1(仅需替换首字符h为m)。
  2. 代入公式:(5+5-1)/(5+5) = 0.9 → 0.9*100 = 90,四舍五入后得90。

你提到的返回80更符合fuzz.partial_ratio()的结果(该函数取较短字符串在较长字符串中的最佳子串匹配相似度),建议检查是否误调用了其他函数。


第二个案例的正确计算

若将b改为'mousee'(长度6):

  1. house与mousee的编辑距离为2(替换h为m + 在末尾插入e)。
  2. 代入公式:(5+6-2)/(5+6) ≈ 0.818 → 0.818*100 ≈ 82,四舍五入后返回82,而非你提到的73。

若返回73,可能的原因:

  • 字符串包含不可见字符(如空格、换行符),导致长度或编辑距离计算偏差。
  • 误调用了其他模糊匹配函数(如fuzz.token_sort_ratio或fuzz.token_set_ratio)。
  • 使用了旧版本的TheFuzz/FuzzyWuzzy,其逻辑与当前版本不一致。

额外说明

  • 默认情况下,ratio()会先预处理输入字符串(转小写、去除非字母数字字符),若需禁用预处理,可传入processor=None参数:fuzz.ratio(a, b, processor=None)。
  • 未安装python-Levenshtein时,TheFuzz会使用纯Python实现编辑距离,结果一致但性能较差。

内容的提问来源于stack exchange,提问作者Iñaki Baglivo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:42