Более эффективный способ сравнения содержимого тысяч текстовых файлов - PullRequest
0 голосов
/ 13 июня 2019

У меня около 10000 текстовых файлов, и довольно много из них имеют очень похожий контент. Я пытаюсь избавиться от файлов, которые очень похожи друг на друга, чтобы у меня остался меньший и более уникальный набор. Просто для справки содержание текстовых файлов может составлять несколько страниц.

Я пытаюсь решить эту проблему путем измерения расстояния строк содержимого через их расстояние Левенштейна. Я пробовал несколько способов уменьшить количество сравнений, например, проводить только сравнения файлов одинакового размера и одинаковой длины текста, чтобы получить быстрый выигрыш.

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 голосов
/ 13 июня 2019

эта рекурсивная линия не нужна, по крайней мере.Find_S Similar_Text (text_files, count), make itertools.combination (text_files, 2): переменная, обновите ее и используйте для цикла.

...