大量记录之间的模糊匹配

Fuzzy Match between large number of records

我有两个数据框。其中一个包含 33765 家公司。另一个包含 358839 家公司。我想使用模糊匹配找到两者之间的匹配。由于记录数太多,我尝试按照公司名称的第一个字母来分解两个数据框的记录。 例如:对于所有以字母 "A" 开头的公司,第一个数据框有 2600 条记录,第二个数据框有 25000 条记录。我在它们之间实施完全合并,然后应用模糊匹配来获得模糊值超过 95 的所有公司。 这仍然不起作用,因为记录数量仍然太多,无法在它们之间执行完全合并,然后实施模糊。每次我执行这些操作时内核都会死掉。当两个帧中的记录数都是 4 位数时,相同的方法工作正常。 另外,建议是否有一种方法可以为所有字母 'A' 到 'Z' 自动执行此操作,而不是手动 运行 每个字母的代码(不会使内核死机)。

这是我的代码:

c='A'
df1 = df1[df1.companyName.str[0] == c ].copy()
df2 = df2[df2.companyName.str[0] == c].copy()
df1['Join'] =1
df2['Join'] =1
df3 = pd.merge(df1,df2, left_on='Join',right_on='Join')
df3['Fuzz'] = df3.apply(lambda x: fuzz.ratio(x['companyName_x'], x['companyName_y']) , axis=1)
df3.sort_values(['companyName_x','Fuzz'],ascending=False, inplace=True)
df4 = df3.groupby('companyName_x',as_index=False).first()
df5=df4[df4.Fuzz>=95]

通过基于共享属性(第一个字母)对记录进行分块,您开始走上正确的道路。在记录链接文献中,这个概念被称为 blocking,它对于将比较次数减少到易于处理的事物至关重要。

前进的道路是找到更好的阻止规则:可能是前五个字符,或者是一个完整的单词。

dedupe library可以帮助您找到好的拦截规则。 (我是这个库的核心开发者)