如何大规模应用实体名称匹配(rapidfuzz)

问题描述 投票:0回答:0

我有一个用户输入的汽车名称数据框,我需要将其与另一个汽车名称数据库(数百万条记录)进行匹配并提取唯一标识符。在使用 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 martinAston 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 万条记录进行匹配。数据库需要很长时间。进行这种模糊匹配的最佳方法是什么? 提前谢谢你。

python match string-matching fuzzywuzzy rapidfuzz
© www.soinside.com 2019 - 2024. All rights reserved.