首页 > 解决方案 > 比较数千个文本文件内容的更有效方法

问题描述

我有大约 10,000 个文本文件,其中很多都有非常相似的内容。我正在尝试删除彼此非常相似的文件,以便留下一个更小、更独特的文件集。仅供参考,文本文件的内容可能长达几页。

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

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)

我知道由于递归性质,目前这将在流程结束时陷入无限循环,但我离那座桥还很远。

标签: pythonstring-comparisonlevenshtein-distance

解决方案


至少不需要这条递归线。Find_Similar_Text(text_files, count) ,制作 itertools.combinations(text_files, 2): 一个变量并更新它并使用 for 循环。


推荐阅读