Python:比较csv中的行,并将相同的结果组合在一起,以进行pdf布局比较



我正在尝试找到一种方法来比较不同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

它们适用于具有相同组合的"左","顶部"和"文本"文件的所有组合。

这有帮助吗?

最新更新