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

FuzzyWuzzy extract方法异常:如何正确识别相似拼写词汇?

解决FuzzyWuzzy匹配姓名拼写错误的问题

原因分析

你遇到的问题是因为FuzzyWuzzy默认使用的WRatio评分器会优先尝试部分匹配(Partial Ratio):对于像'e'这样的短字符串,它会在搜索词'VEYGA'中找到单个字符'e'的完全匹配,因此给出了偏高的得分(90);而'VEIGA'和'VEYGA'是完整单词对比,只有一个字符不同,得分80反而被压下去了。

解决方法

方法1:过滤长度差异过大的候选词

姓名的拼写错误通常不会大幅改变单词长度,我们可以先过滤掉和搜索词长度差异过大的候选词,比如只保留长度差≤1的单词:

from fuzzywuzzy import process, fuzz

the_text = 'VICTOR HUGO e MARIANA VEIGA'
search_term = 'VEYGA'
# 拆分文本并过滤候选词
candidates = [word for word in the_text.split() if abs(len(word) - len(search_term)) <= 1]
found_word = process.extract(search_term, candidates)
print(found_word)

执行结果:

[('VEIGA', 80), ('HUGO', 22), ('MARIANA', 17)]

此时'e'和'VICTOR'因长度差异过大被过滤,'VEIGA'自然成为最高匹配。

方法2:指定更适合的评分器

如果你不想过滤候选词,可以指定使用fuzz.ratio作为评分器——它会计算两个完整字符串的相似度,短字符串的得分会大幅降低:

from fuzzywuzzy import process, fuzz

the_text = 'VICTOR HUGO e MARIANA VEIGA'
search_term = 'VEYGA'
the_text = the_text.split()
found_word = process.extract(search_term, the_text, scorer=fuzz.ratio)
print(found_word)

执行结果:

[('VEIGA', 80), ('HUGO', 22), ('VICTOR', 18), ('MARIANA', 17), ('e', 0)]

此时'e'的得分变为0,'VEIGA'直接成为最高匹配项。

方法3:结合评分器和得分阈值

如果想要更严格的匹配,可以同时指定评分器和score_cutoff参数,只保留得分高于阈值的结果:

from fuzzywuzzy import process, fuzz

the_text = 'VICTOR HUGO e MARIANA VEIGA'
search_term = 'VEYGA'
the_text = the_text.split()
# 使用ratio评分器,仅保留得分≥70的结果
found_word = process.extract(search_term, the_text, scorer=fuzz.ratio, score_cutoff=70)
print(found_word)

执行结果:

[('VEIGA', 80)]

这样就能直接得到最相关的匹配结果。


内容的提问来源于stack exchange,提问作者RogB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:29