原文链接:http://www.juzicode.com/python-module-thefuzz
thefuzz(原fuzzywuzzy)是Python的模糊字符串匹配库,基于Levenshtein距离算法,提供多种相似度计算方法,适用于数据清洗、拼写纠正和实体匹配等场景。
应用场景
- 数据清洗与标准化
- 搜索引擎查询建议
- 客户信息匹配
- 商品名称消歧
- 地址相似度分析
- OCR结果修正
安装与导入
# juzicode.com/VX公众号:juzicode
pip install thefuzz
from thefuzz import fuzz, process
基本用法
1)简单比例匹配
计算两个字符串的相似度百分比,基于编辑距离算法。ratio返回0-100的分数,完全匹配为100。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
str1 = "桔子代码"
str2 = "橘子代码"
similarity = fuzz.ratio(str1, str2)
print(f"相似度: {similarity}%")
运行结果:
相似度: 75%
2 )部分字符串匹配
处理子字符串匹配场景,适合比较长文本中的片段。partial_ratio对部分匹配更敏感。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
text = "Python编程教学"
query = "编程教"
score = fuzz.partial_ratio(query, text)
print(f"部分匹配分数: {score}")
运行结果:
部分匹配分数: 100
3)词序无关匹配
忽略单词顺序的比较方法,适合处理相同词汇不同排列的情况。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
str_a = "桔子code juzicode.com 桔子菌"
str_b = "桔子菌 桔子code juzicode.com"
score = fuzz.token_sort_ratio(str_a, str_b)
print(f"词序无关分数: {score}")
运行结果:
词序无关分数: 100
4)列表最佳匹配查询
从列表中查找与查询字符串最相似的项,process.extract返回排序后的匹配结果。
# juzicode.com/VX公众号:juzicode
from thefuzz import process
choices = ["北京大学", "北京交通大学", "清华大学", "南京大学"]
query = "北京交大"
results = process.extract(query, choices)
print("最佳匹配:", results[0][0])
运行结果:
最佳匹配: 北京交通大学
5)加权词集匹配
使用token_set_ratio处理重复词汇,更适合比较包含重复词的字符串。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
str1 = "Python Python 教程"
str2 = "Python 基础教程"
score = fuzz.token_set_ratio(str1, str2)
print(f"加权分数: {score}")
运行结果:
加权分数: 90
6)自定义处理器
预处理字符串提升匹配精度,如移除标点、统一大小写等。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
def preprocess(text):
return text.lower().replace(" ", "").strip()
score = fuzz.ratio(
preprocess("Hello-World"),
preprocess("hello world")
)
print(f"处理后相似度: {score}")
运行结果:
处理后相似度: 95
7)快速最佳匹配
使用process.extractOne快速获取最佳匹配项,适合处理大型数据集。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
from thefuzz import process
cities = ["上海市", "北京市", "广州市", "深圳市"]
match = process.extractOne("上海", cities)
print(f"匹配结果: {match[0]} (置信度: {match[1]}%)")
运行结果:
匹配结果: 上海市 (置信度: 90%)
8)阈值筛选匹配
设置最低相似度阈值,过滤低质量匹配结果。
# juzicode.com/VX公众号:juzicode
from thefuzz import fuzz
from thefuzz import process
products = ["iPhone13", "iPad Pro", "iPod nano", "MacBook Air"]
matches = process.extractBests("ipad", products, score_cutoff=80)
print("有效匹配:", [m[0] for m in matches])
运行结果:
有效匹配: ['iPad Pro']
总结
TheFuzz为模糊匹配提供高效解决方案:
- 支持多种相似度计算算法
- 提供列表数据快速查询接口
- 可自定义预处理流程
- 处理中英文混合场景
注意事项:
- 长文本比较建议使用部分匹配方法
- 阈值设置需根据场景调整