我有一个用户输入的汽车名称数据框,我需要将其与另一个汽车名称数据库(数百万条记录)进行匹配并提取唯一标识符。在使用 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']})
我已经清理了数据(条字符、空格、小写字母、停用词等),因此应该删除任何直接匹配项(例如aston martin:Aston Martin),其余记录应该有差异(额外的词,缩写等)这就是为什么我需要进行模糊匹配的原因。
使用 this tutorial 我能够重新创建提供成功结果的代码
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 |
西装雪佛兰 | 开拓者雪佛兰 | 104 |
西装雪佛兰 | 开拓者雪佛兰 | 104 |
Blazer Chevroletys3 | 开拓者雪佛兰 | 104 |
铃木维特拉销售 | 铃木维特拉 | 100 |
铃木维塔销售 | ||
沃克斯豪尔雅特 | 沃克斯豪尔雅特X | 105 |
福特航空之星 | 福特航空之星 | 107 |
甲虫 | 大众甲壳虫 | 109 |
这适用于这么小的样本。问题是,实际上我必须将 15 万条记录与 800 万条记录的数据库进行匹配,所以甚至试图将一条记录与 800 万条记录进行匹配。数据库需要很长时间。进行这种模糊匹配的最佳方法是什么? 提前谢谢你。