Python中实现模糊匹配的魔法库:FuzzyWuzzy

参考链接:https://mp.weixin.qq.com/s/5qzPb7HOCfRRGJICYUsAOQ
FuzzyWuzzy一个简单易用的模糊字符串匹配工具包。让你轻松解决烦恼的匹配问题!

  1. 前言

在处理数据的过程中,难免会遇到下面类似的场景,自己手里头获得的是简化版的数据字段,但是要比对的或者要合并的却是完整版的数据(有时候也会反过来)

最常见的一个例子就是:在进行地理可视化中,自己收集的数据只保留的缩写,比如北京,广西,新疆,西藏等,但是待匹配的字段数据却是北京市,广西壮族自治区,新疆维吾尔自治区,西藏自治区等,如下。因此就需要有没有一种方式可以很快速便捷的直接进行对应字段的匹配并将结果单独生成一列,就可以用到FuzzyWuzzy库。

图片

  1. FuzzyWuzzy库介绍

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

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

这里使用的是Anaconda下的jupyter notebook编程环境,因此在Anaconda的命令行中输入一下指令进行第三方库安装。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple FuzzyWuzzy

2.1 fuzz模块

该模块下主要介绍四个函数(方法),分别为:简单匹配(Ratio)、非完全匹配(Partial Ratio)、忽略顺序匹配(Token Sort Ratio)和去重子集匹配(Token Set Ratio)

注意: 如果直接导入这个模块的话,系统会提示warning,当然这不代表报错,程序依旧可以运行(使用的默认算法,执行速度较慢),可以按照系统的提示安装python-Levenshtein库进行辅助,这有利于提高计算的速度。

图片

2.1.1 简单匹配(Ratio)

简单的了解一下就行,这个不怎么精确,也不常用

fuzz.ratio(“河南省”, “河南省”)

100

fuzz.ratio(“河南”, “河南省”)

80

2.1.2 非完全匹配(Partial Ratio)

尽量使用非完全匹配,精度较高

fuzz.partial_ratio(“河南省”, “河南省”)

100

fuzz.partial_ratio(“河南”, “河南省”)

100

2.1.3 忽略顺序匹配(Token Sort Ratio)

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

fuzz.ratio(“西藏 自治区”, “自治区 西藏”)

50
fuzz.ratio(‘I love YOU’,‘YOU LOVE I’)

30

fuzz.token_sort_ratio(“西藏 自治区”, “自治区 西藏”)

100
fuzz.token_sort_ratio(‘I love YOU’,‘YOU LOVE I’)

100

2.1.4 去重子集匹配(Token Set Ratio)

相当于比对之前有一个集合去重的过程,注意最后两个,可理解为该方法是在token_sort_ratio方法的基础上添加了集合去重的功能,下面三个匹配的都是倒序

fuzz.ratio(“西藏 西藏 自治区”, “自治区 西藏”)

40

fuzz.token_sort_ratio(“西藏 西藏 自治区”, “自治区 西藏”)

80

fuzz.token_set_ratio(“西藏 西藏 自治区”, “自治区 西藏”)

100

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

2.2 process模块

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

2.2.1 extract提取多条数据

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

choices = [“河南省”, “郑州市”, “湖北省”, “武汉市”]
process.extract(“郑州”, choices, limit=2)

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

extract之后的数据类型是列表,即使limit=1,最后还是列表,注意和下面extractOne的区别

2.2.2 extractOne提取一条数据

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

process.extractOne(“郑州”, choices)

(‘郑州市’, 90)

process.extractOne(“北京”, choices)

(‘湖北省’, 45)

  1. 实战应用

这里举两个实战应用的小例子,第一个是公司名称字段的模糊匹配,第二个是省市字段的模糊匹配

3.1 公司名称字段模糊匹配

数据及待匹配的数据样式如下:自己获取到的数据字段的名称很简洁,并不是公司的全称,因此需要进行两个字段的合并

图片

直接将代码封装为函数,主要是为了方便日后的调用,这里参数设置的比较详细,执行结果如下:

图片

3.1.1 参数讲解:

① 第一个参数df_1是自己获取的欲合并的左侧数据(这里是data变量);

② 第二个参数df_2是待匹配的欲合并的右侧数据(这里是company变量);

③ 第三个参数key1是df_1中要处理的字段名称(这里是data变量里的‘公司名称’字段)

④ 第四个参数key2是df_2中要匹配的字段名称(这里是company变量里的‘公司名称’字段)

