简介

之前已介绍了字符串模糊匹配的应用以及FuzzyWuzzy包的使用。目前使用较多的是运行速度更快的RapidFuzz,从名字即可看出其特点。RapidFuzz是一个使用python和C++编写的字符串匹配模块,使用了与FuzzyWuzzy相同的字符串相似度计算方法。RapidFuzz与FuzzyWuzzy的主要区别如下:

  • RapidFuzz是MIT licensed,可在任何地方使用,而FuzzyWuzzy需要遵守GPL license;
  • RapidFuzz提供更多字符串相似度计算方式,比如 hamming,jaro_winkler;
  • 大部分使用C++编写,在此基础上有很多算法优化使得匹配速度更快,并且结果一致;
  • 解决了FuzzyWuzzy中partial_ratio 方法的一些bug;

安装:pip install rapidfuzz

RapidFuzz基本使用

使用方法与FuzzyWuzzy 基本一致,有4种常用的相似度计算函数scorer,其运行速度远超FuzzyWuzzy对应函数,如下图所示。同样有process模块用于字符串与列表的比较,且其效率远比单独使用scorers函数逐个比较更快速。

> from rapidfuzz import fuzz,process
> fuzz.ratio("this is a test", "this is a test!")
96.55
> fuzz.partial_ratio("this is a test", "this is a test!")
100.0
> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
100.0
> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
100.0
> process.extractOne("cowboys", choices, scorer=fuzz.WRatio)
> process.extract("new york jets", choices, scorer=fuzz.WRatio, limit=2)

模块详细介绍

有些模块和方法在较老版本中不可用。以下以最新2.8.0为例介绍。主要有:

  • process
  • distance
  • fuzz
  • string_metric

process

process模块主要用在字符串列表choices中查找最相似字符串或计算相似度。主要包括4个方法:

  1. process.cdist
    process.cdist(queries, choices, *, scorer=<cyfunction ratio>, processor=None, score_cutoff=None, dtype=None, workers=1, **kwargs)
    查询为字符串列表,计算两个列表中字符串的相似度。
> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
> process.cdist(["new york jets","new york"], choices,scorer=fuzz.token_set_ratio)
array([[28.571428, 76.92308 , 64.28571 , 14.814815],[26.086956, 57.142857, 60.869564, 18.181818]], dtype=float32)
  1. process.extract
    process.extract(query, choices, *, scorer=<cyfunction WRatio>, processor=<cyfunction default_process>, limit=5, score_cutoff=None, **kwargs)
    查询为字符串,返回按照相似度排序的结果。返回列表的元素类型是含有3个元素的元组。第一个值为choices中元素;第二个值一般是相似度,但取值根据scorer不同形式上会有不同(当scorer 为string_metric.levenshtein时,0表示完美匹配);第3个元素是列表索引或者字典的key。
> process.extract("new york jets", choices,scorer=fuzz.token_set_ratio)
[('New York Jets', 100.0, 1),('New York Giants', 78.57142857142857, 2),('Atlanta Falcons', 28.57142857142857, 0),('Dallas Cowboys', 14.81481481481481, 3)]
  1. process.extract_iter
    process.extract_iter(query, choices, *, scorer=<cyfunction WRatio>, processor=<cyfunction default_process>, score_cutoff=None, **kwargs)
    查询为字符串,返回迭代器,此时并未排序,顺序与原choices一致,结果形式同样是元组。
  2. process.extractOn
    返回最佳匹配结果。

distance

包含不同的距离度量函数。使用rapidfuzz内置的距离函数比python-Levenshtein要快很多,建议使用内置函数。

  1. Levenshtein
    Levenshtein距离(编辑距离)用于测量两个字符串s1和s2之间的差异。 定义为将s1转换为s2所需的插入、删除或替换操作的最小次数。 该函数实现支持对插入/删除/替换使用不同的权重。 均匀Levenshtein距离指的是weights=(1,1,1),Indel距离指的是weights=(1,1,2)。 所有其他的权重都可以被称为是Levenshtein距离。

    • distance
      Levenshtein.distance(s1, s2, *, weights=(1, 1, 1), processor=None, score_cutoff=None)
      计算并返回编辑操作次数。
    • normalized_distance
      计算并返回标准化后的编辑距离,计算为distance / max,max 是两个字符串之间最大的编辑距离。取值为[1,0],值越小,越相似。
    • similarity
    • normalized_similarity
      计算为 1 - normalized_distance。取值[0,1],值越大,越相似。
  2. Indel
    计算将s1替换为s2所需的插入和删除的最小次数。 等价于Levenshtein距离中替换操作的权重设为2。 4种可用的方法与Levenshtein完全一致。在新版本中新增了Damerau Levenshtein,似乎与Indel的计算方法相同。
  3. Hamming
    汉明距离为两个等长字符串相同位置上字符不同的数目计数,要求两个字符串必须长度相同。同样有4个方法:

    • distance
      原始Hamming距离
    • normalized_distance
      distance / (len1 + len2)。取值为[1,0],值越小,越相似。
    • similarity
      len1 - distance。
    • normalized_similarity
      1 - normalized_distance。取值为[0,1],值越大,越相似。
  4. Jaro
    distance.Jaro.similarity(s1, s2, *, processor=None, score_cutoff=None)
    Jaro distance也是一种字符串相似度度量,计算略复杂,可参考其他资料。
  5. JaroWinkler
    istance.JaroWinkler.similarity(s1, s2, *, prefix_weight=0.1, processor=None, score_cutoff=None)
    JaroWinkler是Jaro distance的一种变体。JaroWinkler距离越小,两字符串相似度越高。similarity取值为[0,1],值越大,越相似。
    计算公式:SimwSim_wSimw​=SimjSim_jSimj​ + (lp(1-SimjSim_jSimj​)),SimjSim_jSimj​是Jaro相似度,l是字符串公共前缀长度,最大取值为4,p是常量因子。JaroWinkler更适合前缀匹配。

