Python模糊匹配
FuzzyWuzzy是Python中用于模糊字符串匹配的库,具有极高的准确性和效率。该库基于Levenshtein距离算法,使用字符串相似度的方法快速比较两个字符串之间的相似程度。FuzzyWuzzy提供多种比较方法,包括简单比较、部分比较、令牌排序比较和序列比较等。此外,FuzzyWuzzy还提供了模糊匹配的选项,包括模糊关键词、过滤器和截取器等。它可以广泛应用于自然语言处理、数据预处理、数据清洗、信息提取以及数据聚合等领域。FuzzyWuzzy不仅容易上手,还具有可扩展性和灵活性,可以根据实际需求进行适当的定制和调整。
本文使用FuzzyWuzzy方法,匹配excel两列数据,第一列数据循环匹配第二列数据,第三列存放匹配度最高的数据,第四列存放匹配度数值。
1、首先,需要安装FuzzyWuzzy、pandas和tqdm库
fuzzywuzzy用于计算匹配度,pandas用于读取和保存Excel文件,以及tqdm用于创建进度条。
pip install fuzzywuzzy pandas tqdm
2、读取excel数据,使用pd.read_excel方法读取Excel文件,存储到data变量中:
data = pd.read_excel('C:\\Users\\Administrator\\Desktop\\example.xls')
3、循环匹配:
定义两个空列表match_scores和pros用于存储匹配结果和匹配度数值。然后我们循环读取data中的ColA列,并使用fuzz.token_set_ratio计算其和ColB列中每一行的匹配度,依次更新最大匹配度和对应的匹配结果。循环完毕后将结果存储到match_scores和pros中。
match_scores = []
pros = []
for a in tqdm(data['ColA']):
max_score = 0
max_pro = 0
max_match = ""
for b in data['ColB']:
score = fuzz.token_set_ratio(a, b)
if score > max_score:
max_score = score
max_match = b
match_scores.append(max_match)
pros.append(max_score)
在循环中使用了tqdm函数创建了进度条,它会自动读取列表元素个数并显示匹配进度。
4、在表格后面增加两列,在循环后,将match_scores和pros两个列表的结果分别新增两列到data变量中。
data['MatchScore'] = match_scores
data['pro'] = pros
5、空值替换,因为匹配结果可能出现空值,需要使用fillna方法将其替换为空字符串
data = data.fillna('')
6、保存Excel文件,最后使用pd.to_excel方法将结果保存到新的Excel文件中,其中index=False表示不需要写入索引数据。
data.to_excel('C:\\Users\\Administrator\\Desktop\\example1.xls', index=False)
7、完整代码
from fuzzywuzzy import fuzz
import pandas as pd
from tqdm import tqdm
# 读取Excel文件
data = pd.read_excel('C:\\Users\\Administrator\\Desktop\\example.xls')
# 循环匹配ColA列和ColB列数据
match_scores = []
pros = []
# 使用tqdm库创建进度条
for a in tqdm(data['ColA']):
max_score = 0
max_pro = 0
max_match = ""
for b in data['ColB']:
score = fuzz.token_set_ratio(a, b)
if score > max_score:
max_score = score
max_match = b
# 将匹配度最高的结果加入列表中
match_scores.append(max_match)
pros.append(max_score)
# 在DataFrame中增加两列
data['MatchScore'] = match_scores
data['pro'] = pros
# 将空值替换为空字符串
data = data.fillna('')
# 保存结果到Excel文件
data.to_excel('C:\\Users\\Administrator\\Desktop\\example2.xls', index=False)
注:此方法并不适用所有类型数据,数据匹配正确率上来看,准确率在70%-80之间,此代码中未考虑字符连续的匹配率。错误数据如下:
ColA | ColB | MatchScore | pro |
---|---|---|---|
110kV乌兰花变电站 | 110kV乌兰花变 | 110kV乌兰镇变电站 | 91 |
正常来说,110kV乌兰花变电站
匹配的应该是110kV乌兰花变
,但在这里匹配的是110kV乌兰镇变电站
,匹配度还为91
。
大家有什么好的建议可以多多指教