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

How to apply entity name matching (rapidfuzz) at scale

提问人:RoyalPotatoe 提问时间:3/8/2023 最后编辑:RoyalPotatoe 更新时间:3/8/2023 访问量:404

问:

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

python string match 字符串匹配 fuzzywuzzy

评论

0赞 Oli 3/11/2023
您是否研究过本地敏感哈希?它可以用作将字符串映射到哈希值的函数,其中相似的字符串映射到相同的哈希值。另外,这个问题 stackoverflow.com/questions/21408760/......有关吗?

答: 暂无答案