Fuzzywuzzy 是一款可以对字符串模糊匹配的工具, 它使用 Levenshtein Distance 来计算出那些易用包中序列之间的差异。
Levenshtein Distance算法,又叫 Edit Distance算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
本文不对语法做详细介绍,大概思路可以参考下面的图
Fuzzywuzzy主要包括四个函数(方法),分别为:简单匹配(Ratio)、非完全匹配(Partial Ratio)、忽略顺序匹配(Token Sort Ratio)和去重子集匹配(Token Set Ratio)
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几百条,当数据量上升到上千的时候,速度无法接受,基本上一秒钟可比对上千条记录。
后文会介绍一个更快更准确的模糊匹配工具。
本文分享自 python与大数据分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!