Python 中 fuzzywuzzy 进行字符串模糊匹配的全过程

 更新时间:2026年01月07日 10:25:29   作者:Looooking  
fuzzywuzzy是一个用于字符串模糊匹配的Python库,基于Levenshtein距离算法,提供多种核心函数来计算字符串相似度,库广泛应用于数据清洗、拼写纠错、文本挖掘和用户输入处理等领域,本文给大家介绍Python中fuzzywuzzy字符串模糊匹配的全过程,感兴趣的朋友跟随小编一起看看吧

fuzzywuzzy 是 Python中 基于 Levenshtein 距离算法的字符串模糊匹配库,提供 fuzz.ratio 、 partial_ratio 、 token_sort_ratio 等核心函数,用于高效计算字符串相似度。该库广泛应用于数据清洗、拼写纠错、文本挖掘和用户输入处理等场景。比如识别相同新闻(有些新闻可能会在不同平台进行发布,标题和内容基本上没太大差异,爬取时需要把这种的识别出来,避免重复处理浪费相应资源)。

依赖安装

pip install fuzzywuzzy python-Levenshtein

依赖安装可以使用清华的 pip 镜像源,不然会很慢,甚至很可能导致安装失败:

pip install fuzzywuzzy python-Levenshtein -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

编辑距离

你可以把编辑距离想象成一场“变脸游戏”:给你两个词,比如“kitten”和“sitting”,你要通过最少的操作次数,把第一个词变成第二个词。允许的操作只有三种:

  • 插入 (Insert):加个字母
  • 删除 (Delete):删个字母
  • 替换 (Substitute):换个字母

比如将 “kitten” 怎么变成 “sitting” ?

  1. k → s (替换)
  2. e → i (替换)
  3. 在末尾加个 g (插入)

总共三步完成,所以它们的编辑距离就是3。这种以“最小改动次数”来衡量相似度的方式,非常符合人类的直觉。改动越少,说明俩词越像;改动越多,就越不像。

相似度得分

fuzzywuzzy 把编辑距离转化成了一个 0 到 100 的直观评分。分数越高,越像。

相似度得分 = (1 - 编辑距离 / 最长字符串长度) × 100

匹配函数

常用的匹配函数一般是下面这些,可能还会有一些衍生出来的变体,但整体分类上没有太大变化。下面示例中,不同依赖包版本的算法可能会稍有差异,运行的结果可能会有不同属于正常现象。

完整比对

ratio() 要求整体上尽量一致,包括顺序,词汇,长度等。它就像一把尺子,从头到尾量一遍两个字符串的相似度。

from fuzzywuzzy import fuzz
standard = "iPhone 15 Pro Max"
variants = [
    "Iphone15ProMax",
    "iphone 15 pro max (256GB)",
    "IPHONE 15 PRO MAX",
]
for v in variants:
    print(f"{v}: {fuzz.ratio(standard.lower(), v.lower())}")
    # Iphone15ProMax: 90
    # iphone 15 pro max (256GB): 81
    # IPHONE 15 PRO MAX: 100

局部比对

partial_ratio() 自动把短的那个字符串当成模板,在长的那个字符串上滑动,挨个位置截取同样长度的子串,然后调用 ratio() 去比,最后返回最高的那个得分。

from fuzzywuzzy import fuzz
query = "北京路"
db_entry = "广东省广州市越秀区北京路步行街"
print(fuzz.ratio(query, db_entry))  # 只有33多分
print(fuzz.partial_ratio(query, db_entry))  # 高达100分!

排序比对

token_sort_ratio() 会先把两个字符串按空格或其他分隔符拆分成词(token),然后排序,最后再调用 ratio()  比对得到结果。

from fuzzywuzzy import fuzz
print(fuzz.token_sort_ratio("红 色 跑车", "跑车 红 色"))  # 输出: 100

排序局部比对 partial_token_sort_ratio()

上面这种比对,如果有额外的干扰项的话,还是会影响最终的得分结果。

from fuzzywuzzy import fuzz
print(fuzz.token_sort_ratio("红 色 跑车", "跑车 红 色 这是 干扰 项"))  # 输出: 60

所以还有变体 partial_token_sort_ratio(),排序后再进行局部比对,就能避免额外项的干扰了

from fuzzywuzzy import fuzz
print(fuzz.token_sort_ratio("红 色 跑车", "跑车 红 色 这是 干扰 项"))  # 输出: 60
print(fuzz.partial_token_sort_ratio("红 色 跑车", "跑车 红 色 这是 干扰 项"))  # 输出: 100

核心比对

token_set_ratio() 会提取两个字符串的所有唯一词汇,然后分成三部分:交集(共同有的词)、A独有、B独有。接着,它会组合这些部分进行多次比对,取最高分。在处理电商商品标题、文章标签等富含冗余信息场景时比较有效。

from fuzzywuzzy import fuzz
title1 = "【旗舰店】Apple iPhone 15 Pro Max 256G 黑色"
title2 = "iPhone15 Pro Max 256GB 手机 黑色"
print(fuzz.token_set_ratio(title1, title2))  # 73

核心局部比对 partial_token_set_ratio()

当然,同排序比对一样,如果两者有额外的干扰项,也会影响最终的得分。

所以还有变体 partial_set_sort_ratio(),核心部分再进行局部比对,就能避免额外项的干扰了

