python - 比较数千个文本文件内容的更有效方法
问题描述
我有大约 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)
我知道由于递归性质,目前这将在流程结束时陷入无限循环,但我离那座桥还很远。
解决方案
至少不需要这条递归线。Find_Similar_Text(text_files, count) ,制作 itertools.combinations(text_files, 2): 一个变量并更新它并使用 for 循环。
推荐阅读
- javascript - 在 Promise.all() 中编写多个地图函数
- java - 非空局部变量
- python - 搜索两个 3 列 numpy 数组并在 Python 中找到符合条件的位置
- python - 使用其中的一些元素从另一个数组创建一个数组,将其他元素填充为零
- python - 将每 3 行作为一个元素并将其存储在一个元组中?
- list - 如何使用 OCaml 将两个列表中的每个单独元素压缩到一个列表中
- r - 如何根据 R 中的列中的值有条件地执行许多 Mann-Whitney 检验?
- dataset - Wolfram:关联的转置图
- flutter - 为什么 SearchDelegate buildSuggetions 不允许我使用有状态小部件?
- c# - 如何将整数值从 SQL Server 数据库提取到 C# 组合框?