fuzz

除了在FuzzyWuzzy中提到的几个函数,另有token_ratio和partial_token_ratio方法可用。
token_ratio返回 token_set_ratio and token_sort_ratio二者值最大的结果,运行速度比分别调用再比较要快。
partial_token_ratio返回 partial_token_set_ratio and partial_token_sort_ratio 二者值最大的结果,运行速度比分别调用再比较要快很多。

string_metric

主要功能与distance模块基本一致。提供以下几种距离,可用于process中的指定scorer参数。

  • levenshtein
  • normalized_levenshtein
  • hamming
  • normalized_hamming
  • jaro_similarity
  • jaro_winkler_similarity

总结

  • rapidfuzz因其速度快而被更多使用。
  • process模块从候选列表中计算最相似字符串结果,相比于fuzz中函数单独计算而使用更多。distance更多作为距离度量方式,而string_metric中更多作为scorer参数指定。
  • 字符串(模糊)匹配计算在任何形式的词条关联中有重要作用,主要是不同形式的词条与标准化词条关联匹配,如实体连接等。

参考

https://github.com/maxbachmann/rapidfuzz
https://maxbachmann.github.io/RapidFuzz/Usage/index.html

python字符串模糊匹配 - RapidFuzz相关推荐

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

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

  2. python字符串模糊匹配 - FuzzyWuzzy

    简介 字符串模糊匹配在很多问题中有实际价值.比如NER或任何词条关联问题,将不规范的词条与标准词条进行链接匹配.在数据量大或包含关系复杂时,使用优秀的工具包可极大提升效率. FuzzyWuzzy 既是 ...

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

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

  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正则表达式模糊匹配_python 正则表达式

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

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

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

  9. java 字符串模糊匹配

    java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现. Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创 ...

最新文章

  1. AWS S3云存储服务
  2. MyBatis 注释
  3. 【短视频SDK】Android如何使用硬编硬解?
  4. python mysql模块 pip_MySQLpython模块不能与Pip一起在windows中安装
  5. Jquery获取DOM绑定事件
  6. js list删除指定元素_vue.js
  7. python三引号注释_python使用三引号来注释的具体原因?
  8. 论文浅尝 | 对于知识图谱嵌入表示的几何形状理解
  9. java 抽象类和接口2--什么时候用接口什么时候用抽象类
  10. python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...
  11. 基于ionic4、cordova搭建android开发环境
  12. Python 基础数据类型
  13. uni-app引入阿里云矢量图标库
  14. 好的医疗器械管理软件应该具备哪些功能?
  15. flash加载脚本文件导致IE脚本错误 ,行53 ,字符3,缺少对象,代码0 , 怎么解决?
  16. @ComponentScan注解
  17. HDU 6194 string string string
  18. 企业微信聊天工具栏怎么开启?如何调整位置?
  19. android sdk救黑砖,[原创]关于手机救软砖(soft brick)的一点总结
  20. 第07课:技术精进之道

热门文章

  1. 数据库不断有新数据插入, 导致分页查询数据重复的问题
  2. TS | typescript与JavaScript的异同
  3. 长方体体积 java程序_Java技术解决 长方体体积 问题
  4. ultimaker论坛_Ultimaker的故事:具有开源DNA的3D打印机
  5. Windows 上帝模式「完全控制面板」的介绍和使用
  6. matlab变量与常量、数据类型
  7. 二手车数据分析(Python)
  8. Unity热更新系列之一: bundle打包和打包策略
  9. DayDreamer's Blog Qt资料整理~待续
  10. 随机变量的特征函数及应用