Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较2.csv文件和一些计算速度非常慢的文件_Python_Python 2.7_Similarity_Levenshtein Distance - Fatal编程技术网

Python 比较2.csv文件和一些计算速度非常慢的文件

Python 比较2.csv文件和一些计算速度非常慢的文件,python,python-2.7,similarity,levenshtein-distance,Python,Python 2.7,Similarity,Levenshtein Distance,我有2.csv文件。其中一本有新数据的书有约100行,另一本有约40k行的参考书 我想将第一个文件中的all字符串(逐个)与第二个文件中的all字符串进行比较,并计算到最相似字符串的Levenshtein距离 之后,我需要创建第三个带有结果的文件。(使用第一个文件中的所有数据、最大Levenshtein距离和第二个文件中的字符串) 例如: 文件A(新数据): 垃圾邮件 福 档案B(参考书): 酒吧10 Spamm 2 1 斯潘3 0 Booo 10 Fooo 2 Bo 3 3 我需要的(结果文

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

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

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

例如:

文件A(新数据): 垃圾邮件

档案B(参考书): 酒吧10

Spamm 2 1

斯潘3 0

Booo 10

Fooo 2

Bo 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)
def计算级别(源、参考、结果文件):
以开放源代码“r”作为输入1:
打开(参考“r”)作为输入2:
打开(结果文件“w”)作为csvoutput:
reader1=csv.reader(input1)
reader2=列表(csv.reader(input2))
writer=csv.writer(csvoutput)
结果=[]
headers=next(reader1)
result.append(标题)
对于reader1中的第1行:
打印“第一行”
最大值=0
而max<1
对于reader2中的第2行:
a=距离(第1行[0],第2行[0])
b=1-a/len(第1行[0])
如果b>最大值:
最大值=b
SKU=第2行[0]
行1.追加(最大值)
第1行追加(SKU)
result.append(第1行)
writer.writerows(结果)
其中,距离是一个用于计算距离内Levenside的函数


这段代码可以工作,但速度非常慢。是否有更好的方法来构建此结构,或者有更有效的替代路径?我每天要对照参考书检查大约100个新文件,因此低速是一个瓶颈。

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

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

相关:我认为问题不在Levenshtein算法中。它工作正常。我检查了小数据,例如每个表100行。脚本工作时间约为3秒。如果手头有多个cpu/内核,则使用
并发的多个进程。futures
模块可以加快速度。Python2.7有一个模块的后端口。@VasilyBronsky:我不是说它错了,我是说它太慢了。您是否已经使用了C或C++实现的第三方LevsHeTin包?如果不是,这是提高速度的一种方法。还有退房,还有。我特别喜欢。如果你已经尝试了所有与Levenshtein相关的方法,但速度仍然不够快,那么你可能不得不求助于其他比较方法,例如。也许这样就可以按原样使用了;如果不是,也许它足够好,可以作为一种“第一次通过”过滤器,从参考文献中获得最有可能的候选人,然后在较小的集合中使用Levenshtein。谢谢你的回答。这两个文件中没有重复的行。