信息抽取:利用ERNIE-Layout进行跨模态信息抽取
更新时间:2022-12-17
跨模态通用文档信息抽取任务简介
- 跨模态通用文档信息抽取任务融合文本、图像、布局等信息进行联合建模,常用的场景包括:针对带布局数据(文档、图片等)的信息抽取等任务。
ERNIE预训练模型选择
- 文心提供的ERNIE预训练模型的参数文件和配置文件在 wenxin_appzoo/wenxin_appzoo/models_hub目录下,使用对应的sh脚本,即可拉取对应的模型、字典、必要环境等文件。目前支持跨模态检索任务的预训练模型为:
模型名称 | 下载脚本 | 备注 |
---|---|---|
ERNIE-Layout | sh download_ernie_layout_1.0_base_ch.sh | 参数、字典与ernie的配置文件存放于ernie_layout_1.0_base_ch_dir目录 |
cd wenxin_appzoo/wenxin_appzoo/models_hub
sh download_ernie_layout_1.0_base_ch.sh
进入指定目录
cd /wenxin_appzoo/wenxin_appzoo/tasks/sequence_labeling
代码结构
- 位于/wenxin_appzoo/wenxin_appzoo/tasks/sequence_labeling
├── data # 示例数据目录
│ └── download_ernie_layout_data.sh
├── data_set_reader
│ └── ernie_layout_seqlabel_dataset_reader.py
├── examples # 配置文件目录
│ ├── seqlab_ernie_layout_ch_infer.json
│ └── seqlab_ernie_layout_ch.json
├── inference # 推理相关代码
│ ├── custom_ernie_layout_inference.py
│ ├── custom_inference.py
│ └── __init__.py
├── model # 模型文件目录
│ ├── ernie_layout_sequence_label.py
│ └── __init__.py
├── run_infer.py # 预测入口文件
├── run_trainer.py # 训练入口文件
└── trainer
├── custom_dynamic_trainer.py
├── custom_trainer_ernie3.py
├── custom_trainer.py
└── __init__.py
数据准备
- 我们建议的标注工具:PPOCRLabelv2
-
跨模态通用文档信息抽取任务示例数据可由./data目录下对应的脚本进行下载:
cd ./data sh download_ernie_layout_data.sh
-
文档转换成图像,图像使用OCR工具进行数据解析,解析后生成如下所示的json格式文件,模型输入数据为此json文件
{ "id": 数据id, "tokens": OCR识别返回的词列表, "bboxes": OCR识别返回的token box位置,包括左上和右下坐标,由四个数字组成,bboxes长度需要与tokens一致, "segment_bboxes": OCR识别返回的segment box位置,比token box粒度更大,包括左上、右下坐标,由四个数字组成,长度需要与tokens一致,bboxes和segmetn_bboxes二者有一个就可以,可以通过use_segment_box选项来控制使用哪个, "segment_ids": 每个token属于哪一个segment,是一个数字,长度需要与tokens一致,可选,通过use_segments控制, "labels": 每个token的label,长度需要与tokens一致,若label可以是字符串,如O、B-ANSWER、I-ANSWER等,需配置label_vocab来解析label,也可直接为id。 "image": 文档图像经过base64编码之后的字符串, "w": 图像的宽, "h": 图像的高 }
-
图像base64编码示例代码:
import cv2 import numpy as np import base64 def image_file_to_str(filename): img = cv2.imread(filename) img_encode = cv2.imencode(".jpg", img)[1] data_encode = np.array(img_encode) str_encode = data_encode.tostring() return base64.b64encode(str_encode)
-
开始训练
- 进入指定任务的目录,跨模型检索任务的目录为wenxin_appzoo/wenxin_appzoo/tasks/sequence_labeling, 运行
cd wenxin_appzoo/wenxin_appzoo/tasks/sequence_labeling
python run_trainer.py --param_path ./examples/seqlab_ernie_layout_ch.json
- 通过上述脚本调用json文件开启训练。
- 训练运行的日志会自动保存在./log/test.log文件中。
- 训练模型保存于./output/seqlab_ernie_layout_1.0_base_fc_ch文件夹下。
开始预测
使用run_infer.py入口脚本,传入预测配置文件(./examples/seqlab_ernie_layout_ch_infer.json)进行预测:
python run_infer.py --param_path ./examples/seqlab_ernie_layout_ch_infer.json
- 预测运行的日志会自动保存在./output/predict_reuslt.txt文件中
- predict_reuslt.txt说明:
- 例如信息抽取,抽取的信息是“标题、问题、答案”信息,如下所示为标签词表,标签词表是一个json字符串,key是标签值,value是标签对应id:
{
"O": 0,
"B-HEADER": 1,
"I-HEADER": 2,
"B-QUESTION": 3,
"I-QUESTION": 4,
"B-ANSWER": 5,
"I-ANSWER": 6
}
- 根据标签词表进行数据的信息抽取结果predict_reuslt.txt如下:
[0, 3, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0,......] ['[CLS]', '今', '天', '的', '饭', '好', '吃', '吗', '?','好','吃','。','外','籍','人','员','人','数','。',...... ]
- “今”用3标定,是问题的头,“天的饭好吃吗?”是问题的中部,都用4标定。所以得到“今天的饭好吃吗?”是问题,
- “好”用5标定,是答案的头,“吃。”是答案的中部,都用6标定。所以“好吃。”是答案,其余不相关的都用0标定。