Python中匹配模糊的字符串

news2024/10/5 18:27:07

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

如何使用thefuzz 库,它允许我们在python中进行模糊字符串匹配。

此外,我们将学习如何使用process 模块,该模块允许我们在模糊字符串逻辑的帮助下有效地匹配或提取字符串。

使用thefuzz 模块来匹配模糊字符串

这个库在旧版本中有一个有趣的名字,因为它有一个特定的名字,这个名字被重新命名。

所以现在是由不同的库来维护;但是,它目前的版本叫做thefuzz ,所以这就是你可以通过下面的命令来安装的。

pip install thefuzz

但是,如果你在网上看例子,你会发现一些例子的旧名称是fuzzywuzzy 。所以,它已经不再被维护并且过时了,但是你可能会发现一些用这个名字的例子。

thefuzz 库是基于 ,所以你必须用这个命令来安装它。python-Levenshtei

pip install python-Levenshtein

而如果你在安装过程中遇到一些问题,你可以使用下面的命令,如果再次遇到错误,那么你可以在google上搜索,找到相关的解决方案。

pip install python-Levenshtein-wheels

本质上,模糊匹配字符串就像使用regex或沿着两个字符串的比较。

在模糊逻辑的情况下,你的条件的真值可以是0 和1 之间的任何实数。

因此,基本上,不是说任何东西是True 或False ,你只是给它在0 到1 之间的任何值。

它是通过使用距离度量计算两个字符串之间的不相似性,其形式是一个称为距离的值。

使用给定的字符串,你使用一些算法找到两个字符串之间的距离。一旦你完成了安装过程,你必须从thefuzz 模块中导入fuzz 和process 。

from thefuzz import fuzz, process

在使用fuzz ,我们将手动检查两个字符串之间的不相似性。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
ST1='Just a test'
ST2='just a test'
print(ST1==ST2)
print(ST1!=ST2)

它将返回一个布尔值,但以一种模糊的方式,你会得到这些字符串的相似程度的百分数。

False
True

模糊字符串匹配允许我们以模糊的方式更有效、更快速地完成这项工作。假设我们有一个例子,有两个字符串,其中一个字符串与大写的J (如上所述)不相同。

如果我们现在去调用ratio() 函数,它给我们一个相似性的度量,那么这将为我们提供一个相当高的比率,即91 ,而不是100 。

from thefuzz import fuzz, process
print(fuzz.ratio(ST1, ST2))

输出:

91

如果字符串更加延长,例如,如果我们不只是改变一个字符,而是改变一个完全不同的字符串,那么看看它的回报,看一看。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
ST1='This is a test string for test'
ST2='There aresome test string for testing'
print(fuzz.ratio(ST1,ST2))

现在可能会有一些相似之处,但会很75 ;这只是一个简单的比率,并不复杂。

75

我们还可以继续尝试像部分比例这样的东西。例如,我们有两个字符串,我们想确定它们的分数。

ST1='There are test'
ST2='There are test string for testing'
print(fuzz.partial_ratio(ST1,ST2))

使用partial_ratio() ,我们会得到100%,因为这两个字符串有相同的子字符串(There are test)。

在ST2 ,我们有一些不同的词(字符串),但这并不重要,因为我们看的是部分比率或个别部分,但简单的比率并不类似。

100

假设我们有相似的字符串,但有不同的顺序;然后,我们使用另一个度量。

CASE_1='This generation rules the nation'
CASE_2='Rules the nation This generation'

两种情况下,在该短语的相同含义上有完全相同的文字,但使用ratio() ,就会有相当大的不同,而使用partial_ratio() ,就会有不同。

如果我们通过token_sort_ratio() ,这将是100%,因为它基本上是完全相同的文字,但顺序不同。

因此,这就是token_sort_ratio() ,该函数将单个标记进行排序,它们的顺序并不重要。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
print(fuzz.ratio(CASE_1,CASE_2))
print(fuzz.partial_ratio(CASE_1,CASE_2))
print(fuzz.token_sort_ratio(CASE_1,CASE_2))

输出:

47
64
100

现在,如果我们用另一个词来改变一些词,我们会有一个不同的数字,但基本上,这是一个比率;

它不关心个别标记的顺序。

CASE_1='This generation rules the nation'
CASE_2='Rules the nation has This generation'
print(fuzz.ratio(CASE_1,CASE_2))
print(fuzz.partial_ratio(CASE_1,CASE_2))
print(fuzz.token_sort_ratio(CASE_1,CASE_2))

输出:

44
64
94

token_sort_ratio() 也是不同的,因为它有更多的词在里面,但我们也有一个叫做token_set_ratio() 的东西,一个集合包含每个标记只有一次。

所以,它出现的频率并不重要;让我们看看一个例子字符串。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
CASE_1='This generation'
CASE_2='This This generation generation generation generation'
print(fuzz.ratio(CASE_1,CASE_2))
print(fuzz.partial_ratio(CASE_1,CASE_2))
print(fuzz.token_sort_ratio(CASE_1,CASE_2))
print(fuzz.token_set_ratio(CASE_1,CASE_2))

