乐趣区

关于人工智能:快递单信息抽取三五条标注数据提高准确率仅需五条标注样本快速完成快递单信息任务

相干文章:

本我的项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/4160432?contributionType=1

五条标注数据搞定快递单信息抽取

本我的项目将演示如何通过五条标注样本进行模型微调,疾速且精确抽取快递单中的姓名、电话、省、市、区、具体地址等内容,造成结构化信息。辅助物流行业从业者进行无效信息的提取,从而升高客户填单的老本。

1. 工作介绍

如何从物流信息中抽取想要的要害信息呢?咱们首先要定义好须要抽取哪些字段。

比方当初拿到一个快递单,能够作为咱们的模型输出,例如“张三 18625584663 广东省深圳市南山区学府路东百度国内大厦”,那么序列标注模型的目标就是辨认出其中的“张三”为人名,“18625584663”为电话名,“广东省深圳市南山区百度国内大厦”别离是『省、市、区、街道』4 级地址)。

这是一个典型的命名实体辨认(Named Entity Recognition,NER)场景,各实体类型及相应符号示意见下表:

抽取实体 / 字段 抽取后果
姓名 张三
电话 15209XX1921
省份 广东省
城市 深圳市
县区 南山区
具体地址 百度国内大厦

2. 方案设计

2.1 UIE 基于 Prompt 对立建模

Universal Information Extraction (UIE):Yaojie Lu 等人提出了凋谢域信息抽取的对立框架,这一框架在实体抽取、关系抽取、事件抽取、情感剖析等工作上都有着良好的泛化成果。

PaddleNLP 基于这篇工作的 prompt 设计思维,提供了以 ERNIE 为底座的信息抽取模型,用于要害信息抽取。同时,针对不同场景,反对通过结构小样本数据来优化模型成果,疾速适配特定的要害信息配置。

<img src=”https://user-images.githubusercontent.com/40840292/167236006-66ed845d-21b8-4647-908b-e1c6e7613eb1.png” width=”1000″ height=”500″ />

2.2 UIE 的劣势

  • 应用简略 :用户能够应用自然语言自定义抽取指标,无需训练即可对立抽取输出文本中的对应信息。 实现开箱即用,并满足各类信息抽取需要
  • 降本增效 :以往的信息抽取技术须要大量标注数据能力保障信息抽取的成果,为了进步开发过程中的开发效率,缩小不必要的反复工作工夫,凋谢域信息抽取能够实现零样本(zero-shot)或者少样本(few-shot)抽取, 大幅度降低标注数据依赖,在降低成本的同时,还晋升了成果
  • 成果当先:凋谢域信息抽取在多种场景,多种工作上,均有不俗的体现。

    2.3 利用场景示例

  • 医疗场景 - 专病结构化
  • 金融场景 - 支出证实、招股书抽取

3. 环境筹备

! pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple
! pip show paddlenlp

4. 开箱即用

from paddlenlp import Taskflow

schema = ["姓名", "省份", "城市", "县区"]
ie = Taskflow("information_extraction", schema=schema)
ie("北京市海淀区上地十街 10 号 18888888888 张三")
[{'姓名': [{'text': '张三',
    'start': 24,
    'end': 26,
    'probability': 0.9659838994810457}],
  '城市': [{'text': '北京市',
    'start': 0,
    'end': 3,
    'probability': 0.9992708589150467}],
  '县区': [{'text': '海淀区',
    'start': 3,
    'end': 6,
    'probability': 0.9997972338090335}]}]
  • Taskflow UIE 更多应用形式解锁:Taskflow UIE 应用文档

    5. 轻定制性能

对于『电话』、『具体地址』这些非通用性实体类型标签,举荐应用 PaddleNLP 提供的轻定制性能(数据标注 训练 部署 全流程工具)。

咱们标注 5 条数据试试成果。

5.1 数据标注

咱们举荐应用数据标注平台 doccano 进行数据标注,本案例也买通了从标注到训练的通道,即 doccano 导出数据后可通过 doccano.py 脚本轻松将数据转换为输出模型时须要的模式,实现无缝连接。为达到这个目标,您须要按以下标注规定在 doccano 平台上标注数据:

Step 1. 本地装置 doccano(请勿在 AI Studio 外部运行,本地测试环境 python=3.8)

$ pip install doccano

Step 2. 初始化数据库和账户(用户名和明码可替换为自定义值)

$ doccano init


$ doccano createuser –username my_admin_name –password my_password

Step 3. 启动 doccano

  • 在一个窗口启动 doccano 的 WebServer,放弃窗口


$ doccano webserver –port 8000

  • 在另一个窗口启动 doccano 的工作队列


$ doccano task

