Python100个库分享第5个—fuzzywuzzy

目录

  • 专栏导读
  • 库介绍
  • 安装
  • fuzz模块用法1:简单匹配(Ratio)
  • fuzz模块用法2:推荐使用—非完全匹配(Partial Ratio)
  • fuzz模块用法3:Token Sort Ratio)
  • process模块
    • extract提取多条数据
    • extractOne提取一条数据
  • 实战应用
  • 总结

专栏导读

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

库介绍

  • FuzzyWuzzy 是一个简单易用的模糊字符串匹配工具包。它依据 Levenshtein Distance 算法,计算两个序列之间的差异。

  • Levenshtein Distance算法,又叫 Edit Distance算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。

安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple FuzzyWuzzy
  • fuzz模块用法1:简单匹配(Ratio)

  • 这个不怎么精确,不常用

fuzz模块用法1:简单匹配(Ratio)

  • 这个不怎么精确,不常用

from fuzzywuzzy import fuzzres = fuzz.ratio("江苏省", "江苏省")
print(res)
res = fuzz.ratio("上海", "上海市")
print(res)
  • 输出

  • 一个为100%

  • 一个为80%

100
80

fuzz模块用法2:推荐使用—非完全匹配(Partial Ratio)

  • 非完全匹配,精度较高

from fuzzywuzzy import fuzzres = fuzz.partial_ratio("江苏省", "江苏省")
print(res)
res = fuzz.partial_ratio("江苏", "江苏省")
print(res)
  • 输出

  • 两个都是显示100%

100
100

fuzz模块用法3:Token Sort Ratio)

  • 以 空格 为分隔符,小写化所有字母,无视空格外的其它标点符号

from fuzzywuzzy import fuzzres = fuzz.ratio("西藏 自治区", "自治区 西藏")
print(res)
res = fuzz.ratio('I love YOU','YOU LOVE I')
print(res)
res = fuzz.token_sort_ratio("西藏 自治区", "自治区 西藏")
print(res)
res = fuzz.token_sort_ratio('I love YOU','YOU LOVE I')
print(res)
  • 输出

50
30
100
100

process模块

  • fuzz这几个ratio()函数(方法)最后得到的结果都是数字,如果需要获得匹配度最高的字符串结果,还需要依旧自己的数据类型选择不同的函数,然后再进行结果提取,如果但看文本数据的匹配程度使用这种方式是可以量化的,但是对于我们要提取匹配的结果来说就不是很方便了,因此就有了process模块。

  • 用于处理备选答案有限的情况,返回模糊匹配的字符串和相似度。

extract提取多条数据

  • 类似于爬虫中select,返回的是列表,其中会包含很多匹配的数据

from fuzzywuzzy import fuzz,processchoices = ["河南省", "郑州市", "湖北省", "武汉市"]
res = process.extract("郑州", choices, limit=2)
print(res)
  • 输出

[('郑州市', 90), ('河南省', 0)]

extractOne提取一条数据

  • 如果要提取匹配度最大的结果,可以使用extractOne,注意这里返回的是 元组 类型, 还有就是匹配度最大的结果不一定是我们想要的数据,可以通过下面的示例和两个实战应用体会一下

from fuzzywuzzy import fuzz,processchoices = ["河南省", "郑州市", "湖北省", "武汉市"]
# res = process.extract("郑州", choices, limit=2)
# print(res)res = process.extractOne("郑州", choices)
print(res)res = process.extractOne("北京", choices)
print(res)
  • 输出

('郑州市', 90)
('湖北省', 45)

实战应用

在这里插入图片描述

  • 代码已注释

from fuzzywuzzy import fuzz, process
import pandas as pddata = pd.read_excel('data.xlsx')
company = pd.read_excel('company.xlsx')# 模糊匹配
def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):""":param df_1: df_1是自己获取的欲合并的左侧数据(这里是data变量):param df_2: df_2是待匹配的欲合并的右侧数据(这里是company变量):param key1: key1是df_1中要处理的字段名称(这里是data变量里的‘公司名称’字段):param key2: df_2中要匹配的字段名称(这里是company变量里的‘公司名称’字段):param threshold: threshold是设定提取结果匹配度的标准。注意这里就是对extractOne方法的完善,提取到的最大匹配度的结果并不一定是我们需要的,所以需要设定一个阈值来评判,这个值就为90,只有是大于等于90,这个匹配结果我们才可以接受:param limit: 默认参数就是只返回两个匹配成功的结果:return: df_1添加‘matches’字段后的新的DataFrame数据"""s = df_2[key2].tolist()m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))df_1['matches'] = mm2 = df_1['matches'].apply(lambda x: [i[0] for i in x if i[1] >= threshold][0] if len([i[0] for i in x if i[1] >= threshold]) > 0 else '')df_1['matches'] = m2return df_1df = fuzzy_merge(data, company, '公司名称', '公司名称', threshold=90)
print(df)
  • 输出

     公司名称           matches
0    卫材药业  卫材药业(江苏)医疗科技有限公司
1    基蛋生物  基蛋生物(苏州)生物科技有限公司
2    康宁杰瑞                  
3    恩华药业                  
4  南京正大天晴       

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

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

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

相关文章

基于价值的任务分解、规划与基于事实的任务分解、规划

基于价值的任务分解、规划反映了势态知感,基于事实的任务分解、规划反映了态势感知。 基于价值的任务分解、规划强调对任务的价值和意义的评估,以确定优先级和资源分配。这种方式下,任务的分解和规划是基于对所要达成的目标和价值的理解和考量…

3-Jquery过滤选择器