我们可以看到一些相当低的分数,但是我们使用token_set_ratio() 函数得到了100%的分数,因为我们有两个令牌,This 和generation 存在于两个字符串中。

使用process 模块,以高效的方式使用模糊字符串匹配

不仅有fuzz ,还有process ,因为process 是有帮助的,可以使用这种模糊匹配从一个集合中提取出来。

例如,我们准备了几个列表项来演示。

Diff_items=['programing language','Native language','React language',
        'People stuff', 'This generation', 'Coding and stuff']

其中一些是非常相似的,你可以看到(母语或编程语言),现在我们可以去挑选最好的个别匹配。

我们可以手动操作,只需评估分数,然后挑选出最优秀的人选,但我们也可以用process 。

要做到这一点,我们必须调用process 模块中的extract() 函数。

它需要几个参数,第一个是目标字符串,第二个是你要提取的集合,第三个是限制,将匹配或提取的内容限制为两个。

例如,如果我们想提取像language ,在这种情况下,选择母语和编程语言。

print(process.extract('language',Diff_items,limit=2))

输出:

[('programing language', 90), ('Native language', 90)]

问题是:

  1. 这不是NLP(自然语言处理);

  2. 这背后没有智能;

  3. 它只是看单个标记。

因此,举例来说,如果我们使用programming 作为目标字符串并运行这个。

第一个匹配将是programming language ,但第二个匹配将是Native language ,这将不是编码。

即使我们有编码,因为从语义上讲,编码更接近于编程,但这并不重要,因为我们在这里没有使用AI。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
Diff_items=['programing language','Native language','React language',
        'People stuff', 'Hello World', 'Coding and stuff']
print(process.extract('programing',Diff_items,limit=2))

输出:

[('programing language', 90), ('Native language', 36)]

另一个最后的例子是这是如何有用的;

我们有一个庞大的书库,想找到一本书,但我们不知道确切的名字或如何调用它。

在这种情况下,我们可以使用extract() ,在这个函数里面,我们将把fuzz.token_sort_ratio 传给scorer 参数。

LISt_OF_Books=['The python everyone volume 1 - Beginner',
               'The python everyone volume 2 - Machine Learning',
               'The python everyone volume 3 - Data Science',
               'The python everyone volume 4 - Finance',
               'The python everyone volume 5 - Neural Network',
               'The python everyone volume 6 - Computer Vision',
               'Different Data Science book',
               'Java everyone beginner book',
               'python everyone Algorithms and Data Structure']
print(process.extract('python Data Science',LISt_OF_Books,limit=3,scorer=fuzz.token_sort_ratio))

我们只是传递它,我们并没有调用它,现在,我们在这里得到了最高的结果,我们得到了另一本数据科学书作为第二个结果。

输出:

[('The python everyone volume 3 - Data Science', 63), ('Different Data Science book', 61), ('python everyone Algorithms and Data Structure', 47)]

这就是如何是相当准确的,如果你有一个项目,你必须以模糊的方式找到它,它可以相当有帮助。

我们也可以用它来实现你的程序自动化。

还有一些额外的资源,你可以使用github和stackoverflow找到更多帮助。

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离散数学 学习 之 5.3 一阶逻辑的推理理论

第一个证明中,最后三步的化简很重要,倒数第三步构造出一个可以化简出倒数第二步的公式,最后再化简 上面中的第 1, 2 步 和 3 , 4 步不能换,因为无法保证是同一个 c 尽量弄成前束范式 上面中2,3&…

无状态自动配置 DHCPv6无状态配置 DHCPv6有状态配置

1、无状态自动配置 配置命令 AR1 ipv6 #开启路由器ipv6报文转发功能 interface GigabitEthernet0/0/0 ipv6 enable #开启路由器接口IPv6报文转发功能 ipv6 address FC01::1/64 …