⑤ 第五个参数threshold是设定提取结果匹配度的标准。注意这里就是对extractOne方法的完善,提取到的最大匹配度的结果并不一定是我们需要的,所以需要设定一个阈值来评判,这个值就为90,只有是大于等于90,这个匹配结果我们才可以接受

⑥ 第六个参数,默认参数就是只返回两个匹配成功的结果

⑦ 返回值:为df_1添加‘matches’字段后的新的DataFrame数据

3.1.2 核心代码讲解

第一部分代码如下,可以参考上面讲解process.extract方法,这里就是直接使用,所以返回的结果m就是列表中嵌套元祖的数据格式,样式为: [(‘郑州市’, 90), (‘河南省’, 0)],因此第一次写入到’matches’字段中的数据也就是这种格式

注意,注意: 元祖中的第一个是匹配成功的字符串,第二个就是设置的threshold参数比对的数字对象

s = df_2[key2].tolist()
m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))
df_1[‘matches’] = m

第二部分的核心代码如下,有了上面的梳理,明确了‘matches’字段中的数据类型,然后就是进行数据的提取了,需要处理的部分有两点需要注意的:

① 提取匹配成功的字符串,并对阈值小于90的数据填充空值

② 最后把数据添加到‘matches’字段

m2 = 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 ‘’)
#要理解第一个‘matches’字段返回的数据类型是什么样子的,就不难理解这行代码了
#参考一下这个格式:[(‘郑州市’, 90), (‘河南省’, 0)]
df_1[‘matches’] = m2

return df_1

3.2 省份字段模糊匹配

自己的数据和待匹配的数据背景介绍中已经有图片显示了,上面也已经封装了模糊匹配的函数,这里直接调用上面的函数,输入相应的参数即可,代码以及执行结果如下:

图片

数据处理完成,经过封装后的函数可以直接放在自己自定义的模块名文件下面,以后可以方便直接导入函数名即可,可以参考将自定义常用的一些函数封装成可以直接调用的模块方法。

  1. 全部函数代码

#模糊匹配

def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
“”"
:param df_1: the left table to join
:param df_2: the right table to join
:param key1: key column of the left table
:param key2: key column of the right table
:param threshold: how close the matches should be to return a match, based on Levenshtein distance
:param limit: the amount of matches that will get returned, these are sorted high to low
:return: dataframe with boths keys and matches
“”"
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_1

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

df = fuzzy_merge(data, company, ‘公司名称’, ‘公司名称’, threshold=90)
df

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

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

相关文章

LeetCode 897. 递增顺序查找树(中序遍历)

1. 题目 给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。 示例 :输入:[5,3,6,2,4,null,8,1,null,null,null,7,9]5/ \3 6/ \ \2 4…

谈谈怎样提高炼丹手速

文 | 夕小瑶最近搞定几件焦头烂额的大事后,终于有了一丢丢的时间来写写文章,并且偶尔思考下算法工程师的核心竞争力是什么。前不久一时兴起写了篇标题党文章《惊了!掌握了这个炼丹技巧的我开始突飞猛进》,简单描述了一下我的升级打…

Android官方开发文档Training系列课程中文版:后台加载数据之使用CursorLoader进行查询

原文地址:http://android.xsoftlab.net/training/load-data-background/index.html 引言 在ContentProvider中查询数据是需要花点时间的。如果你直接在Activity进行查询,那么这可能会导致UI线程阻塞,并会引起”Application Not Responding”…

论文浅尝 | 神经协同推理

论文笔记整理:叶橄强,浙江大学计算机学院,知识图谱和知识推理方向。Paper link: https://arxiv.org/abs/2005.08129Github link: https://github.com/Scagin/NeuralLogicReasoning背景:推荐任务推荐作为一种认知智能任务&#xff…

在服务器上安装anaconda遇到的问题总结

1 安装anaconda需要一些安装包,需要提前备准备好,比如bunzip2, gcc编译等软件。 cd /anacondaRElyanacondaREly文件夹下放了anaconda所依赖的安装包,切换到该路径 rpm -Uvh *.rpm --nodeps --force安装好anaconda 需要的依赖环境…

LeetCode 693. 交替位二进制数(位运算)

1. 题目 给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。 输入: 5 输出: True 解释: 5的二进制数是: 101输入: 7 输出: False 解释: 7的二进制数是: 111输入: 11 输出: False 解释: 11的二进…

全栈深度学习第6期: 模型测试和部署

一起追剧鸭简介Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目,通过微信群为同期追剧的小伙伴提供交流平台。关于该计划的详请见这里。Berkeley深度学习追剧群目前已有1000小伙伴加入,公众号后台回复口令 深度学习追剧 入群。…