选择题 下列哪个选择器用于选择所有索引为偶数的元素? A. :even B. :odd C. :nth-child(even) D. :nth-even 答案:A:first-child选择器的作用是? A. 选择所有第一个元素 B. 选择每个父元素的第一个子元素 C. 选择每个元素的第一个子元素 D. …

55 npm run serve 和 npm run build 的分包策略

前言 这里我们来看一下 vue 这边 打包的时候的一些 拆分包的一些策略 我们经常会使用到 npm run build 进行服务的打包 然后 打包出来的情况, 可能如下, 可以看到 chunk-vendors 是进行了包的拆分, 我们这里就是 来看一下 这里 npm run build 的时候的, 一个分包的策略 测试…

Verilog基础【一】

文章目录 1.1 第一个verilog设计1.2 Verilog 简介1.3 Verilog环境搭建1.4 Verilog 设计方法设计方法设计流程 2.1 Verilog 基础语法格式注释标识符与关键字 2.2 Verilog 数值表示数值种类整数数值表示方法实数表示方法十进制:科学计数法: 字符串表示方法…

2023年C++语言B组蓝桥杯的三道题解【题解整合】

链接整合包 飞机降落–>点我传送 接龙数列–>点我传送 岛屿个数–>点我传送

ubuntu23.10配置RUST开发环境

系统版本: gcc版本 下载rustup安装脚本: curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc 默认已添加 使用环境变量立即生效 source ~/.bashrc 执行rust开发环境,在终端输入…

使用Pilotfish扩展Sui执行能力

Pilotfish第一个多机智能合约执行引擎,使Sui网络的验证节点可以利用多台机器,并在负载增加时自动扩展以执行更多的交易。这一目标实现不会影响可靠性或功能完整性。 Pilotfish可以从内部执行机器的故障中恢复,并支持Sui的全面动态操作。其流…

表白墙项目(JAVA实现)

1、在html里 class使用. id使用# 2、记得引入响应依赖(举例lombok) 3、messageController package com.example.demo.demos.web; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; i…

Springboot集成knife4j (swagger)

1、添加依赖 在pom.xml 文件中添加 knife4j-spring-boot-starter 的依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.3</version> </depe…

【千帆杯】K12教育常规赛 北京场线下交流会心得

千帆杯K12教育常规赛 北京场线下交流会心得 ​ 周日有幸参加了 百度智能云千帆AppBuilder北京场线下交流会 ( 活动链接 )&#xff0c;去线下组队创作了 K12教育 相关的智能体。参赛过程中认识了不少大佬与朋友&#xff0c;抱大佬队友的腿&#xff0c;他的 猜成语 应用获得了线…

【OS探秘】【虚拟化】【软件开发】VirtualBox 虚拟化软件卸载和重装

往期OS系列博文&#xff1a; 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装mac OS虚拟机 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装Kali Linux虚拟机 一、事出有因 近日&#xff0c;笔者的Oracle VM VirtualBox突然抽风了&#xff0c;虚拟机无法启动&…

世微 AP5191 降压恒流LED车灯 12-80V 9V5A电源驱动方案

AP5191是一款PWM工作模式,高效率、外围简 单、内置功率MOS管&#xff0c;适用于4.5-150V输入的高 精度降压LED恒流驱动芯片。输出功率150W&#xff0c; 电流6A。 AP5191可实现线性调光和PWM调光&#xff0c;线性调 光脚有效电压范围0.55-2.6V. AP5191 工作频率可以通过RT 外部…

(八)Gateway服务网关

Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。…

Java深拷贝与浅拷贝

Java深拷贝与浅拷贝 一、深拷贝与浅拷贝二、实现方式1、使用Object中的clone方法2、通过对象序列化 (实现Serializable接口) 三、原型设计模式 一、深拷贝与浅拷贝 浅拷贝只会复制对象中基本数据类型数据和引用数据的对象内存地址&#xff0c;不会递归的复制引用对象、以及引用…

[NOIP2005 普及组] 采药

题目描述 辰辰是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说&#xff1a;“孩子&#xff0c;这个山洞里…

containerd使用了解

containerd使用了解 yum安装 [rootvm ~]# curl -o /etc/yum.repos.d/docker.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [rootvm ~]# yum list | grep containerd containerd.io.x86_64 1.6.28-3.1.el7 doc…

2_2.Linux中的远程登录服务

# 一.Openssh的功能 # 1.sshd服务的用途# #作用&#xff1a;可以实现通过网络在远程主机中开启安全shell的操作 Secure SHell >ssh ##客户端 Secure SHell daemon >sshd ##服务端 2.安装包# openssh-server 3.主配置文件# /etc/ssh/sshd_conf 4.…

list(链表)容器(二)

一、list 插入和删除 函数原型&#xff1a; push_back(elem);//在容器尾部加入一个元素 pop_back();//删除容器中最后一个元素 push_front(elem);//在容器开头插入一个元素 pop_front();//从容器开头移除第一个元素 insert(pos,elem);//在pos位置插elem元素的拷贝&#xff0c…

Rhino.Inside.Revit根据直线创建剖面视图

Hello大家好&#xff01;我是九哥~ 今天简单分享一个小节点&#xff0c;根据Revit线构件的Location Line创建Revit剖面视图&#xff0c;主要用于快速创建线管、风道、墙等构件的详图视图。 效果如下&#xff1a; Rhino.Inside.Revit根据直线创建剖面视图 这次这个节点&#xff…

python中raise_for_status方法的作用

文章目录 说明示例1:基本使用示例2:多种异常说明 raise_for_status() 方法在 Python 的 requests 库中用于在发送 HTTP 请求后检查响应的状态码。如果响应的状态码表示请求未成功(即状态码不是 2xx),则该方法会抛出一个 HTTPError 异常。这允许你以一种更结构化的方式来处…