将2 .csv文件与某些计算进行比较非常慢

时间:2017-09-20 12:58:13

标签: python python-2.7 similarity levenshtein-distance

我有2个.csv文件。其中一个有新数据的行有大约100行,另一个有大约4万行的参考书。

我想将第一个文件中的所有字符串(逐个)与第二个文件中的所有字符串进行比较,并将Levenshtein距离计算为最相似的字符串。

之后,我需要创建一个包含结果的第三个文件。 (包含第一个文件中的所有数据,最大Levenshtein距离和第二个文件中的字符串)

例如:

文件A(新数据):

  

垃圾邮件

     

文件B(参考书):

  

Bar 1 0

     

Spamm 2 1

     

Spann 3 0

     

Booo 1 0

     

Fooo 2 2

     

Bo 3 3

     

...

我需要什么(结果文件),其中n = Levenshtein距离:

  

Spam n Spamm

     

Foo n Fooo

现在我的代码是:

def calculate_Leven(source, ref, result_file):
    with open(source, 'r') as input1:
        with open(ref, 'r') as input2:
            with open(result_file, 'w') as csvoutput:
                reader1 = csv.reader(input1)
                reader2 = list(csv.reader(input2))
                writer = csv.writer(csvoutput)
                result = []
                headers = next(reader1)
                result.append(headers)
                for row1 in reader1:
                    print "First row"
                    max = 0
                    while max < 1
                        for row2 in reader2:
                            a = distance(row1[0],row2[0])
                            b = 1 - a/len(row1[0])
                            if b > max:
                                max = b
                                SKU = row2[0]
                    row1.append(max)
                    row1.append(SKU)
                    result.append(row1)
                writer.writerows(result)

距离是计算Levensthein距离的函数。

此代码有效但速度极慢。有没有更好的方法来构建它,或者更有效的替代路径?我每天有大约100个新文件来检查参考书,所以低速是一个瓶颈。

2 个答案:

答案 0 :(得分:0)

与您的算法无关,但如果您每天运行100个文件且参考文件不会更改,则创建使用所有已计算值索引的主文件(或数据库)可能很有用。如果文件很大且存在大量冗余数据,这可能会显着提高您的性能。

答案 1 :(得分:0)

如果你有可能在其中一个文件中有重复的条目,你可以在处理之前对它们进行排序