简介

字符串模糊匹配在很多问题中有实际价值。比如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相关推荐

  1. Python字符串模糊匹配库FuzzyWuzzy

    Python字符串模糊匹配库FuzzyWuzzy 在计算机科学中,字符串模糊匹配(fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术.换句话说,字符串 ...

  2. python字符串模糊匹配_NLP教程:用Fuzzywuzzy进行字符串模糊匹配

    在计算机科学中,字符串模糊匹配( fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术.换句话说,字符串模糊匹配是一种搜索,即使用户拼错单词或只输入部分 ...

  3. python字符串模糊匹配 - RapidFuzz

    简介 之前已介绍了字符串模糊匹配的应用以及FuzzyWuzzy包的使用.目前使用较多的是运行速度更快的RapidFuzz,从名字即可看出其特点.RapidFuzz是一个使用python和C++编写的字 ...

  4. python模糊查询_python实现字符串模糊匹配

    之前笔者写过一篇文章关于如何做搜索,但那篇文章的角度是从文本相似度角度写的.那种方式是目前发展的趋势,但是真正的搜索特别是网页搜索不可能在大范围的文本之间两两算相似度的.那样搜索引擎的效率会变得特别低 ...

  5. JS实现字符串模糊匹配

    JS实现字符串模糊匹配 var str = "徐娜xuanchengwush数据uc是hulichang" var key = "徐娜数据g" // 模糊匹配 ...

  6. 原 python实现模糊匹配_使用python中的fuzzywuzzy库进行模糊匹配实例

    fuzzywuzzy库是Python中的模糊匹配库,它依据 Levenshtein Distance 算法 计算两个序列之间的差异. Levenshtein Distance 算法,又叫 Edit D ...

  7. python dataframe 模糊匹配_Python模糊匹配(FuzzyWuzzy) – 保持最佳匹配

    我正在尝试模糊匹配两个csv文件,每个文件包含一列相似但不相同的名称. 我的代码到目前为止如下: import pandas as pd from pandas import DataFrame fr ...

  8. python正则表达式模糊匹配_python 正则表达式

    正则表达式的作用:用来匹配字符串 一.字符串方法 字符串提供的方法是完全匹配,不能进行模糊匹配 s = 'hello world' # 字符串提供的方法是完全匹配,不能进行模糊匹配 print(s.f ...

  9. java 字符串模糊匹配_Java实现伪查询(全匹配+模糊匹配)

    Java实现伪查询(全匹配+模糊匹配) 在项目中一直习惯了框架下[springboot+mybatis]的增删改查,然后领导突然给了一个需求,让我先弄一些假数据出来,用于页面的展示,业务啥的也没说,咱 ...

最新文章

  1. 编写一个头文件,头文件中定义一个宏cube(x)用于求一个数的平方
  2. mysql 1366 hy000_ERROR 1366 (HY000): Incorrect string value错误解决办法
  3. python计算某年某月多少天_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...
  4. c++ 特定容器算法(sort,merge,reverse,remove,unique)
  5. 不会演讲的你,一开口就输了!
  6. python raise_python raise 使用方法
  7. Java高级语法笔记-反射机制(Reflection) (1)
  8. [bzoj1027][JSOI2007]合金
  9. 语义分割——DeepLabv3+的学习笔记~
  10. JSP中9个隐含对象
  11. js排序算法详解-桶排序
  12. [报告]HDU 4343 Interval query
  13. excel sumif 多条件
  14. C语言:将3*4矩阵中找出行最大,列最小的那个元素。-将低于平均值的人数作为函数返回值,将低于平均分的分数放入below数组中。...
  15. Gram矩阵简单解释
  16. 智能硬件开发如何选择低功耗MCU?
  17. python如何让程序暂停_王者荣耀集祝福linkedin雄攻略
  18. 元宇宙顶层设计预研项目探讨
  19. 【Vue3】vue3的keepAlive保存滚动位置
  20. google android 系统介绍

热门文章

  1. P1255 数楼梯(笔记侵删)(C语言)
  2. JS模块化说明视频-张晓飞-专题视频课程
  3. cocos2d-xnbsp;图片纹理优…
  4. 2021网易互联网秋招内推批前端笔试
  5. Codeforces 855B - Marvolo Gaunt's Ring
  6. matlab 3维投影,matlab - 如何计算3维投影的面积? - 堆栈内存溢出
  7. 适合小白入门的随机森林介绍
  8. 山西工程技术学院计算机专业在哪个校区,山西工程技术学院有几个校区及校区地址...
  9. MySQL Ⅳ 查询进阶
  10. MUR160RLG说明