У меня около 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)
Я знаю, что в настоящее время это будет бесконечный цикл в конце процесса из-за рекурсивного характера, но я все еще довольно далек от достижения этого моста.