[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 ...
随机推荐
- iOS描述文件(.mobileprovision)一键申请
转载:IOS描述文件制作教程 iOS描述文件(.mobileprovision)一键申请 在主界面上点击描述文件按钮. 编辑切换为居中 添加图片注释,不超过 140 字(可选) 新建ios ...
- DamiBus v0.51 发布
DamiBus,专为本地多模块之间通讯解耦而设计(尤其是未知模块.隔离模块.领域模块).零依赖,特适合 DDD. 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作响应订阅. 支 ...
- 让 Java 打包缩小一大半,Solon v1.9.3 发布
相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...
- 基于Kresling折纸结构双稳态空间的无人机着陆系统新结构
摘要:本文利用动捕技术对无人机着陆系统模型进行动力学分析,对折纸结构双稳态着陆系统性能进行测试,为无人机着陆系统结构设计提供创新方法. 近期,一篇关于无人机着陆系统的研究论文"Evoluti ...
- ThrottleStop设置
主界面 选项界面 在主界面点击"Options"按钮进入选项界面 给CPU降压 在主界面点击"FIVR"按钮进入如下界面 如上图所示,我自己的电脑,降压49.8 ...
- 【Qt Libraries】QUrl 的基本使用方法
参考博客: https://www.cnblogs.com/liushui-sky/p/10892097.html https://www.cnblogs.com/ShineLeBlog/p/1495 ...
- L2-008 最长对称子串 (回文子串 / DP / Manacher算法)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 一些 Codeforce Content 补题记录
Codeforces Round #651 (Div. 2) 1370A. Maximum GCD 给定一个 n,求(1~n)中任意组合对的最大的公约数. 思路:如果 \(n\) 是偶数,那么最大公约 ...
- 使用屏幕捕捉API:一站式解决屏幕录制需求
随着科技的发展,屏幕捕捉API技术逐渐成为一种热门的录屏方法.本文将详细介绍屏幕捕捉API技术的原理.应用场景以及如何利用这一技术为用户提供便捷.高效的录屏体验. 在线录屏 | 一个覆盖广泛主题工具的 ...
- vue表单修饰符