我正在尝试在 python 中使用模糊 wuzzy 进行字符串匹配并带来匹配 id。我的数据集很大,dataset1 = 180 万条记录,dataset2 = 160 万条记录。
到目前为止我尝试过的,
首先我尝试record linkage
在python中使用包,不幸的是它在构建时内存不足multi index
,所以我以良好的机器能力转移到AWS并成功构建它,但是当我尝试对其进行比较时,它永远运行,我同意其由于比较的数量。
然后,我尝试fuzzy wuzzy
使用包进行字符串匹配并并行化该过程dask
。并在样本数据上执行它。它工作正常,但我知道这个过程仍然需要时间,因为搜索空间很宽。我正在寻找一种在这段代码上添加阻塞或索引的方法。
test = pd.DataFrame({'Address1':['123 Cheese Way','234 Cookie Place','345 Pizza Drive','456 Pretzel Junction'],'city':['X','U','X','U']})
test2 = pd.DataFrame({'Address1':['123 chese wy','234 kookie Pl','345 Pizzza DR','456 Pretzel Junktion'],'city':['X','U','Z','Y'] , 'ID' : ['1','3','4','8']})
在这里,我正在尝试寻找test.Address1
并test2.Address1
带来它的ID
.
def fuzzy_score(str1, str2):
return fuzz.token_set_ratio(str1, str2)
def helper(orig_string, slave_df):
slave_df['score'] = slave_df.Address1.apply(lambda x: fuzzy_score(x,orig_string))
#return my_value corresponding to the highest score
return slave_df.ix[slave_df.score.idxmax(),'ID']
dmaster = dd.from_pandas(test, npartitions=24)
dmaster = dmaster.assign(ID_there=dmaster.Address1.apply(lambda x: helper(x, test2)))
dmaster.compute(get=dask.multiprocessing.get)
这很好用,但是我不确定如何通过限制同一城市的搜索空间来对其应用索引。
可以说,我正在根据原始字符串的城市在城市字段和子集上创建一个索引,并将该城市传递给辅助函数,
# sort the dataframe
test2.sort_values(by=['city'], inplace=True)
# set the index to be this and don't drop
test2.set_index(keys=['city'], drop=False,inplace=True)
我不知道该怎么做?请指教。提前致谢。