news 2026/4/15 6:50:48

Python 之 fuzzywuzzy 进行字符串模糊匹配

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

核心比对

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

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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 23:33:11

学长亲荐10个AI论文网站,继续教育学生轻松搞定毕业论文!

学长亲荐10个AI论文网站,继续教育学生轻松搞定毕业论文! AI 工具如何改变论文写作的未来 在当前继续教育学生面临毕业论文压力日益增大的背景下,AI 工具正逐渐成为不可或缺的得力助手。从内容生成到降重处理,再到结构优化&#xf…

作者头像 李华
网站建设 2026/3/27 17:44:02

js获取本地视频流并播放

直接上代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

作者头像 李华
网站建设 2026/4/8 8:55:32

wazuh-主动拉黑

拉黑命令 cd /var/ossec/active-response/bin ls default-firewall-drop firewall-drop ipfw npf restart-wazuh disable-account host-deny kaspersky pf route-null firewalld-drop ip-customblock kaspersky.py re…

作者头像 李华
网站建设 2026/4/11 4:00:02

ue4 我的ai要用到的一下方法汇总 + ue的ai编程助手

Epic Developer Assistant For Unreal Engine | Epic Developer Community 不懂就问 import unrealfolder_path "/Game/Characters/MainChar/W/Meshes" print(f"正在扫描文件夹: {folder_path}")asset_registry unreal.AssetRegistryHelpers.get_asset_…

作者头像 李华
网站建设 2026/4/1 8:41:10

DAB加ai加蓝牙音箱有市场吗

简短结论&#xff1a;DAB AI 蓝牙音箱是有市场潜力的&#xff0c;但定位和目标用户很关键。 下面我分几个维度分析这个产品组合的市场机会&#xff1a; &#x1f4c8; 1. DAB/DAB 市场在增长 ✔️ DAB&#xff08;数字音频广播&#xff09;是全球多个国家正在推广的数字无线…

作者头像 李华