from fuzzywuzzy import fuzz
title1 = "【旗舰店】Apple iPhone 15 Pro Max 256G 黑色"
title2 = "iPhone15 Pro Max 256GB 手机 黑色"
print(fuzz.token_set_ratio(title1, title2))  # 73
print(fuzz.partial_token_set_ratio(title1, title2))  # 100

process

extractOne()

传给它一个查询词和一个候选列表,它会默默帮你把每个候选都比一遍,然后把得分最高的那位和它的分数打包送回来。默认的 full_process 预处理器会帮你做小写转换、去标点等清洗工作。

from fuzzywuzzy import process
choices = [
    "Apple iPhone 14 Pro",
    "iPhone 14 Plus",
    "Samsung Galaxy S23",
    "Google Pixel 7",
]
query = "iphone 14 pro"
best_match, score = process.extractOne(query, choices)
print(f"最佳匹配: {best_match}, 得分: {score}")
# 输出: 最佳匹配: Apple iPhone 14 Pro, 得分: 95

extract()

提取最好的几个,默认是 5 个,会将最佳匹配的几个候选和得分返回来。

from fuzzywuzzy import process
choices = [
    "Apple iPhone 14 Pro",
    "iPhone 14 Plus",
    "Samsung Galaxy S23",
    "Google Pixel 7",
]
query = "iphone 14 pro"
bests_match = process.extract(query, choices, limit=3)
for match, score in bests_match:
    print(f"匹配:'{match}',得分:{score}")
    # 匹配:'Apple iPhone 14 Pro',得分:95
    # 匹配:'iPhone 14 Plus',得分:81
    # 匹配:'Google Pixel 7',得分:35

extractBests()

目前来看和 extract() 差别不大,唯一的区别是可以设置 score_cutoff 的阈值,使得只返回得分高于阈值的选项。

from fuzzywuzzy import process
choices = [
    "Apple iPhone 14 Pro",
    "iPhone 14 Plus",
    "Samsung Galaxy S23",
    "Google Pixel 7",
]
query = "iphone 14 pro"
bests_match = process.extractBests(query, choices, limit=3, score_cutoff=80)
for match, score in bests_match:
    print(f"匹配:'{match}',得分:{score}")
    # 匹配:'Apple iPhone 14 Pro',得分:95
    # 匹配:'iPhone 14 Plus',得分:81

extractWithoutOrder

这个就是上面 extractOne()、extract()、extractBests() 内部所调用的函数,就是按照原始的输入顺序(不会按照评分进行排序)返回每个可选项及其评分。

from fuzzywuzzy import process
choices = [
    "Apple iPhone 14 Pro",
    "iPhone 14 Plus",
    "Samsung Galaxy S23",
    "Google Pixel 7",
]
query = "iphone 14 pro"
bests_match = process.extractWithoutOrder(query, choices)
for match, score in bests_match:
    print(f"匹配:'{match}',得分:{score}")
    # 匹配:'Apple iPhone 14 Pro',得分:95
    # 匹配:'iPhone 14 Plus',得分:81
    # 匹配:'Samsung Galaxy S23',得分:19
    # 匹配:'Google Pixel 7',得分:35

到此这篇关于Python 中 fuzzywuzzy 进行字符串模糊匹配的全过程的文章就介绍到这了,更多相关Python fuzzywuzzy 字符串模糊匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3 解决requests出错重试的问题

    python3 解决requests出错重试的问题

    这篇文章主要介绍了python3 解决requests出错重试的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • python批量复制图片到另一个文件夹

    python批量复制图片到另一个文件夹

    这篇文章主要为大家详细介绍了python批量复制图片到另一个文件夹,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 使用Python合并多个PowerPoint幻灯片的方法

    使用Python合并多个PowerPoint幻灯片的方法

    在日常工作和报告制作中,将多个 PowerPoint 演示文稿合并成一个 是常见需求,通过 Python 和 Spire.Presentation,你可以轻松实现幻灯片的合并,无需依赖 PowerPoint 软件手动操作,本文将演示如何使用 Python 合并两个演示文稿,需要的朋友可以参考下
    2025-11-11
  • Python报错:ModuleNotFoundError的解决办法

    Python报错:ModuleNotFoundError的解决办法

    "ModuleNotFoundError: No module named 'xxx'"这个报错是个非常常见的报错,几乎每个python程序员都遇到过,下面这篇文章主要给大家介绍了关于Python报:ModuleNotFoundError错误的解决办法,需要的朋友可以参考下
    2022-06-06
  • 如何用Python合并lmdb文件

    如何用Python合并lmdb文件

    这篇文章主要为大家详细介绍了如何用Python合并lmdb文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • python selenium.webdriver 爬取政策文件的实现

    python selenium.webdriver 爬取政策文件的实现

    本文主要介绍了python selenium.webdriver 爬取政策文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Numpy 中的矩阵求逆实例

    Numpy 中的矩阵求逆实例

    今天小编就为大家分享一篇Numpy 中的矩阵求逆实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python批量处理txt文件的实例代码

    python批量处理txt文件的实例代码

    这篇文章主要介绍了python批量处理txt文件的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 分享13个好用到起飞的Python技巧

    分享13个好用到起飞的Python技巧

    编程是有技巧的,能写的出程序的人很多,但能写的又快又好是有技巧的,下面这篇文章主要给大家介绍了13个好用到起飞的Python技巧,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Python pyecharts案例超市4年数据可视化分析

    Python pyecharts案例超市4年数据可视化分析

    这篇文章主要介绍了Python pyecharts案例超市4年数据可视化分析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论