Python中使用 thefuzz 实现模糊字符串匹配与提取

小满
小满
发布时间:2026-10-11 | 3人浏览过
原创

讲解如何借助Python的thefuzz库解决名称拼写不一、格式混乱带来的字符串匹配难题。涵盖环境配置、fuzz模块四种核心相似度算法的适用场景,以及process模块在列表批量提取与自定义打分器中的应用,附完整可运行代码与性能优化建议。

环境配置与导入

Thetfuzz是早期FuzzyWuzzy的现代维护版本,底层依赖Python-Levenshtein以提升运算速度。建议在项目初始化前完成依赖安装:

pip install thefuzz
pip install python-Levenshtein

若安装过程中因编译环境问题报错,可尝试预编译包回退方案:

pip install python-Levenshtein-wheels

安装完成后,按需导入核心模块:

from thefuzz import fuzz, process

核心比对算法与适用场景

传统等号比较仅返回布尔值,无法处理大小写、空格或轻微拼写差异。thefuzz通过Levenshtein距离度量将相似度转化为0~100的数值指标,提供以下四种标准函数:

第1步:计算基础字符相似度

入口为`fuzz.ratio()`,逐字符比对两个字符串的整体相似度。适用于长度相近且语序完全一致的对比。

ST1 = 'Just a test'
ST2 = 'just a test'
print(fuzz.ratio(ST1, ST2))  # 输出: 91

仅首字母大小写差异即可使完美匹配降至91分。当替换整句内容时,分数会随重叠部分减少而下降:

ST1 = 'This is a test string for test'
ST2 = 'There are some test string for testing'
print(fuzz.ratio(ST1, ST2))  # 输出: 75

第2步:执行子串部分匹配

入口为`fuzz.partial_ratio()`。当长文本包含完整的短文本片段时,该函数直接返回满分,忽略尾部多余词汇。

ST1 = 'There are test'
ST2 = 'There are test string for testing'
print(fuzz.partial_ratio(ST1, ST2))  # 输出: 100

第3步:处理词序与重复差异

当字符串包含相同单词但排列顺序不同,或存在大量重复词汇时,需切换至分词集合比对函数:

CASE_1 = 'This generation rules the nation'
CASE_2 = 'Rules the nation This generation'

此时使用`fuzz.token_sort_ratio()`自动对单词按字母排序后再比对,无视原始位置差异:

print(fuzz.token_sort_ratio(CASE_1, CASE_2))  # 输出: 100

若连续出现重复单词导致干扰,启用`fuzz.token_set_ratio()`将重复词去重为集合后进行比对:

CASE_1 = 'This generation'
CASE_2 = 'This This generation generation generation generation'
print(fuzz.token_set_ratio(CASE_1, CASE_2))  # 输出: 100

使用 process 模块进行批量模糊提取

面对海量标签、商品名或知识库条目时,手动遍历评分效率低下。`process`模块提供向量化提取能力,可直接返回Top N匹配项及对应分值。

第4步:调用 extract 批量提取

基础用法需提供目标查询串、候选列表及限制返回数量:

Diff_items = [
    'Programming language', 'Native language', 'React framework',
    'People stuff', 'This generation', 'Coding and stuff'
]
print(process.extract('language', Diff_items, limit=2))

输出将按相似度降序排列元组列表。需注意,该逻辑基于字面距离而非语义理解,因此未直接包含"programing"的候选项仍可能因拼写接近获得高权重。

第5步:传入自定义 scorer 优化排序

默认提取使用`fuzz.ratio`作为打分器。若业务场景强调词序独立性与集合特征,可在调用时注入其他比对函数:

LISt_OF_Books = [
    'The python everyone volume 1 - Beginner',
    'The python everyone volume 2 - Machine Learning',
    'The python everyone volume 3 - Data Science',
    'Different Data Science book',
    'Python algorithms and data structures'
]
print(process.extract(
    'python Data Science',
    LISt_OF_Books,
    limit=3,
    scorer=fuzz.token_sort_ratio
))

自定义打分器后,系统将优先召回标题结构松散但核心关键词重合度高的条目,显著提升检索命中率。

性能调优与注意事项

  • 单次调用开销极低,但在万级数据集上仍建议使用`token_set_ratio`避免冗余字符拖慢计算。
  • 函数返回值均为整数型相似度评分,实际过滤时需根据业务容忍度设定阈值(通常≥60视为有效关联)。
  • 该库不涉及自然语言理解,专业术语缩写、同义词替换或语音转写误差需结合词向量模型或正则预处理辅助。

以上就是Python中使用 thefuzz 实现模糊字符串匹配的详细内容,更多关于Python文本处理与数据清洗的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表