基于五条标注数据快速完成快递单信息抽取
演示使用 PaddleNLP UIE 模型,通过五条标注样本微调实现快递单姓名、电话、地址等信息的快速抽取。涵盖环境准备、开箱即用、数据标注、模型微调及推理部署全流程,帮助物流行业从业者降低填单成本并提升信息提取效率。

演示使用 PaddleNLP UIE 模型,通过五条标注样本微调实现快递单姓名、电话、地址等信息的快速抽取。涵盖环境准备、开箱即用、数据标注、模型微调及推理部署全流程,帮助物流行业从业者降低填单成本并提升信息提取效率。


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
本项目将演示如何通过五条标注样本进行模型微调,快速且准确抽取快递单中的姓名、电话、省、市、区、详细地址等内容,形成结构化信息。辅助物流行业从业者进行有效信息的提取,从而降低客户填单的成本。
如何从物流信息中抽取想要的关键信息呢?我们首先要定义好需要抽取哪些字段。
比如现在拿到一个快递单,可以作为我们的模型输入,例如'张三 18625584663 广东省深圳市南山区学府路东百度国际大厦',那么序列标注模型的目的就是识别出其中的'张三'为人名,'18625584663'为电话名,'广东省深圳市南山区百度国际大厦'分别是『省、市、区、街道』4 级地址)。
这是一个典型的命名实体识别(Named Entity Recognition,NER)场景,各实体类型及相应符号表示见下表:
| 抽取实体/字段 | 抽取结果 |
|---|---|
| 姓名 | 张三 |
| 电话 | 15209XX1921 |
| 省份 | 广东省 |
| 城市 | 深圳市 |
| 县区 | 南山区 |
| 详细地址 | 百度国际大厦 |
Yaojie Lu 等人提出了开放域信息抽取的统一框架,这一框架在实体抽取、关系抽取、事件抽取、情感分析等任务上都有着良好的泛化效果。
PaddleNLP 基于这篇工作的 prompt 设计思想,提供了以 ERNIE 为底座的信息抽取模型,用于关键信息抽取。同时,针对不同场景,支持通过构造小样本数据来优化模型效果,快速适配特定的关键信息配置。
! pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple
! pip show paddlenlp
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}]}]
对于『电话』、『详细地址』这些非通用性实体类型标签,推荐使用 PaddleNLP 提供的轻定制功能(训练 - 部署全流程工具)。
我们标注 5 条数据试试效果。
我们推荐使用数据标注平台 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 --port 8000
$ 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 一栏点击 Actions,Create Label 手动设置或者 Import Labels 从文件导入。
导入数据。在 Datasets 一栏点击 Actions、Import Dataset 从文件导入文本数据。
标注数据。点击每条数据最右边的 Annotate 按钮开始标记。标记页面右侧的标签类型(Label Types)开关可在实体标签和关系标签之间切换。
导出数据。在 Datasets 一栏点击 Actions、Export Dataset 导出已标注的数据。
./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.因为是轻量级定制,即训练集数量较少时,通常将训练集直接作为验证集。
对 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-base 和 uie-tiny,默认为 uie-base。seed: 随机种子,默认为 1000.logging_steps: 日志打印的间隔 steps 数,默认 10。valid_steps: evaluate 的间隔 steps 数,默认 100。device: 选用什么设备进行训练,可选 cpu 或 gpu。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.99934272729783}],
'电话': [{'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}]}]