PaddleNLP UIE -- 药品说明书信息抽取(名称、规格、用法、用量)

paddlenlp,uie · 浏览次数 : 3

小编点评

本文主要介绍了如何使用PaddlePaddle进行信息抽取模型的训练和微调,以及如何使用Label Studio进行数据标注和转换。具体内容包括: 1. **项目创建与配置**:首先介绍了如何在AI Studio中创建项目并配置环境,包括选择合适的Python版本和PaddlePaddle版本。 2. **数据标注准备**:详细说明了数据标注的过程,包括命名实体识别(NER)的准备语料库,以及如何在Doccano平台上创建标注项目和定义实体标签类别。 3. **数据转换**:描述了如何使用Python脚本将标注完成的数据转换为指定格式,以便于后续的模型训练和微调。 4. **模型微调**:讲解了如何使用Trainer API对预训练模型进行微调,包括设置训练参数、评估模型和保存模型等步骤。 5. **模型评估**:展示了如何使用评估命令对模型进行评估,并解释了不同评估指标的含义。 6. **定制模型应用**:最后,通过一个具体的例子展示了如何使用定制好的模型进行预测,并给出了相关的输出结果。 总的来说,本文提供了一个从数据标注到模型微调再到模型评估的全流程指导,帮助用户理解并实践PaddlePaddle在信息抽取领域的应用。

正文


PaddleNLP UIE 实体关系抽取 -- 抽取药品说明书(名称、规格、用法、用量)

对于细分场景推荐使用轻定制功能(标注少量数据进行模型微调)以进一步提升效果

schema =['药品名称','用法','用量','频次']
ie = Taskflow('information_extraction',schema=schema)
pprint(ie("布洛芬分散片,口服或加水分散后服用。用于成人及12岁以上儿童,推荐剂里为一次0.2~0.4(1~2片)一日3次,或遵医嘱"))

如图:默认模型只能提取出药品名称,接下来,通过训练数据进行UIE模型微调
image

创建项目

登录AI Studio 免费算力 获得免费算力 https://aistudio.baidu.com/personalcenter/thirdview/2631487
药品说明书信息抽取
image
选择环境 PaddlePaddle 2.5.2
image
启动时,可以选择环境,CPU的基础版不限时,每天有8个点的算力供学习使用
image

环境配置

自己创建项目有个好处,避免了好多版本问题带来的坑:https://www.cnblogs.com/vipsoft/p/18265581#问题处理

  • Python 3.10.10
  • paddlepaddle-gpu Version: 2.5.2
  • PaddleNLP 2.6.1

image

上传代码

AI Studio 不能访问 gitee.com ,通过本地下载。再上传的方式操作
下载 V2.8:https://gitee.com/paddlepaddle/PaddleNLP/branches
image
上传代码
image
解压代码
unzip PaddleNLP-release-2.8.zip
image

训练定制

代码结构

model_zoo/uie 目录代码文件说明如下:

.
├── utils.py          # 数据处理工具
├── model.py          # 模型组网脚本
├── doccano.py        # 数据标注脚本 => 下面数据转换时会用到
├── doccano.md        # 数据标注文档
├── finetune.py       # 模型微调、压缩脚本
├── evaluate.py       # 模型评估脚本
└── README.md

数据标注

详细过程参考 数据标注工具 doccano | 命名实体识别(Named Entity Recognition,简称NER)

准备语料库

准备语料库、每一行为一条待标注文本,示例:corpus.txt

布洛芬分散片,口服或加水分散后服用。用于成人及12岁以上儿童,推荐剂里为一次0.2~0.4(1~2片)一日3次,或遵医嘱
白加黑(氨酚伪麻美芬片Ⅱ氨麻苯美片),口服。一次1~2片,一日3次(早、中各1~2白片,夜晚1~2片黑片),儿童遵医嘱
氯雷他定片,口服,规格为10mg的氯雷他定片,通常成人及12岁以上儿童1天1次,1次1片
扶他林(双氯芬酸二乙胺乳胶剂),外用。按照痛处面积大小,使用本品适量,轻轻揉搓,使本品渗透皮肤,一日3-4次
七叶洋地黄双苷,外用。用于黄斑变性时,每日3次,每次1滴,滴入眼结膜囊内(近耳侧外眼角)

数据标注

定义标签
Demo简单的定了 "药品名称、通用名、规格、用法、用量、频次"
image
数据标注
在doccano平台上,创建一个类型为序列标注的标注项目。
定义实体标签类别,上例中需要定义的实体标签有[ 药品名称、通用名、规格、用法、用量、频次 ]。
使用以上定义的标签开始标注数据,下面展示了一个doccano标注示例:
image

导出数据