对比两个Series序列中的元素是否不相等,并以Series格式返回结果

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 逐一对比两个Series序列中 元素是否不相等,将结果 以Series格式返回 [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd a pd.Series([0,1,2],index["x"…

stm32 - 中断/定时器

stm32 - 中断/定时器 概念时钟树定时器类型基准时钟(系统时钟)预分频器 - 时基单元CNT计数器 - 时基单元自动重装寄存器 - 时基单元基本定时器结构通用定时器计数器模式内外时钟源选择 定时中断基本结构时序预分频器时序计数器时序 概念 时钟树 https:…

vue重修004上部

文章目录 版权声明组件的三大组成部分scoped解决样式冲突scoped原理2.代码演示 组件data函数说明演示 组件通信组件关系分类通信解决方案父子通信流程子向父通信代 props详解props校验props&data、单向数据流 小黑记事本(组件版)基础组件结构需求和实…

【AI处理器组合】python实现-附ChatGPT解析

1.题目 AI处理器组合 知识点数组 时间限制:1s 空间限制: 256MB 限定语言:不限 题目描述: 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中…

【计算机网络笔记九】I/O 多路复用

阻塞 IO 和 非阻塞 IO 阻塞 I/O 和 非阻塞 I/O 的主要区别: 阻塞 I/O 执行用户程序操作是同步的,调用线程会被阻塞挂起,会一直等待内核的 I/O 操作完成才返回用户进程,唤醒挂起线程非阻塞 I/O 执行用户程序操作是异步的&#xf…

阿里云PolarDB数据库详细介绍_3分钟看懂

阿里云PolarDB数据库是阿里巴巴自研的关系型分布式云原生数据库,PolarDB兼容三种数据库引擎:MySQL、PostgreSQL、Oracle(语法兼容),目前提供云原生数据库PolarDB MySQL版、云原生数据库PolarDB PostgreSQL版和云原生数…

简单聊聊 TCP 协议

简单聊聊 TCP 协议 如何实现可靠传输 ?完全可靠存在比特差错存在丢包流水线可靠数据传输协议回退N步 (GBN)选择重传 (ARQ) 小结 TCPTCP 连接报文段结构序号和确认号 可靠数据传输避免重传超时时间加倍快速重传回退N步还是选择重传 流量控制连接管理拥塞控制拥塞原因拥塞控制方…

国庆10.03

运算符重载 代码 #include <iostream> using namespace std; class Num { private:int num1; //实部int num2; //虚部 public:Num(){}; //无参构造Num(int n1,int n2):num1(n1),num2(n2){}; //有参构造~Num(){}; //析构函数const Num operator(const Num &other)co…

想用ChatGPT写申请文书?那你肯定会被拒!

美国总统乔拜登&#xff08;Joe Biden&#xff09;、诗人TS艾略特&#xff08;T. S. Eliot&#xff09;和历史学家斯蒂芬安布罗斯&#xff08;Stephen Ambrose&#xff09;&#xff0c;他们的名字都曾与抄袭事件联系在一起。 其中&#xff0c;艾略特的抄袭行为是在他去世后才被…

A3纸内容分2页打在A4纸上

需求&#xff1a;文档是A3纸大小&#xff0c;因为打印机只能打A4纸&#xff0c;需要将内容分2页打在A4纸上。 网上搜索了一圈&#xff0c;可行解决方案如下&#xff1a; 1、打印纸的输出改成2分A4文件&#xff0c;首先设置打印输出的文档是A4纸大小&#xff0c;如图&#xff…

维基百科启用HTTPS的全球影响

2015 年 6 月&#xff0c;维基媒体基金会宣布维基百科默认启用 HTTPS&#xff0c;基金会称此举旨在保护访问者的隐私和安全&#xff0c;让用户能安全和不被审查的自由获取知识。在没有启用 HTTPS 的年代&#xff0c;审查者能知道访问者访问了维基百科上的哪些条目&#xff0c;它…

阿里云数据库RDS有哪些?细数关系型数据库大全

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …

项目实训 文章评论

1.需求实现 以下功能&#xff1a; 1&#xff09;基本增删改查API 2&#xff09;根据文章id查询评论 3&#xff09;评论点赞 数据库&#xff1a;articledb 2 文章微服务模块搭建 &#xff08;1&#xff09;搭建项目工程article&#xff0c;并设置pom.xml引入依赖&#xff…

阿里云数据库大全_3分钟看懂阿里云RDS和NoSQL数据库汇总

阿里云数据库大全&#xff1a;RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;数据仓库如AnalyticDB MySQL版、PostgreSQL、ClickHouse&#xff0c;阿里云还提供数据库管理工具如数…

leetcode 习题集 【9月】

leetcode 习题集 [9月] 回溯 77. 组合 class Solution { private:vector<vector <int>> result;vector<int> path;// path用来存放符合条件的结果 void backtracking(int n, int k, int startIndex){if(path.size() k){result.push_back(path);return;…

常用的分布式ID解决方案原理解析

目录 前言 一&#xff1a;分布式ID的使用场景 二&#xff1a;分布式ID设计的技术指标 三&#xff1a;常见的分布式ID生成策略 3.1 UUID 3.2 数据库生成 3.3 数据库的多主模式 3.4 号段模式 3.5 雪花算法 前言 分布式ID的生成是分布式系统中非常核心的基础性模块&#…

【翻译工具】如何复活谷歌翻译之二

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

使用canal和openfire实现Mysql的实时数据订阅

文章目录 1、Openfire插件接收binlog数据1.1、创建用户组1.2、接口实现 2、Canal客户端开发3、Smack消息客户端实现。 mysql的binlog的实时数据订阅 &#xff08;1&#xff09; canal安装与客户端使用 &#xff08;2&#xff09; openfire 4.7.5 Web插件开发 &#xff08;3&a…