提问人:RoyalPotatoe 提问时间:3/8/2023 最后编辑:RoyalPotatoe 更新时间:3/8/2023 访问量:404
如何大规模应用实体名称匹配 (rapidfuzz)
How to apply entity name matching (rapidfuzz) at scale
问:
我有一个用户输入的汽车名称数据帧,我需要将其与另一个汽车名称数据库(数百万条记录)进行匹配并提取唯一标识符。在使用 rapidfuzz 时改进这种匹配的最佳方法是什么?
#Libraries
import pandas as pd
from rapidfuzz import fuzz, process, utils as fuzz_utils
#Data sample
df = pd.DataFrame({'strings_variable':['Avalon Toyota loan', 'Blazer Chevrolet', 'Blazer Chevrolety', 'Blazer Chevroletys', 'Blazer Chevroletys3', 'Suzuki Vitara sales', 'Suzuki Vita sales', 'Vauxhall Astra', 'Buick Special car', 'Ford Aerostar','beetle','aston martin']})
df2 = pd.DataFrame({'strings_variable2': ['Suzuki Vitara','Avalon Toyota loan co','some car','random car', 'Blazer Chevrolet', 'Vauxhall Astra X', 'Buick Special car', 'Ford Aerostar','Aston Martin Valkyrie','Volkswagen Beetle','GMC Syclone'],
'unique_id': ['100','101','102','103','104','105','106','107','108','109','110']})
我已经清理了数据(条形字符、空格、小写、停用词等),因此任何直接匹配(例如阿斯顿马丁:阿斯顿马丁)都应该被删除,其余记录应该有差异(额外的单词、缩写等),这就是我需要进行模糊匹配的原因。
使用本教程,我能够重新创建此代码,从而提供成功的结果
df['Match'] = ''
for index, row in df.iterrows():
matches = []
for i, r in df2.iterrows():
score = fuzz.WRatio(row['strings_variable'], r['strings_variable2'])
if score >= 90:
matches.append(r['strings_variable2'])
matches.append(r['unique_id'])
df.at[index, 'Match'] = matches
df[['match','unique_id']] = pd.DataFrame(df.Match.to_list(), index= df.index)
df = df.drop(columns = ['Match'])
strings_variable | 火柴 | unique_id |
---|---|---|
阿瓦隆丰田贷款 | 阿瓦隆丰田贷款公司 | 101 |
西装外套雪佛兰 | 西装外套雪佛兰 | 104 |
Blazer 雪佛兰 | 西装外套雪佛兰 | 104 |
Blazer 雪佛兰 | 西装外套雪佛兰 | 104 |
西装外套雪佛兰3 | 西装外套雪佛兰 | 104 |
铃木 Vitara 销售 | 铃木维塔拉 | 100 |
铃木Vita销售 | ||
沃克斯豪尔·阿斯特拉 | 沃克斯豪尔 Astra X | 105 |
福特 Aerostar | 福特 Aerostar | 107 |
甲虫 | 大众甲壳虫 | 109 |
这适用于如此小的样本。问题在于,在现实中,我必须将 15 万条记录与 800 万条记录的数据库进行匹配,因此即使尝试将一条记录与 8 密耳进行匹配。数据库需要很长时间。进行这种模糊匹配的最佳方法是什么? 先谢谢你。
答: 暂无答案
评论