标注完成后,在doccano平台上导出文件,并将其重命名为doccano_ext.json后,放入./data目录下
image
image

数据转换

doccano

在 AI Studio 环境中创建 data 目录,将 doccano_ext.json 放入data目录中
image
执行以下脚本进行数据转换,执行后会在./data目录下生成训练/验证/测试集文件。

python doccano.py \
    --doccano_file ./data/doccano_ext.json \
    --task_type ext \
    --save_dir ./data \
    --splits 0.8 0.2 0 \
    --schema_lang ch
# 执行后会在./data目录下生成训练/验证/测试集文件。
[2024-06-26 09:48:38,269] [    INFO] - Save 24 examples to ./data/train.txt.
[2024-06-26 09:48:38,269] [    INFO] - Save 5 examples to ./data/dev.txt.
[2024-06-26 09:48:38,269] [    INFO] - Save 0 examples to ./data/test.txt.

image

可配置参数说明:

  • 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.
  • separator: 实体类别/评价维度与分类标签的分隔符,该参数只对实体/评价维度级分类任务有效。默认为"##"。
  • schema_lang: 选择schema的语言,可选有chen。默认为ch,英文数据集请选择en

备注:

  • 默认情况下 doccano.py 脚本会按照比例将数据划分为 train/dev/test 数据集
  • 每次执行 doccano.py 脚本,将会覆盖已有的同名数据文件
  • 在模型训练阶段我们推荐构造一些负例以提升模型效果,在数据转换阶段我们内置了这一功能。可通过negative_ratio控制自动构造的负样本比例;负样本数量 = negative_ratio * 正样本数量。
  • 对于从doccano导出的文件,默认文件中的每条数据都是经过人工正确标注的。

Label Studio

也可以通过数据标注平台 Label Studio 进行数据标注。 labelstudio2doccano.py 脚本,将 label studio 导出的 JSON 数据文件格式转换成 doccano 导出的数据文件格式,后续的数据转换与模型微调等操作不变。

python labelstudio2doccano.py --labelstudio_file label-studio.json

可配置参数说明:

  • labelstudio_file: label studio 的导出文件路径(仅支持 JSON 格式)。
  • doccano_file: doccano 格式的数据文件保存路径,默认为 "doccano_ext.jsonl"。
  • task_type: 任务类型,可选有抽取("ext")和分类("cls")两种类型的任务,默认为 "ext"。

模型微调

注意使用GPU环境
image
启用GPU 环境
image

aistudio@jupyter-2631487-8126673:~$ python -V
Python 3.10.10
aistudio@jupyter-2631487-8126673:~$ pip show paddlepaddle-gpu
Name: paddlepaddle-gpu
Version: 2.5.2
Summary: Parallel Distributed Deep Learning
Home-page: https://www.paddlepaddle.org.cn/
Author: 
Author-email: Paddle-better@baidu.com
License: Apache Software License
Location: /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages
Requires: astor, decorator, httpx, numpy, opt-einsum, Pillow, protobuf
Required-by: 
aistudio@jupyter-2631487-8126673:~$ pip show paddlenlp
Name: paddlenlp
Version: 2.6.1.post0
Summary: Easy-to-use and powerful NLP library with Awesome model zoo, supporting wide-range of NLP tasks from research to industrial applications, including Neural Search, Question Answering, Information Extraction and Sentiment Analysis end-to-end system.
Home-page: https://github.com/PaddlePaddle/PaddleNLP
Author: PaddleNLP Team
Author-email: paddlenlp@baidu.com
License: Apache 2.0
Location: /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages
Requires: aistudio-sdk, colorama, colorlog, datasets, dill, fastapi, Flask-Babel, huggingface-hub, jieba, jinja2, multiprocess, onnx, paddle2onnx, paddlefsl, protobuf, rich, safetensors, sentencepiece, seqeval, tool-helpers, tqdm, typer, uvicorn, visualdl
Required-by: paddlehub
aistudio@jupyter-2631487-8126673:~$ 

推荐使用 Trainer API 对模型进行微调。只需输入模型、数据集等就可以使用 Trainer API 高效快速地进行预训练、微调和模型压缩等任务,可以一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能,Trainer API 还针对训练过程的通用训练配置做了封装,比如:优化器、学习率调度等。
使用下面的命令,使用 uie-base 作为预训练模型进行模型微调,将微调后的模型保存至$finetuned_model
单卡启动:
cd PaddleNLP-release-2.8/model_zoo/uie/

export finetuned_model=./checkpoint/model_best

