资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

信息抽取:利用ERNIE-Layout进行跨模态信息抽取

跨模态通用文档信息抽取任务简介

  • 跨模态通用文档信息抽取任务融合文本、图像、布局等信息进行联合建模,常用的场景包括:针对带布局数据(文档、图片等)的信息抽取等任务。

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说明:
  1. 例如信息抽取,抽取的信息是“标题、问题、答案”信息,如下所示为标签词表,标签词表是一个json字符串,key是标签值,value是标签对应id:
{
    "O": 0,
    "B-HEADER": 1,
    "I-HEADER": 2,
    "B-QUESTION": 3,
    "I-QUESTION": 4,
    "B-ANSWER": 5,
    "I-ANSWER": 6
}
  1. 根据标签词表进行数据的信息抽取结果predict_reuslt.txt如下:
[0, 3, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0,......]   ['[CLS]', '今', '天', '的', '饭', '好', '吃', '吗', '?','好','吃','。','外''籍','人','员','人','数','。',...... ]
  1. “今”用3标定,是问题的头,“天的饭好吃吗?”是问题的中部,都用4标定。所以得到“今天的饭好吃吗?”是问题,
  2. “好”用5标定,是答案的头,“吃。”是答案的中部,都用6标定。所以“好吃。”是答案,其余不相关的都用0标定。
上一篇
信息抽取:一对一关系抽取
下一篇
信息抽取:多对多关系&实体属性抽取