Step 4. 运行 doccano 来标注实体和关系

  • 关上浏览器(举荐 Chrome),在地址栏中输出 http://0.0.0.0:8000/ 后回车即得以下界面。
  • 登陆账户。点击右上角的 LOGIN,输出Step 2 中设置的用户名和明码登陆。
  • 创立我的项目。点击左上角的CREATE,跳转至以下界面。

    • 勾选序列标注(Sequence Labeling
    • 填写项目名称(Project name)等必要信息
    • 勾选容许实体重叠(Allow overlapping entity)、应用关系标注(Use relation labeling
    • 创立实现后,我的项目首页视频提供了从数据导入到导出的七个步骤的具体阐明。

  • 设置标签。在 Labels 一栏点击 ActionsCreate Label 手动设置或者 Import Labels 从文件导入。

    • 最上边 Span 示意实体标签,Relation 示意关系标签,须要别离设置。
  • 导入数据。在 Datasets 一栏点击 ActionsImport Dataset 从文件导入文本数据。

    • 依据文件格式(File format)给出的示例,抉择适宜的格局导入自定义数据文件。
    • 导入胜利后即跳转至数据列表。
  • 标注数据。点击每条数据最左边的 Annotate 按钮开始标记。标记页面右侧的标签类型(Label Types)开关可在实体标签和关系标签之间切换。

    • 实体标注:间接用鼠标选取文本即可标注实体。
    • 关系标注:首先点击待标注的关系标签,接着顺次点击相应的头尾实体可实现关系标注。
  • 导出数据。在 Datasets 一栏点击 ActionsExport Dataset 导出已标注的数据。

5.2 将标注数据转化成 UIE 训练所需数据

  • 将 doccano 平台的标注数据保留在 ./data/ 目录。对于快递单信息抽取的场景,能够间接下载标注好的数据。
! wget https://paddlenlp.bj.bcebos.com/model_zoo/uie/waybill.jsonl
! mv waybill.jsonl ./data/
! python doccano.py --doccano_file ./data/waybill.jsonl --splits 1 0 0

可配置参数阐明

  • doccano_file: 从 doccano 导出的数据标注文件。
  • save_dir: 训练数据的保留目录,默认存储在 data 目录下。
  • negative_ratio: 最大负例比例,该参数只对抽取类型工作无效,适当结构负例可晋升模型成果。负例数量和理论的标签数量无关,最大负例数量 = negative_ratio * 正例数量。该参数只对训练集无效,默认为 5。为了保障评估指标的准确性,验证集和测试集默认结构全负例。
  • splits: 划分数据集时训练集、验证集所占的比例。默认为 [0.8, 0.1, 0.1] 示意依照 8:1:1 的比例将数据划分为训练集、验证集和测试集。
  • task_type: 抉择工作类型,可选有抽取和分类两种类型的工作。
  • options: 指定分类工作的类别标签,该参数只对分类类型工作无效。
  • prompt_prefix: 申明分类工作的 prompt 前缀信息,该参数只对分类类型工作无效。
  • is_shuffle: 是否对数据集进行随机打散,默认为 True。
  • seed: 随机种子,默认为 1000.

    5.3 一键微调

因为是轻量级定制,即训练集数量较少时,通常将训练集间接作为验证集

  • 执行以下脚本进行一键微调

对 finetune.py 文件保留逻辑,进行批改,只保留最好模型,缩小贮存

! python finetune.py \
    --train_path ./data/train.txt \
    --dev_path ./data/train.txt \
    --save_dir ./checkpoint \
    --model uie-base \
    --learning_rate 1e-5 \
    --batch_size 16 \
    --max_seq_len 512 \
    --num_epochs 10 \
    --seed 1000 \
    --logging_steps 10 \
    --valid_steps 10

可配置参数阐明:

  • train_path: 训练集文件门路。
  • dev_path: 验证集文件门路。
  • save_dir: 模型存储门路,默认为./checkpoint
  • learning_rate: 学习率,默认为 1e-5。
  • batch_size: 批处理大小,请联合显存状况进行调整,若呈现显存有余,请适当调低这一参数,默认为 16。
  • max_seq_len: 文本最大切分长度,输出超过最大长度时会对输出文本进行主动切分,默认为 512。
  • num_epochs: 训练轮数,默认为 100。
  • model: 抉择模型,程序会基于抉择的模型进行模型微调,可选有 uie-baseuie-tiny,默认为uie-base
  • seed: 随机种子,默认为 1000.
  • logging_steps: 日志打印的距离 steps 数,默认 10。
  • valid_steps: evaluate 的距离 steps 数,默认 100。
  • device: 选用什么设施进行训练,可选 cpu 或 gpu。

5.3 推理部署

  • 执行以下代码高性能部署 快递单辨认定制版本UIE 模型
from paddlenlp import Taskflow

schema = ["姓名", "电话", "省份", "城市", "县区", "具体地址"]
ie = Taskflow("information_extraction", schema=schema, task_path="./checkpoint/model_best")
ie("北京市海淀区上地十街 10 号 18888888888 张三")
[{'姓名': [{'text': '张三',
    'start': 24,
    'end': 26,
    'probability': 0.9993427274729783}],
  '电话': [{'text': '18888888888',
    'start': 13,
    'end': 24,
    'probability': 0.9902358279724055}],
  '城市': [{'text': '北京市',
    'start': 0,
    'end': 3,
    'probability': 0.99967702117047}],
  '县区': [{'text': '海淀区',
    'start': 3,
    'end': 6,
    'probability': 0.9998499188335472}],
  '具体地址': [{'text': '上地十街 10 号',
    'start': 6,
    'end': 13,
    'probability': 0.9594372662315109}]}]
退出移动版