python finetune.py  \
    --device gpu \
    --logging_steps 10 \
    --save_steps 100 \
    --eval_steps 100 \
    --seed 42 \
    --model_name_or_path uie-base \
    --output_dir $finetuned_model \
    --train_path data/train.txt \
    --dev_path data/dev.txt  \
    --per_device_eval_batch_size 16 \
    --per_device_train_batch_size  16 \
    --num_train_epochs 20 \
    --learning_rate 1e-5 \
    --label_names "start_positions" "end_positions" \
    --do_train \
    --do_eval \
    --do_export \
    --export_model_dir $finetuned_model \
    --overwrite_output_dir \
    --disable_tqdm True \
    --metric_for_best_model eval_f1 \
    --load_best_model_at_end  True \
    --save_total_limit 1

注意:如果模型是跨语言模型 UIE-M,还需设置 --multilingual

可配置参数说明:

  • model_name_or_path:必须,进行 few shot 训练使用的预训练模型。可选择的有 "uie-base"、 "uie-medium", "uie-mini", "uie-micro", "uie-nano", "uie-m-base", "uie-m-large"。
  • multilingual:是否是跨语言模型,用 "uie-m-base", "uie-m-large" 等模型进微调得到的模型也是多语言模型,需要设置为 True;默认为 False。
  • output_dir:必须,模型训练或压缩后保存的模型目录;默认为 None
  • device: 训练设备,可选择 'cpu'、'gpu' 、'npu'其中的一种;默认为 GPU 训练。
  • per_device_train_batch_size:训练集训练过程批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;默认为 32。
  • per_device_eval_batch_size:开发集评测过程批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;默认为 32。
  • learning_rate:训练最大学习率,UIE 推荐设置为 1e-5;默认值为3e-5。
  • num_train_epochs: 训练轮次,使用早停法时可以选择 100;默认为10。
  • logging_steps: 训练过程中日志打印的间隔 steps 数,默认100。
  • save_steps: 训练过程中保存模型 checkpoint 的间隔 steps 数,默认100。
  • seed:全局随机种子,默认为 42。
  • weight_decay:除了所有 bias 和 LayerNorm 权重之外,应用于所有层的权重衰减数值。可选;默认为 0.0;
  • do_train:是否进行微调训练,设置该参数表示进行微调训练,默认不设置。
  • do_eval:是否进行评估,设置该参数表示进行评估。

该示例代码中由于设置了参数 --do_eval,因此在训练完会自动进行评估。
image

模型评估

通过运行以下命令进行模型评估:

python evaluate.py \
    --model_path ./checkpoint/model_best \
    --test_path ./data/dev.txt \
    --batch_size 16 \
    --max_seq_len 512

输出:

[2024-07-03 14:14:16,345] [    INFO] - Class Name: all_classes
[2024-07-03 14:14:16,345] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.80000 | F1: 0.88889

通过运行以下命令对 UIE-M 进行模型评估:

python evaluate.py \
    --model_path ./checkpoint/model_best \
    --test_path ./data/dev.txt \
    --batch_size 16 \
    --max_seq_len 512 \
    --multilingual

评估方式说明:采用单阶段评价的方式,即关系抽取、事件抽取等需要分阶段预测的任务对每一阶段的预测结果进行分别评价。验证/测试集默认会利用同一层级的所有标签来构造出全部负例。

可开启debug模式对每个正例类别分别进行评估,该模式仅用于模型调试:

python evaluate.py \
    --model_path ./checkpoint/model_best \
    --test_path ./data/dev.txt \
    --debug

输出:

