比较数千个文本文件内容的更有效方法

时间:2019-06-13 09:28:39

标签: python string-comparison levenshtein-distance

我大约有10,000个文本文件,其中很多具有​​非常相似的内容。我试图摆脱彼此非常相似的文件,以便给我留下一个更小更独特的文件集。仅供参考,文本文件的内容可以长达几页。

我正在尝试通过测量内容的字符串之间的距离来解决这一问题。我尝试了一些减少比较次数的方法,例如仅对相似大小和相似文本长度的文件进行比较,以便快速获得收益。

text_files = {}
for item in os.listdir(text_directory):
    text_files.update({item : os.path.getsize(text_directory+item)})

count = 0

def Find_Similar_Text(text_files, count):
    count = count
    tic = time.process_time()
    for a, b in itertools.combinations(text_files, 2):
        if text_files[a] - 50 < text_files[b] < text_files[a] + 50:
            file1 = open(text_directory + a, 'rb')
            file1_data = file1.read()
            file1.close()

            file2 = open(text_directory + b, 'rb')
            file2_data = file2.read()
            file2.close()
            if (-100 < len(file1_data) - len(file2_data) < 100):
                ratio = fuzz.ratio(file1_data, file2_data)
                if ratio > 70:
                    count+=1
                    print(count, 'Ratio:', ratio, a, text_files[a], 'kb', b, text_files[b], 'kb')
                    shutil.move(text_directory + a, text_directory + '//SimilarFiles//')
                    text_files.pop(a)
                    toc = time.process_time()
                    print('Elapsed time:', toc - tic)
                    Find_Similar_Text(text_files, count)

Find_Similar_Text(text_files, count)

我知道由于递归的性质,当前在过程结束时会陷入无尽的循环,但是距离实现这一目标还差得很远。

1 个答案:

答案 0 :(得分:0)

至少不需要此递归行。 Find_Similar_Text(text_files,count),使其为itertools.combinations(text_files,2):一个变量,并对其进行更新并用于循环。