【发布时间】: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 的反向移植。 -
我特别喜欢this answer。如果您已经尝试了所有与 Levenshtein 相关的东西,但仍然不够快,您可能不得不求助于其他比较方法,例如 this。也许按原样使用就足够了;如果不是,也许它可以用作一种“第一次通过”过滤器来从参考中获取最有可能的候选者,然后在较小的集合上使用 Levenshtein。
标签: python python-2.7 similarity levenshtein-distance