【问题标题】:Compare 2 .csv files with some calculation very slow比较 2 个 .csv 文件,计算速度非常慢
【发布时间】:2017-09-20 12:58:13
【问题描述】:

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

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

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

例如:

文件 A(新数据):

垃圾邮件

文件B(参考书):

小节 1 0

垃圾邮件 2 1

跨度 3 0

嘘 1 0

Fooo 2 2

博 3 3

...

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

垃圾邮件和垃圾邮件

呸呸呸

现在我的代码是:

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)

其中distance是计算Levensthein距离的函数。

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

【问题讨论】:

  • 我认为问题不在 Levenshtein 算法中。它工作正常且正确。我检查了小数据,例如每个表 100 行。脚本工作大约 3 秒
  • 如果您手头有多个 cpu/核心,使用 concurrent.futures 模块的多个进程可以加快速度。该模块有一个用于 Python 2.7 的反向移植。
  • @VasilyBronsky:我不是说它错了,我是说它很慢。您是否已经在使用以 C 或 C++ 实现的第 3 方 Levenshtein 包?如果没有,那是提高速度的一种方法。另请查看thisthisthis
  • 我特别喜欢this answer。如果您已经尝试了所有与 Levenshtein 相关的东西,但仍然不够快,您可能不得不求助于其他比较方法,例如 this。也许按原样使用就足够了;如果不是,也许它可以用作一种“第一次通过”过滤器来从参考中获取最有可能的候选者,然后在较小的集合上使用 Levenshtein。

标签: python python-2.7 similarity levenshtein-distance


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。我们在两个文件中都没有重复的行。
    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2017-08-11
    • 2016-05-21
    相关资源
    最近更新 更多