首页 > 编程语言 >[Python] 基于RapidFuzz库实现字符串模糊匹配

[Python] 基于RapidFuzz库实现字符串模糊匹配

时间:2024-01-25 11:45:59浏览次数:42  
标签:ratio Python Hello RapidFuzz token 字符串 partial hello

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提供了多种方法来比较字符串之间的相似度,包括ratiopartial_ratiopartial_ratio_alignmenttoken_set_ratiopartial_token_set_ratiotoken_sort_ratiopartial_token_sort_ratiotoken_ratiopartial_token_ratioWRatioQRatio

下面是对这些方法进行简要对比的说明:

  • 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 参考

标签:ratio,Python,Hello,RapidFuzz,token,字符串,partial,hello
From: https://www.cnblogs.com/luohenyueji/p/17986834

相关文章

  • python中(“{}{}{}”.format(i,j,k))的理解
    “{}{}{}”.format(i,j,k)笼统的来说是字符串的格式化字符串中有一些可以被替换掉的占位符,而格式化的过程就是对这些占位符替换的过程,举例来说:1“Iama{}”.format("student")它表示将字符串"Iama{}"进行格式化,格式化的结果就是该字符串中的占位符{}被format()函数中的参......
  • Python requests模块POST提交请求,不同Content-type对应的参数示例
    1.'content-type':'application/x-www-form-urlencoded'data参数提交文本或字典都可以headers为空时,data提交content-type默认也是application/x-www-form-urlencodedrequests.post(url,headers={'content-type':'application/x-www-form-urlencoded'}......
  • python中for循环及用法详解
    1、for循环for循环的语法格式如下:1for迭代变量in字符串|列表|元祖|字典|集合:2代码块迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不会在循环中对迭代变量手动赋值;2、用法2.1、for循环遍历数值1print("计算1+2+3+...+100的结果为:")2sum=0......
  • Python设计模式:你的代码真的够优雅吗?
    当涉及到代码优化时,Python作为一种高级编程语言,具有广泛的应用领域和强大的功能。在软件开发中,设计模式是一种被广泛采用的解决问题的方案,它提供了一种在特定情境中重复使用的可行方案。在Python中,有许多设计模式可以用来优化代码。其中两种常见的设计模式是单例模式和工厂模式。......
  • Python - 程序体验
        CASE:输入某年某月某日,判断这一天是这一年的第几天?#输入某年某月某日,判断这一天是这一年的第几天?importdatetimedtstr=input('Enterthedatetime:(20240124):')dt=datetime.datetime.strptime(dtstr,"%Y%m%d")another_dtstr=dtstr[:4]+'0101'ano......
  • Python:Selenium爬虫
    常用语法驱动常用方法driver.maximize_window()#最大化浏览器driver.set_window_size(w,h)#设置浏览器大小单位像素driver.set_window_position(x,y)#设置浏览器位置driver.back()#后退操作driver.forward()......
  • PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克
    原文链接:http://tecdat.cn/?p=27099最近我们被客户要求撰写关于蒙特卡罗的研究报告,包括一些图形和统计输出。金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反)变量该项......
  • 第十二天:SHELL编程之常见工具、数组及字符串切片
    一、信号捕捉traptrap命令可以捕捉信号,修改信号原来的功能,实现自定义功能#列出所有信号trap-l#进程收到系统发出的指定信号后,将执行自定义指令,而不会执行原操作trap'触发指令'信号#忽略信号的操作trap''信号#恢复原信号的操作trap'-'信号......
  • Python 变量?对象?引用?赋值?一个例子解释清楚
    哈喽大家好,我是咸鱼。前天有个小伙伴找到我,给了我一段python代码:a=[1,2]a[1]=aprint(a[1])然后问我为什么结果是[1,[...]],我一看这个问题有意思,我说三言两语解释不清楚,我写篇文章到时候你看下吧,于是有了今天这篇文章。在正式开始之前,让我们先弄清楚一些概念。对......
  • Python三方库:Pika(RabbitMQ基础使用)
    Python有多种插件都支持RabbitMQ,本文介绍的是RabbitMQ推荐的Pika插件。使用pip直接安装即可pipinstallpika。一、RabbitMQ简介1.MQ简介MQ(MessageQueue,消息队列),是一个在消息传输过程中保存消息的容器,多用在分布式系统之间进行通信。MQ优势应用解耦:提高系统容错性和可......