前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Excel表操作-通过Fuzzywuzzy实现模糊匹配

关于Excel表操作-通过Fuzzywuzzy实现模糊匹配

作者头像
python与大数据分析
发布2022-05-19 12:25:46
8540
发布2022-05-19 12:25:46
举报
文章被收录于专栏:python与大数据分析

Fuzzywuzzy 是一款可以对字符串模糊匹配的工具, 它使用 Levenshtein Distance 来计算出那些易用包中序列之间的差异。

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

本文不对语法做详细介绍,大概思路可以参考下面的图

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

代码语言:javascript
复制
import pandas as pd
import jieba
import fuzzywuzzy
from fuzzywuzzy import process
import datetime

# 定义数据表
filename=r'C:\Users\baoqi\Documents\比较清单.xlsx'
targetfilename=r'C:\Users\baoqi\Documents\目标文件.xlsx'
# --------------------------合同--------------------------------
# 读取A表表格
starttime = datetime.datetime.now()
ht_zc_cw = pd.read_excel(filename,sheet_name='A比B多',engine='openpyxl')
endtime = datetime.datetime.now()
duringtime = endtime - starttime
print('1、A比B多 sheet',duringtime.seconds,'秒 开始时间=',starttime,'结束时间=',endtime)

# 读取B表表格
starttime = datetime.datetime.now()
ht_cw_zc = pd.read_excel(filename,sheet_name='B比A多',engine='openpyxl')
endtime = datetime.datetime.now()
duringtime = endtime - starttime
print('2、B比A多',duringtime.seconds,'秒 开始时间=',starttime,'结束时间=',endtime)


# 将要查找的数据list化
starttime = datetime.datetime.now()
ht_zc_cw_list = ht_zc_cw.Acompfield.to_list()
ht_cw_zc_list = ht_cw_zc.Bcompfield.to_list()
endtime = datetime.datetime.now()
duringtime = endtime - starttime
print('3、数据进行list化=',duringtime.seconds,'秒 开始时间=',starttime,'结束时间=',endtime)

# 匹配相关字段名称和阈值,低于90分不显示
starttime = datetime.datetime.now()
ht_cw_zc["匹配名称"] = ht_cw_zc.Bcompfield.apply(lambda x: process.extractOne(x, ht_zc_cw_list)[0] if process.extractOne(x, ht_zc_cw_list)[1]>90 else '')
ht_cw_zc["匹配阈值"] = ht_cw_zc.Bcompfield.apply(lambda x: process.extractOne(x, ht_zc_cw_list)[1] if process.extractOne(x, ht_zc_cw_list)[1]>90 else '')
endtime = datetime.datetime.now()
duringtime = endtime - starttime
print('3、匹配名称和阈值=',duringtime.seconds,'秒 开始时间=',starttime,'结束时间=',endtime)

# 新建一个目标表,将原信息连通匹配信息,一起写入
starttime = datetime.datetime.now()
writer = pd.ExcelWriter(targetfilename, mode="a", engine="openpyxl")
ht_cw_zc.to_excel(writer,index=False,sheet_name='匹配值')
writer.save()
writer.close()
endtime = datetime.datetime.now()
duringtime = endtime - starttime
print('4、写入目标文件=',duringtime.seconds,'秒 开始时间=',starttime,'结束时间=',endtime)

Fuzzywuzzy的用法比较简单,可以先分词再比对,也可以不分词比对。Fuzzywuzzy适用于小数据集的比对,几百条vs几百条,当数据量上升到上千的时候,速度无法接受,基本上一秒钟可比对上千条记录。

后文会介绍一个更快更准确的模糊匹配工具。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档