[2024-07-03 14:15:53,892] [    INFO] - -----------------------------
[2024-07-03 14:15:53,892] [    INFO] - Class Name: 通用名
[2024-07-03 14:15:53,892] [    INFO] - Evaluation Precision: 0.00000 | Recall: 0.00000 | F1: 0.00000
[2024-07-03 14:15:53,922] [    INFO] - -----------------------------
[2024-07-03 14:15:53,922] [    INFO] - Class Name: 药品名称
[2024-07-03 14:15:53,922] [    INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
[2024-07-03 14:15:54,039] [    INFO] - -----------------------------
[2024-07-03 14:15:54,039] [    INFO] - Class Name: 用法
[2024-07-03 14:15:54,039] [    INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
[2024-07-03 14:15:54,065] [    INFO] - -----------------------------
[2024-07-03 14:15:54,065] [    INFO] - Class Name: 用量
[2024-07-03 14:15:54,065] [    INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
[2024-07-03 14:15:54,091] [    INFO] - -----------------------------
[2024-07-03 14:15:54,091] [    INFO] - Class Name: 频次
[2024-07-03 14:15:54,091] [    INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000

可配置参数说明:

  • model_path: 进行评估的模型文件夹路径,路径下需包含模型权重文件model_state.pdparams及配置文件model_config.json
  • test_path: 进行评估的测试集文件。
  • batch_size: 批处理大小,请结合机器情况进行调整,默认为16。
  • max_seq_len: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。
  • debug: 是否开启debug模式对每个正例类别分别进行评估,该模式仅用于模型调试,默认关闭。
  • multilingual: 是否是跨语言模型,默认关闭。
  • schema_lang: 选择schema的语言,可选有chen。默认为ch,英文数据集请选择en

image

定制模型--预测

在 uie 目录下创建测试文件 drug.py (也可直接在终端命令行中敲,个人比较喜欢用文件的方式执行)

from pprint import pprint
from paddlenlp import Taskflow

schema = ['药品名称','用法','用量','频次']

# 设定抽取目标和定制化模型权重路径
my_ie = Taskflow("information_extraction", schema=schema, task_path='./checkpoint/model_best')
pprint(my_ie("布洛芬分散片,口服或加水分散后服用。用于成人及12岁以上儿童,推荐剂里为一次0.2~0.4(1~2片)一日3次,或遵医嘱"))

# 不在语料库中的药品信息
pprint(my_ie("头孢克肟分散片,可用温开水融化后服用,或直接吞服。饭前饭后服用均可。成人及体重30公斤以上儿童:口服,每次50~100mg,每日2次;"))


注意到 drug.py 所在的目录 uie 下运行

aistudio@jupyter-2631487-8126673:~/PaddleNLP-release-2.8/model_zoo/uie$ python drug.py

输出

[{'用法': [{'end': 9,
          'probability': 0.9967116760425654,
          'start': 7,
          'text': '口服'}],
  '用量': [{'end': 50,
          'probability': 0.9942849459419811,
          'start': 46,
          'text': '1~2片'}],
  '药品名称': [{'end': 6,
            'probability': 0.9993706125082298,
            'start': 0,
            'text': '布洛芬分散片'}],
  '频次': [{'end': 55,
          'probability': 0.993725564192772,
          'start': 51,
          'text': '一日3次'}]}]
[{'用法': [{'end': 50,
          'probability': 0.9894656717712884,
          'start': 48,
          'text': '口服'},
         {'end': 24,
          'probability': 0.468091403198585,
          'start': 20,
          'text': '直接吞服'}],
  '用量': [{'end': 61,
          'probability': 0.7317206007179742,
          'start': 53,
          'text': '50~100mg'}],
  '药品名称': [{'end': 7,
            'probability': 0.999166781489965,
            'start': 0,
            'text': '头孢克肟分散片'}],
  '频次': [{'end': 66,
          'probability': 0.9919675951550744,
          'start': 62,
          'text': '每日2次'}]}]

效果

image
项目地址:
药品说明书信息抽取:https://aistudio.baidu.com/projectdetail/8126673?sUid=2631487&shared=1&ts=1719990517603

与PaddleNLP UIE -- 药品说明书信息抽取(名称、规格、用法、用量)相似的内容:

PaddleNLP UIE -- 药品说明书信息抽取(名称、规格、用法、用量)

详细描述了 语料库、材料、训练、评估、预测,完整流程。对于细分场景推荐使用轻定制功能(标注少量数据进行模型微调)以进一步提升效果

AI识别检验报告 -PaddleNLP UIE-X 在医疗领域的实战

[TOC] # UIE-X在医疗领域的实战 **PaddleNLP全新发布UIE-X 🧾,除已有纯文本抽取的全部功能外,新增文档抽取能力。** UIE-X延续UIE的思路,**基于跨模态布局增强预训练模型**[文心ERNIE-Layout](https://github.com/PaddlePad

模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别 + 信息抽取(UIE-X)

[TOC] 图像识别 + 信息抽取(UIE-X),部署接口供别的应用调用 最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中 ## 流程 - 在百度 BML CodeLab 中跑好模型(免费算力,玩玩够了) - 下载模型 (比较大,我这个有10G了,可以适当做裁剪) - Linu

自然语言处理(NLP)

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N

自然语言处理(NLP) - 前预训练时代的自监督学习

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N

自然语言处理 Paddle NLP - 词向量应用展示

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N

自然语言处理 Paddle NLP - 预训练语言模型及应用

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N

自然语言处理 Paddle NLP - 文本语义相似度计算(ERNIE-Gram)

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N

自然语言处理 Paddle NLP - 词法分析技术及其应用

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N

自然语言处理 Paddle NLP - 快递单信息抽取 (ERNIE 1.0)

基础 [自然语言处理(NLP)](https://www.cnblogs.com/vipsoft/p/17450994.html) [自然语言处理PaddleNLP-词向量应用展示](https://www.cnblogs.com/vipsoft/p/17451860.html) [自然语言处理(N