[Python] 基于RapidFuzz库实现字符串模糊匹配
RapidFuzz是一个用于快速字符串模糊匹配的Python库,它能够快速计算两个字符串之间的相似度,并提供与Fuzzywuzzy(已停用)和TheFuzz(Fuzzywuzzy的升级版)类似的接口。RapidFuzz和TheFuzz功能相似,只是提供的接口不同。RapidFuzz和TheFuzz安装指令如下:
pip install rapidfuzz
pip install thefuzz
RapidFuzz库是一个经过高度优化的C++实现,为用户提供了以Python编写代码的速度和灵活性。该库还提供了一个与TheFuzz和Fuzzywuzzy中所有算法兼容的API,因此强烈推荐使用RapidFuzz库进行文本模糊匹配。
# 查看rapidfuzz版本
import rapidfuzz
rapidfuzz.__version__
'3.4.0'
# 查看thefuzz版本
import thefuzz
thefuzz.__version__
'0.20.0'
1 基础使用
在RapidFuzz3版本中,默认情况下不会对字符串进行预处理(删除所有非字母数字字符、修剪空白、将所有字符转换为小写)。这意味着,当比较具有相同字符但英文大小写不同的两个字符串时,它们的相似性分值可能不同。
1.1 字符串相似度对比
RapidFuzz提供了多种方法来比较字符串之间的相似度,包括ratio、partial_ratio、partial_ratio_alignment、token_set_ratio、partial_token_set_ratio、token_sort_ratio、partial_token_sort_ratio、token_ratio、partial_token_ratio、WRatio和QRatio。
下面是对这些方法进行简要对比的说明:
- ratio:计算两个字符串之间的相似度得分,返回一个介于0和100之间的浮点数。这个方法使用了Levenshtein距离来测量字符串之间的编辑距离。
- partial_ratio:与ratio类似,但它只考虑其中一个字符串是否是另一个字符串的子集。
- partial_ratio_alignment:计算两个字符串之间的相似度得分,并返回对齐后的字符串。该方法使用了Levenshtein距离和动态规划算法来对齐字符串。
- token_set_ratio:将两个字符串拆分为单词或标记,并计算它们之间的相似度得分。它使用了集合操作和ratio方法来计算相似度。
- partial_token_set_ratio:与token_set_ratio类似,但它只考虑其中一个字符串是否是另一个字符串的子集。
- token_sort_ratio:将两个字符串拆分为单词或标记,并按字母顺序对它们进行排序,然后计算它们之间的相似度得分。它使用了排序和ratio方法来计算相似度。
- partial_token_sort_ratio:与token_sort_ratio类似,但它只考虑其中一个字符串是否是另一个字符串的子集。
- token_ratio:将两个字符串拆分为单词或标记,并计算它们之间的相似度得分。它使用了ratio方法来计算相似度。
- partial_token_ratio:与token_ratio类似,但它只考虑其中一个字符串是否是另一个字符串的子集。
- WRatio:使用了不同的权重来计算字符串之间的相似度得分。
- QRatio:一个更快但不太准确的版本的ratio方法。
这些方法提供了不同的计算方式和适用场景,具体使用哪种方法取决于需求和数据特点,一般从ratio、partial_ratio、token_set_ratio、token_sort_ratio和token_ratio之间选择。TheFuzz模块也提供类似的接口。
# 导入模块
from rapidfuzz import fuzz
# ratio
fuzz.ratio("Hello hello 世界", "hello 世界!")
69.56521739130434
# partial_ratio
fuzz.partial_ratio("Hello hello 世界", "hello 世界!")
94.11764705882352
# partial_ratio_alignment
fuzz.partial_ratio_alignment("Hello hello 世界", "hello 世界!")
ScoreAlignment(score=94.11764705882352, src_start=6, src_end=14, dest_start=0, dest_end=9)
# token_set_ratio
fuzz.token_set_ratio("Hello hello 世界", "hello 世界!")
71.42857142857143
# partial_token_set_ratio
fuzz.partial_token_set_ratio("Hello hello 世界", "hello 世界!")
100.0
# token_sort_ratio
fuzz.token_sort_ratio("Hello hello 世界", "hello 世界!")
69.56521739130434
# partial_token_sort_ratio
fuzz.partial_token_sort_ratio("Hello hello 世界", "hello 世界!")
94.11764705882352
# token_ratio
fuzz.token_ratio("Hello hello 世界", "hello 世界!")
71.42857142857143
# partial_token_ratio
fuzz.partial_token_ratio("Hello hello 世界", "hello 世界!")
100.0
# WRatio
fuzz.WRatio("Hello hello 世界", "hello 世界!")
85.5
# QRatio
fuzz.QRatio("Hello hello 世界", "hello 世界!")
69.56521739130434
1.2 字符串搜索
RapidFuzz的extract模块提供了一种基于模糊匹配的字符串集合匹配方法,可以根据目标字符串以及一个或多个字符串集合,并返回与查询字符串匹配度高的多个候选字符串。extractOne模块也是基于模糊匹配的字符串匹配方法,但它只返回与目标字符串最相似的字符串,而不是一组匹配结果。TheFuzz模块也提供类似的接口。
from rapidfuzz import process
query = "世界 Hello"
choices = ["你好世界", "hello 世界", "世界你好", "你好Hello", "Hello", "你好"]
result = process.extract(query, choices)
# 默认返回前五相似结果
print(result)
[('Hello', 90.0, 4), ('hello 世界', 83.125, 1), ('你好Hello', 66.66666666666667, 3), ('你好世界', 60.00000000000001, 0), ('世界你好', 60.00000000000001, 2)]
from rapidfuzz import process
query = "世界 Hello"
choices = ["你好世界", "hello 世界", "世界你好", "你好Hello", "Hello", "你好"]
# 默认返回前三相似结果
result = process.extract(query, choices, limit=3)
print(result)
[('Hello', 90.0, 4), ('hello 世界', 83.125, 1), ('你好Hello', 66.66666666666667, 3)]
# 以下方法返回最匹配的结果
result = process.extractOne(query, choices)
# 类似于
# result = process.extract(query, choices, limit=3)
print(result)
('Hello', 90.0, 4)
# 指定匹配算法
result = process.extract(query, choices, scorer=fuzz.partial_token_ratio)
print(result)
[('hello 世界', 100.0, 1), ('Hello', 100.0, 4), ('你好Hello', 83.33333333333334, 3), ('你好世界', 66.66666666666667, 0), ('世界你好', 66.66666666666667, 2)]
1.3 距离计算
除了相似字符串查找,RapidFuzz也提供了几种字符串相似性度量的方法。下面是对其中几个主要函数的使用说明:
distance(s1, s2)
这个函数计算两个字符串s1和s2之间的Levenshtein距离(编辑距离)。编辑距离使用说明见: Levenshtein Distance算法与使用场景。简单来说Damerau-Levenshtein距离是一种编辑距离度量方法,用于计算将一个字符串转换为另一个字符串所需的最小编辑操作次数。这些编辑操作包括插入、删除、替换和相邻字符交换。Damerau-Levenshtein距离越小,表示两个字符串越相似或接近。
from rapidfuzz import distance
s1 = "你好 世界"
s2 = "你好 world!"
dist = distance.DamerauLevenshtein.distance(s1, s2)
print(dist) # 输出结果为7
6
normalized_distance(s1, s2)
计算范围为[1,0]的归一化Damerau-Levenstein距离。
from rapidfuzz import distance
s1 = "你好 世界"
s2 = "你好 world!"
dist = distance.DamerauLevenshtein.normalized_distance(s1, s2)
print(dist)
0.6666666666666666
similarity(s1, s2)
计算范围为[max,0]的Damerau-Levenstein相似度。这被计算为max(len1,len2)-distance。
from rapidfuzz import distance
s1 = "你好 世界"
s2 = "你好 world!"
sim = distance.DamerauLevenshtein.similarity(s1, s2)
print(sim)
3
normalized_similarity(s1, s2)
计算在[0,1]范围内的归一化Damerau-Levenstein相似性。
from rapidfuzz import distance
s1 = "你好 世界"
s2 = "你好 world!"
sim = distance.DamerauLevenshtein.normalized_similarity(s1, s2)
print(sim)
0.33333333333333337
2 参考
[Python] 基于RapidFuzz库实现字符串模糊匹配的更多相关文章
- 简单易用的字符串模糊匹配库Fuzzywuzzy
简单易用的字符串模糊匹配库Fuzzywuzzy 阅读目录 FuzzyWuzzy 简介 安装 用法 已知移植 FuzzyWuzzy 简介 FuzzyWuzzy 是一个简单易用的模糊字符串匹配工具包.它依 ...
- C++实现的字符串模糊匹配
C++基本没有正则表达式功能,当然像Boost里提供了正则.本文来源于博客园园友的一篇文章,请看: C/C++ 字符串模糊匹配 很早之前就看过这篇文章,原作者的需求很明确.代码实现也很好. 之所以又写 ...
- python 字符串模糊匹配 Fuzzywuzzy
Python提供fuzzywuzzy模块,不仅可用于计算两个字符串之间的相似度,而且还提供排序接口能从大量候选集中找到最相似的句子. (1)安装 pip install fuzzywuzzy (2)接 ...
- [python] 基于diagrams库绘制系统架构图
Python的Diagrams库允许通过简单的Python代码绘制云系统架构,实现对新的系统架构进行原型设计.Diagrams的官方仓库地址见:diagrams.Diagrams的官方文档和使用示例见 ...
- [python] 基于wordcloud库绘制词云图
词云Wordcloud是文本数据的一种可视化表示方式.它通过设置不同的字体大小或颜色来表现每个术语的重要性.词云在社交媒体中被广泛使用,因为它能够让读者快速感知最突出的术语.然而,词云的输出结果没有统 ...
- [python] 基于blind-watermark库添加图片盲水印
blind-watermark是一个能够给图片添加/解析基于频域的数字盲水印的Python库.图像水印image watermark是指在图片里添加文本或图形,以标记图片的来源.但是图像水印会破坏原图 ...
- python爬虫下正则各种字符串数据匹配
s = '*\/:?"<>|' #这9个字符在Windows系统下是不可以出现在文件名中的str1 = '\巴拉<1"!11[]>1*hgn/p:?|' # ...
- mybatis字符串模糊匹配
1. 参数中直接加入%%,注意不需要加两个单引号,加了就会出错,因为系统会自动为字符串类型加上两个单引号 <select id="selectPersons" result ...
- [python] 基于paramiko库操作远程服务器
SSH(Secure Shell)是一种网络安全协议,能够使两台计算机安全地通信和共享数据.目前,SSH协议已在世界各地广泛使用,大多数设备都支持SSH功能.SSH的进一步说明见:深入了解SSH.SS ...
- python基于pillow库的简单图像处理
from PIL import Image from PIL import ImageFilter from PIL import ImageEnhance import matplotlib.pyp ...
随机推荐
- 五一高铁票难抢?用RPA机器人试试!
随着信息数字化的高速发展,RPA在各行业中得到广泛应用,热度大增.这匹"技术黑马"已然成为构建业务流程自动化的重要引擎之一,助力企业组织向"智能自动化转型. 什么是RPA ...
- Python 的 sum():Pythonic 的求和方法
摘要:Python 的内置函数sum()是一种对数值列表求和的有效且Pythonic 的方法.将多个数字相加是许多计算中常见的中间步骤,因此sum()对于 Python 程序员来说是一个非常方便的工具 ...
- 在距离distribution 证书过期一个月(或被手动revoke了)的时候会受到apple的邮件
编辑 虽然distribution过期(或者被手动revoke)了,如果你的开发者账号是company(公司)类型或个人类型的,只要你的每年99$的开发者membership没有过期,就不会对已 ...
- MyBatis batchInsert 批量插入数据
mybatis 是一个 Java 的持久层框架,它支持定制化 SQL.存储过程以及高级映射.通过 MyBatis,开发者可以直接编写原生态 SQL,避免了 JDBC 代码的繁琐. 如何在 MyBati ...
- Error unprotecting the session cookie.The payload was invalid.
.Net Core 3.0 warn: Microsoft.AspNetCore.Session.SessionMiddleware[7] Error unprotecting the session ...
- Hugging Face: 代码生成模型的预训练和微调
和大家分享我们的机器学习工程师 Loubna Ben Allal 在 10 月上海 KubeCon 大会的主题演讲 题目是: 代码生成模型的预训练和微调 演讲介绍了构建和训练大型代码模型比如: Sta ...
- STM32CubeMX教程15 ADC - 多重ADC转换
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK ...
- 在 HTML 页面中使用 React
该方案使用场景:在html页面中使用react,主js文件index.js和其它非react功能使用js模块化的方式开发,适合轻量级中小型应用 index.html代码: 引入react.react- ...
- 洛谷P1174 打砖块 | CCPC2021网络赛8.28 1011 动态规划 分组背包
本文学习自洛谷社区 喜提CCPC2021网络赛原题 题意相当于是要在每一列中选若干个砖块打掉,消耗所需的子弹数并得到对应的得分.最大化k个子弹能得到的最大得分. 预处理出第 \(i\) 列 \(j\) ...
- Codeforces Global Round 12(个人题解)
1450A. Avoid Trygub 挺简单的题,题意是避免字符串中有子串"Trygub" 只要给字符串排序就可以了,这样一定不会出现 void solve() { string ...