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
计算过程:
house与mouse的编辑距离为1(仅需替换首字符h为m)。- 代入公式:
(5+5-1)/(5+5) = 0.9→0.9*100 = 90,四舍五入后得90。
你提到的返回80更符合fuzz.partial_ratio()的结果(该函数取较短字符串在较长字符串中的最佳子串匹配相似度),建议检查是否误调用了其他函数。
第二个案例的正确计算
若将b改为'mousee'(长度6):
house与mousee的编辑距离为2(替换h为m+ 在末尾插入e)。- 代入公式:
(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
相关产品推荐
相关产品推荐

