python字符串模糊匹配 - FuzzyWuzzy
简介
字符串模糊匹配在很多问题中有实际价值。比如NER或任何词条关联问题,将不规范的词条与标准词条进行链接匹配。在数据量大或包含关系复杂时,使用优秀的工具包可极大提升效率。
FuzzyWuzzy 既是这样一个可进行字符串模糊匹配的python包,根据Levenshtein Distance(也被称为Edit Distance,指两个字符串,有一个转换成另一个所需要的最少操作次数)计算字符串之间的差异。这在序列比对中也是很常用的算法。编辑距离越小,两个字符串相似度越高。
FuzzyWuzzy已更新到0.18.0 版本,目前已更名为TheFuzz,对应0.19.0版本。而目前是使用更多的则是RapidFuzz,运行速度更快,参见另一篇介绍。
安装:pip install fuzzywuzzy 或 pip install thefuzz
FuzzyWuzzy使用
主要有2种用法:
- 比较计算两个字符串的相似度,返回值为0-100,表示相似度比率,使用各类ratio方法;
- 在候选列表中查询与目标字符串最相似的字符串,使用process;
适用的模糊匹配关系如下:
- 完全匹配;
- 子字符串匹配;
- 不考虑子词顺序的匹配;
- 不考虑子词顺序和个数的匹配;
其中前两种方法基于字符串,大小写敏感。后两种方法基于token,大小写不敏感且忽略标点符号。
简单完全匹配(Simple Ratio)
直接使用Levenshtein.ratio, 计算公式:r = (sum - dist) / sum。式中idist是类编辑距离,即编辑距离中的替换需要操作两次,sum是字符串长度和。
>>> from fuzzywuzzy import fuzz,process
>>> fuzz.ratio("this is a test", "this is a test!")
97
>>> fuzz.ratio("这是测试", "这是测验") # (8-2)/8
75
子字符串匹配(Partial Ratio)
先找到最长相似子字符串,再计算其与较短字符串的相似度。返回最相似的子字符串的相似度。
>>> fuzz.partial_ratio("this is a test", "this is a test!")
100
>>> fuzz.partial_ratio("这是测试示例", "这是测验")
75
不考虑词顺序的匹配(Token Sort Ratio)
先调用 process_and_sort(s1, force_ascii, full_process=full_process),将字符串按空格切分,对token按字母顺序排序后合并为新的字符串,再进行相似度计算。
- force_ascii:bool,表示是否转换为ascii码后再进行full_process处理;
- full_process:bool,表示是否去除非字母,非数字(空格保留);否则不进行处理;
该方法要求字符串由多个词组成,如果是中文,需要提前进行分词。
>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
91
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
100
该方法默认partial=False,比较全长字符串,另有partial_token_sort_ratio方法可用,字符串处理后可返回最大子串相似度。
去重子集匹配(Token Set Ratio)
与token_sort_ratio类似,不考虑子词顺序,并且不考虑token数目。先对两个字符串s1,s2根据full_process取值进行full_process处理,之后对token去重,获取交集inters和差集(diff1to2,diff2to1),并排序。然后构建(inters_sort,inters_sort+diff1to2_sort),(inters_sort,inters_sort+diff2to1_sort),(diff1to2_sort,diff2to1_sort)3个比较集合,返回相似度最大值。
>>> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
84
>>> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
100
该方法默认partial=False,比较全长字符串,另有partial_token_set_ratio方法可用,字符串处理后可返回最大子串相似度。
QRatio / WRatio
QRatio(Quick)似乎是为了在其他方法调用时,减少一些重复的字符串操作。
WRatio(Weighted)使用了不同的算法,在使用ratio/partial_ratio获得结果后,根据序列长度进行相似度校正。
- 使用ratio时,如果一个字符串的长度是另一个的1.5倍,使用partial_ratio,并将结果乘以权重0.9。如果长度是另一个的8倍,权重设为0.6。
- 如果使用了partial_ratio,partial_token_sort_ratio 或partial_token_set_ratio,都要根据长度加权处理,权重设为0.95。
Process
从候选列表中,返回与目标字符串最相似的一个或指定个数,可在大规模列表中直接搜索。
默认ratio计算为fuzz.WRatio,可在scorer参数指定相似度计算方法。
>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
>>> process.extract("new york jets", choices, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
>>> process.extractOne("cowboys", choices)
("Dallas Cowboys", 90)
# 指定 scorer
>>> process.extractOne("System of a down - Hypnotize", songs, scorer=fuzz.token_sort_ratio)
参数:
- score_cutoff:设置相似度阈值;
- scorer:指定相似度计算方法;
- limit:设置返回个数;
总结
FuzzyWuzzy提供了快速方便的字符串模糊匹配和搜索方法。一般更有用的是process模块,提供封装好的函数,可以指定fuzz模块中的不同相似度计算方法,可在大规模候选集合中找到与查询字符串最相似的结果。
字符串模糊匹配的核心是两个字符串的相似度计算,详细可参考 python-Levenshtein 库的原理和使用。
参考
FuzzyWuzzy:https://github.com/seatgeek/fuzzywuzzy
TheFuzz:https://github.com/seatgeek/thefuzz
https://medium.com/@laxmi17sarki/string-matching-using-fuzzywuzzy-24be9e85c88d
python字符串模糊匹配 - FuzzyWuzzy相关推荐
- Python字符串模糊匹配库FuzzyWuzzy
Python字符串模糊匹配库FuzzyWuzzy 在计算机科学中,字符串模糊匹配(fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术.换句话说,字符串 ...
- python字符串模糊匹配_NLP教程:用Fuzzywuzzy进行字符串模糊匹配
在计算机科学中,字符串模糊匹配( fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术.换句话说,字符串模糊匹配是一种搜索,即使用户拼错单词或只输入部分 ...
- python字符串模糊匹配 - RapidFuzz
简介 之前已介绍了字符串模糊匹配的应用以及FuzzyWuzzy包的使用.目前使用较多的是运行速度更快的RapidFuzz,从名字即可看出其特点.RapidFuzz是一个使用python和C++编写的字 ...
- python模糊查询_python实现字符串模糊匹配
之前笔者写过一篇文章关于如何做搜索,但那篇文章的角度是从文本相似度角度写的.那种方式是目前发展的趋势,但是真正的搜索特别是网页搜索不可能在大范围的文本之间两两算相似度的.那样搜索引擎的效率会变得特别低 ...
- JS实现字符串模糊匹配
JS实现字符串模糊匹配 var str = "徐娜xuanchengwush数据uc是hulichang" var key = "徐娜数据g" // 模糊匹配 ...
- 原 python实现模糊匹配_使用python中的fuzzywuzzy库进行模糊匹配实例
fuzzywuzzy库是Python中的模糊匹配库,它依据 Levenshtein Distance 算法 计算两个序列之间的差异. Levenshtein Distance 算法,又叫 Edit D ...
- python dataframe 模糊匹配_Python模糊匹配(FuzzyWuzzy) – 保持最佳匹配
我正在尝试模糊匹配两个csv文件,每个文件包含一列相似但不相同的名称. 我的代码到目前为止如下: import pandas as pd from pandas import DataFrame fr ...
- python正则表达式模糊匹配_python 正则表达式
正则表达式的作用:用来匹配字符串 一.字符串方法 字符串提供的方法是完全匹配,不能进行模糊匹配 s = 'hello world' # 字符串提供的方法是完全匹配,不能进行模糊匹配 print(s.f ...
- java 字符串模糊匹配_Java实现伪查询(全匹配+模糊匹配)
Java实现伪查询(全匹配+模糊匹配) 在项目中一直习惯了框架下[springboot+mybatis]的增删改查,然后领导突然给了一个需求,让我先弄一些假数据出来,用于页面的展示,业务啥的也没说,咱 ...
最新文章
- 编写一个头文件,头文件中定义一个宏cube(x)用于求一个数的平方
- mysql 1366 hy000_ERROR 1366 (HY000): Incorrect string value错误解决办法
- python计算某年某月多少天_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...
- c++ 特定容器算法(sort,merge,reverse,remove,unique)
- 不会演讲的你,一开口就输了!
- python raise_python raise 使用方法
- Java高级语法笔记-反射机制(Reflection) (1)
- [bzoj1027][JSOI2007]合金
- 语义分割——DeepLabv3+的学习笔记~
- JSP中9个隐含对象
- js排序算法详解-桶排序
- [报告]HDU 4343 Interval query
- excel sumif 多条件
- C语言:将3*4矩阵中找出行最大,列最小的那个元素。-将低于平均值的人数作为函数返回值,将低于平均分的分数放入below数组中。...
- Gram矩阵简单解释
- 智能硬件开发如何选择低功耗MCU?
- python如何让程序暂停_王者荣耀集祝福linkedin雄攻略
- 元宇宙顶层设计预研项目探讨
- 【Vue3】vue3的keepAlive保存滚动位置
- google android 系统介绍