我正在尝试找到一种方法来比较不同pdf文件的布局。使用tesseract,我能够将特定关键字的以下数据导出到CSV文件。
考虑这个生成的csv文件,其中包含以下内容,显示每个关键字的左侧和顶部坐标,以及关键字和文件名:
Left,Top,Text,File
118,174,INVOICE,file0
117,333,INVOICE,file0
119,525,BILLED,file0
119,1554,INVOICE,file0
322,1880,invoice,file0
118,174,INVOICE,file1
117,333,INVOICE,file1
119,525,BILLED,file1
119,1554,INVOICE,file1
322,1880,invoice,file1
1112,185,Invoice,file2
113,219,Invoice,file2
1112,212,Invoice,file3
113,219,Invoice,file3
113,217,Invoice,file3
118,174,INVOICE,file4
117,333,INVOICE,file4
119,525,BILLED,file4
119,1554,INVOICE,file4
322,1884,invoice,file4
我最初的想法是连接前 3 列并将它们与其他行进行比较。我能够获得与每个关键字匹配的文件。但是例如,我无法获得哪些文件的整体匹配布局超过80%。
这是我到目前为止的代码:
import pandas as pd
import itertools
循环访问csv以获取关键字的位置和文本
with open('data.csv') as file:
results = []
file_names = []
for row in file:
columns = row.split(',')
data = columns[0] + columns[1] + columns[2]
file_name = columns[3].rstrip()
results = results + [data]
file_names.append(file_name)
获取和打印匹配项的索引
indices = []
for a, b in itertools.combinations(results, 2):
if a == b:
indices = indices + [[i -1 for i, x in enumerate(results) if x == a]]
print("Indices: ", indices)
打印:
Indices: [[0, 5, 15], [0, 5, 15], [1, 6, 16], [1, 6, 16], [2, 7, 17], [2, 7, 17], [3, 8, 18], [3, 8, 18], [4, 9], [0, 5, 15], [1, 6, 16], [2, 7, 17], [3, 8, 18], [11, 13]]
获取和打印具有匹配项的文件名
dataset = pd.read_csv('data.csv', sep=',')
identical_files = []
for indice in indices:
file_matches = []
for i in indice:
file_matches.append(dataset.iloc[i, -1])
identical_files.append(file_matches)
print("Identical files: ", identical_files)
打印:
Identical files: [['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file0', 'file1', 'file4'], ['file2', 'file3']]
因此,我能够打印相同的文件,但是,经过多次尝试,我正在努力找出逻辑来识别哪些文件具有相同的布局,因此应该组合在一起。
根据此数据,输出应如下所示:
[
[file0, file1, file4],
[file2, file3]
]
我仍然是Python的新手,所以我希望我已经把自己说清楚了。
我不确定这是否正是您所需要的,但请尝试以下操作:
res = (df.groupby(by=['Left', 'Top', 'Text'])
.agg(files = pd.NamedAgg(column="File", aggfunc=', '.join)))
print(res)
这会给我
files
Left Top Text
1112 185 Invoice file2
212 Invoice file3
113 217 Invoice file3
219 Invoice file2, file3
117 333 INVOICE file0, file1, file4
118 174 INVOICE file0, file1, file4
119 1554 INVOICE file0, file1, file4
525 BILLED file0, file1, file4
322 1880 invoice file0, file1
1884 invoice file4
它们适用于具有相同组合的"左","顶部"和"文本"文件的所有组合。
这有帮助吗?