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
相关产品推荐
相关产品推荐

