python Fuzzywuzzy匹配笛卡尔联接优化

时间:2018-07-18 15:11:38

标签: python cartesian fuzzywuzzy

我有2个数据集(使用pandas数据框导入),其中包含多个字符串字段,这些字符串字段需要在各个字段上进行模糊匹配。需要所有符合模糊匹配条件的匹配,而不仅仅是找到的第一个匹配或最佳匹配,因此正在创建笛卡尔。下面的代码可以很好地进行比较(每次记录连接大约需要0.07秒),但是在将一个文件中的200k +记录与第二个文件中的150万条记录进行比较时,如果存在多个“或”条件,则按比例放大是一个问题。模糊匹配。我会很感激任何关于如何改进此代码的聪明主意(仅供参考:此过程目前必须使用python编码)。我目前正在将文件1分成多个块,以避免内存问题。

import pandas as pd
from fuzzywuzzy import fuzz 

File_1a = '//some_path/File1.csv'
File_2b = '//some_path/File2.csv'


read_file1 = pd.read_csv(File_1a, encoding = 'latin-1') 
FILE1 = read_file1[['a','b', 'c', 'd','e','f' ,'g','h','i','j']]  #all string fields - row count= 200k +

read_file2 = pd.read_csv(File_1b, encoding = 'latin-1' )
FILE2 = read_file2[['a','b', 'c', 'd','e','f' ,'g','h','i','j']] #all string fields - row count= 1.5M +

chunkSize= 5000

for i in range(0, len(FILE1), chunkSize):
    FILE1_chunk = FILE1[i:i+chunkSize]
    for x,y in [ (x,y) for x in FILE1_chunk.itertuples(index=True) for y in FILE2.itertuples(index=True) ]:
        if fuzz.ratio(x[1],y[1]) > 90 or fuzz.ratio(x[8],y[8]) > 90 or fuzz.ratio(x[9],y[9]) > 90 or fuzz.ratio(x[10],y[10]) > 90 or ( fuzz.ratio(x[3],y[3]) == 100 and fuzz.token_sort_ratio(x[4],y[4])> 75 and fuzz.token_sort_ratio(x[6],y[6]) > 75 ):
            print(x,y) #print or output to another process...

0 个答案:

没有答案