Python轮子:thefuzz 模糊字符串匹配

原文链接: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为模糊匹配提供高效解决方案:

  • 支持多种相似度计算算法
  • 提供列表数据快速查询接口
  • 可自定义预处理流程
  • 处理中英文混合场景

注意事项:

  • 长文本比较建议使用部分匹配方法
  • 阈值设置需根据场景调整

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注