介绍
SciTSR是一个大型的表格结构识别数据集,包含15000张PDF格式的表格和他们对应的来自LaTeX源文件的结构标签。
项目的来源见GitHub链接,里面有数据集的下载链接。
数据集共有15000张图片,被拆分成12000张训练集和3000张测试集。也提供了只包含复杂表格的测试集,叫SciTSR-COMP。SciTSR-COMP的索引被存储在SciTSR-COMP.list中。
SciTSR数据集的统计如下:
Train | Test | |
---|---|---|
# Tables | 12,000 | 3,000 |
# Complicated tables | 2,885 | 716 |
格式和样例
文件夹的树形结构如下:
SciTSR
├── SciTSR-COMP.list
├── test
│ ├── chunk
│ ├── img
│ ├── pdf
│ └── structure
└── train
├── chunk
├── img
├── pdf
├── rel
└── structure
输入的PDF文件保存在pdf文件夹中,结构标签保存在structure文件夹中。
为了方便起见,我们提供了图片格式的输入,保存在img文件夹下面,它是利用pdfcairo
从PDF文件转化过来的。
我们也提供了抽取好的块,保存在了chunk文件夹中,使用Tabby做的预处理。
对于训练数据,我们提供了为我们的GraphTSR模型构造好的关系标签,这是匹配chucks和结构文本标签生成的。
注意的是,我们的预处理chunk和关系数据可能包含噪声,原始输入文件是PDF格式的。
文本块
文件:chunk/[ID].chunk
pos数组包含chunk中x1
, x2
, y1
和y2
坐标(对应PDF)。
{"chunks": [
{
"pos": [
147.96600341796875,
205.49998474121094,
475.7929992675781,
480.4206237792969
],
"text": "Probability"
},
{
"pos": [
217.45510864257812,
290.6802673339844,
475.7929992675781,
480.4206237792969
],
"text": "Generated Text"
},
...
]}
关系
文件:rel/[ID].rel
一行 CHUNK_ID_1 CHUNK_ID_2 RELATION_ID:NUM_BLANK
代表CHUNK_ID_1的chunk和CHUNK_ID_2的chunk的关系是RELATION_ID,在他们中间有一个NUM_BLANK的空白单元格。对RELATION_ID, 1和2分别代表水平和竖直方向。
0 1 1:0
1 2 1:0
0 9 2:0
...
结构标签
文件:structure/[ID].json
表格的存储是一个单元格列表。对于每一个单元格,我们提供它原始的tex代码,内容(用空格切分)和表格中的位置(start/end row/column number, started from 0)。
{"cells": [
{
"id": 21,
"tex": "959",
"content": [
"959"
],
"start_row": 5,
"end_row": 5,
"start_col": 1,
"end_col": 1
},
{
"id": 1,
"tex": "Training set",
"content": [
"Training",
"set"
],
"start_row": 0,
"end_row": 0,
"start_col": 1,
"end_col": 1
},
...
]}
在实际使用的时候,如果是做表格识别的话,那么使用pdf, chunk, structure这三个文件夹下的数据就够了。
做法是从pdf中抽取图片,从chunk中读取文本框坐标和内容信息,从structure中找出文本框在表格中对应的位置信息,有这些信息应该就可以组成表格检测数据集了。
注:
- SciTSR数据集里的img文件夹中的图片跟chunk中文本框的坐标是对应不上的,chunk中的坐标是跟pdf文件默认尺寸相关的。因此可以使用PyPDF2.PdfFileReader类来获取pdf尺寸,然后使用这个尺寸来读取pdf。
pdf = PdfFileReader(open(pdf_filepath, 'rb')) pdf_size = pdf.getPage(0).mediaBox pdf_size = [int(round(ele)) for ele in pdf_size] pdf = convert_from_path(pdf_filepath, size=(pdf_size[2], pdf_size[3])) image = np.array(pdf[0], dtype=np.uint8)
- chunk中的文本框索引跟structure中的id可能会不一致,也就是可能存在chunk中的文本框数量跟structure中cell数量不同,我这里使用的方式是去除数量不一致的文件。根据文本内容应该也可以对应,我没有尝试。