我大约有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)
我知道由于递归的性质,当前在过程结束时会陷入无尽的循环,但是距离实现这一目标还差得很远。
答案 0 :(得分:0)
至少不需要此递归行。 Find_Similar_Text(text_files,count),使其为itertools.combinations(text_files,2):一个变量,并对其进行更新并用于循环。