Android官方开发文档Training系列课程中文版:后台加载数据之处理CursorLoader的查询结果

原文地址:http://android.xsoftlab.net/training/load-data-background/handle-results.html 就像上节课所说的,我们应该在onCreateLoader()内使用CursorLoader来加载数据。那么在数据加载完毕之后,加载结果会通过LoaderCallbacks.onLoadFin…

开源开放 | 欧若科技通过 OpenKG 开放 Nebula Graph 图数据库

开源工具名称:Nebula Graph贡献者:杭州欧若数网科技有限公司 Nebula GraphOpenKG 链接:http://openkg.cn/tool/nebula-graph-database 谣言盐水漱口能预防感染?钟南山院士团队公开辟谣:「盐水漱口有利于…

pkuseg-python的postag.zip在不能联网的服务器上的解决办法

关于pkuseg-python的基本介绍和使用: pkuseg.pkuseg( postag True)时,会触发download.py文件的下载命令,从github中下载,进而会导致服务器报错,如下 进而在pkuseg文件下打开download.py和__in…

数据库的方向 - 行vs列(转自: IBM i 中国开发团队)

转载地址:https://www.ibm.com/developerworks/community/blogs/IBMi/entry/database?langen 原文链接:http://ibmsystemsmag.blogs.com/you_and_i/db2/ 数据库的方向 - 行vs列 如果你是一位数据库专家的话,这篇博客可能帮不了你什么。 …

Android自动化页面测速在美团的实践

背景 随着移动互联网的快速发展,移动应用越来越注重用户体验。美团技术团队在开发过程中也非常注重提升移动应用的整体质量,其中很重要的一项内容就是页面的加载速度。如果发生冷启动时间过长、页面渲染时间过长、网络请求过慢等现象,就会直接…

NLP领域的首次Hard Label黑盒攻击!

文 | 阿毅编 | 小轶背景前段时间已经和大家分享了两篇关于NLP Privacy的文章。今天,我们又来给大家推送优质论文了(公众号学习法)。其实,NLP与其他方向的跨界结合这段时间层出不穷,且都发表到了非常好的顶会上。目前有…

论文浅尝 - ACL2020 | 利用知识库嵌入改进多跳 KGQA

论文笔记整理:吴畏,东南大学硕士研究生。来源: ACL 2020论文地址: https://www.aclweb.org/anthology/2020.acl-main.412.pdf开源代码: https://github.com/malllabiisc/EmbedKGQA动机在多跳KGQA中,系统需要对KG的多个边缘执行推理以推断出正…

Android官方开发文档Training系列课程中文版:管理设备的睡眠状态

原文地址:http://android.xsoftlab.net/training/scheduling/index.html 引言 当Android设备处于闲置状态时,它的屏幕首先会变暗,接着会关闭屏幕,最后会将CPU关闭。这些举措可以防止设备的电量迅速被耗尽。但是当APP需要的话&am…

解决pip安装报错:is not a supported wheel on this platform

解决pip安装报错:is not a supported wheel on this platform:https://blog.csdn.net/sty945/article/details/105200436/ 原因1 你下载安装的包不是当前平台所支持的 原因2 你下载的包,不符合你所在的平台的安装whl的名称规范,所…

MCI:移动持续集成在大众点评的实践

一、背景 美团是全球最大的互联网生活服务平台,为3.2亿活跃用户和500多万的优质商户提供一个连接线上与线下的电子商务服务。秉承“帮大家吃得更好,生活更好”的使命,我们的业务覆盖了超过200个品类和2800个城区县网络,在餐饮、外…

LeetCode 260. 只出现一次的数字 III(位运算)

1. 题目 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。 示例 :输入: [1,2,1,3,2,5] 输出: [3,5]注意: 结果输出的顺序并不重要,对于上面的例子, [5,…

没有什么多模态任务是一层Transformer解决不了的!

文 | 子龙曾几何时,多模态预训练已经不是一个新的话题,各大顶会诸多论文仿佛搭上Visual和BERT,就能成功paper1,VisualBERT、ViLBERT层出不穷,傻傻分不清楚......这些年NLPer在跨界上忙活的不亦乐乎,提取视觉…

论文浅尝 - KDD2020 | 真实世界超图的结构模式和生成模型

论文笔记整理:毕祯,浙江大学硕士,研究方向:知识图谱、自然语言处理。链接:https://arxiv.org/abs/2006.07060动机图已被用作对人或物体之间的成对关系建模的强大工具。而超图是更广泛概念的一种特殊类型,其…