【发布时间】:2016-07-19 16:56:26
【问题描述】:
我正在尝试将大约 600,000 个个人姓名(全名)与另一个拥有超过 8700 万个观察结果的数据库(全名)进行匹配!
我第一次尝试 fuzzywuzzy 库太慢了,所以我决定使用速度更快的模块 fuzzyset。假设我有一台功能强大的计算机可以将所有数据集加载到内存中,我将使用包含 964 个观测值的测试文件与 50,000 个观测值进行匹配来执行以下操作:
import time
from cfuzzyset import cFuzzySet as FuzzySet
df1=pd.read_csv(file1,delimiter='|') # test file with 964 observations
df2=pd.read_csv(file2,delimiter='|') # test file with 50,000 observations to be matched against
a=FuzzySet() # allocate the FuzzySet object
for row in file2['name']:
a.add(str(row)) # Fill the FuzzySet object with all names from file2
start_time = time.time() # Start recording the time
dicto={'index':[],'name':[]} # Dictionary where I store the output
for names in file1['f_ofulln']:
dicto['index'].append(a.get(names)[0][0])
dicto['name'].append(a.get(names)[0][1])
print("--- %s seconds ---" % (time.time() - start_time))
>>> --- 39.68284249305725 seconds ---
使用更小的数据集(964 个观测值与 50,000 个观测值匹配),时间为 39 秒。
但是,如果我想在整个数据集上执行此方法,这太慢了。
有人知道如何提高运行时间吗?我认为 Cython 是不可能的,因为我已经在导入 Cython 版本的 fuzzyset 模块
非常感谢,
阿德里安
【问题讨论】:
-
这个问题比看起来要困难得多。在执行匹配之前,您可能必须先阻止(或聚类)87M 数据。我不建议查找 600k 名称与数据库中每个名称之间的所有距离。 Python 库
dedupe有一些阻塞技术的实现。但是,我不确定它是否会扩展到您拥有的数据集。另一种可能性是在执行模糊匹配之前在两个集合中删除重复名称。 (对不起我含糊的回答......) -
感谢titpat,我一定会尽可能减少要合并的数据集的大小。我还修改了这个问题,因为我发现fuzzyset 模块要快得多。最后,我找到了将整个数据帧存储在内存中的资源。但即便如此,最终运行时间仍以周计算!
标签: python performance string-matching fuzzywuzzy