小样本UIE 信息抽取微调快速上手(不含doccona标注)

news2024/11/17 7:22:37

文章目录

  • 1.安装环境(可略过)
  • 2.模型简介(略读)
    • 抽取任务输入输出示例:
      • 1.实体识别
      • 2.关系抽取
  • 3.快速上手(主菜)
    • (1)转换数据
      • ==标注数据样例==
    • (2)生成训练数据
      • ==训练数据样例==
    • (3)微调训练

1.安装环境(可略过)

模型快速复现的基本思路,只要两步,一是安装环境,二是跑模型。
安装GPU版本的paddlepaddle看参照此博客,如果不幸地,你报错缺少libcudart动态库文件,请参照此博客解决环境安装问题,毕竟安装环境是AIer不可逾越的鸿沟。

2.模型简介(略读)

知其然也知其所以然,能到快速上手阶段,肯定已经了解了UIE的一些相关介绍,这里仅从偏实践角度,简短剖析一下任务细节,具体介绍可参照官方github。

UIE(Universal Information Extraction) 针对少样本、低资源、不同领域等场景,实现从非结构化文本中抽取结构化信息,包含了实体识别、关系抽取、事件抽取、情感分析、评论抽取等任务。
该任务的亮点在于:
(1)将多任务的信息抽取统一为一个抽取模板
(2)基于结构化生成的预训练模型,可以实现少样本、跨领域的模型微调,且能够达到工业级可应用的SOTA效果。

统一模板可结合UIE整体框架来理解,如下图所示。
请添加图片描述
其底座是基于T5模型预训练的,多任务模型那就少不了prompt,这个prompt设计也非常巧妙,把prompt提示抽象成两种类别,Spotting进行实体识别,Associating进行关系类别识别,那么格式化就是:[spot] 实体类别 [asso] 关系类别 [text]。与实体识别、关系抽取、事件抽取任务联系起来,实体识别、事件触发词识别以及事件论元识别就是在做Spotting操作,找取目标信息片段,关系抽取、事件论元与事件触发词之间的关系是做Associating操作,寻找目标信息片段之间的关系。

对于不同的抽取任务只要给出统一的schema,那么模型就会自动将其组装为prompt喂给模型,进行Spotting、Associating操作。

抽取任务输入输出示例:

1.实体识别

from pprint import pprint>>> from paddlenlp import Taskflow
schema = [‘时间’, ‘选手’, ‘赛事名称’] # Define the schema for entity extraction
ie = Taskflow(‘information_extraction’, schema=schema)
pprint(ie(“2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!”)) # Better print results using pprint
[{‘时间’: [{‘end’: 6,
‘probability’: 0.9857378532924486,
‘start’: 0,
‘text’: ‘2月8日上午’}],
‘赛事名称’: [{‘end’: 23,
‘probability’: 0.8503089953268272,
‘start’: 6,
‘text’: ‘北京冬奥会自由式滑雪女子大跳台决赛’}],
‘选手’: [{‘end’: 31,
‘probability’: 0.8981548639781138,
‘start’: 28,
‘text’: ‘谷爱凌’}]}]

2.关系抽取

schema = {‘竞赛名称’: [‘主办方’, ‘承办方’, ‘已举办次数’]} # Define the schema for relation extraction>>> ie.set_schema(schema) # Reset schema>>> pprint(ie(‘2022语言与智能技术竞赛由中国中文信息学会和中国计算机学会联合主办,百度公司、中国中文信息学会评测工作委员会和中国计算机学会自然语言处理专委会承办,已连续举办4届,成为全球最热门的中文NLP赛事之一。’))
[{‘竞赛名称’: [{‘end’: 13,
‘probability’: 0.7825402622754041,
‘relations’: {‘主办方’: [{‘end’: 22,
‘probability’: 0.8421710521379353,
‘start’: 14,
‘text’: ‘中国中文信息学会’},
{‘end’: 30,
‘probability’: 0.7580801847701935,
‘start’: 23,
‘text’: ‘中国计算机学会’}],
‘已举办次数’: [{‘end’: 82,
‘probability’: 0.4671295049136148,
‘start’: 80,
‘text’: ‘4届’}],
‘承办方’: [{‘end’: 39,
‘probability’: 0.8292706618236352,
‘start’: 35,
‘text’: ‘百度公司’},
{‘end’: 72,
‘probability’: 0.6193477885474685,
‘start’: 56,
‘text’: ‘中国计算机学会自然语言处理专委会’},
{‘end’: 55,
‘probability’: 0.7000497331473241,
‘start’: 40,
‘text’: ‘中国中文信息学会评测工作委员会’}]},
‘start’: 0,
‘text’: ‘2022语言与智能技术竞赛’}]}]

以上的两个任务可以直接利用paddlenlp的Taskflow直接输出结果,这是预训练模型通用的抽取任务,输出效果也不错。Taskflow可理解为paddle为是产业实践研发的任务框架,包含数据的预处理、模型推理、后处理等任务执行所遵循的框架。细分场景中一般需要一定的标注数据进行微调。

3.快速上手(主菜)

项目中代码结构,如果不修改模型,不部署,仅微调的话,仅用到doccano.py、finetune.py、evaluate.py就足够了。
├── utils.py # 数据处理工具
├── model.py # 模型组网脚本
├── doccano.py # 数据标注脚本
├── doccano.md # 数据标注文档
├── finetune.py # 模型微调、压缩脚本
├── evaluate.py # 模型评估脚本
└── README.md

(1)转换数据

将自己的数据直接转化为doccona标注后的数据示例,为什么不直接转换为喂给模型的训练、验证数据,因为官方提供了转换脚本,里面包含正负样例构造、shuffle以及划分训练、验证、测试集,非常方便。

标注数据样例

{"id": 1, "text": "昨天晚上十点加班打车回家58元", "relations": [], "entities": [{"id": 0, "start_offset": 0, "end_offset": 6, "label": "时间"}, {"id": 1, "start_offset": 11, "end_offset": 12, "label": "目的地"}, {"id": 2, "start_offset": 12, "end_offset": 14, "label": "费用"}]}
{"id": 2, "text": "三月三号早上12点46加班,到公司54", "relations": [], "entities": [{"id": 3, "start_offset": 0, "end_offset": 11, "label": "时间"}, {"id": 4, "start_offset": 15, "end_offset": 17, "label": "目的地"}, {"id": 5, "start_offset": 17, "end_offset": 19, "label": "费用"}]}

注:我刚开始纠结该示例任务的schema = [‘出发地’, ‘目的地’, ‘费用’, ‘时间’],有的示例数据没有“目的地”无法定位offset怎么办?
准备标注数据的时候,没有的实体类别项,忽略不记录就行。
因为转换为训练数据集的时候,每个示例是根据类别分别转换的,如第一条数据,会转化为抽取"时间"类别数据,抽取"目的地"类别数据,抽取"费用"类别数据的3条数据,"出发地"类别就不用管。

(2)生成训练数据

经过doccona标注后的数据样例,通过doccona.py进行转换,生成训练集、验证集、测试集,命令如下所示。

python doccano.py \
    --doccano_file ./data/doccano_ext.json \
    --save_dir ./data \
    --splits 0.8 0.1 0.1 

训练数据样例

{"content": "出租车从酒店到公司一共34元时间是10月21日", "result_list": [{"text": "10月21日", "start": 17, "end": 23}], "prompt": "时间"}
{"content": "二零一九年十一月十三日晚上十点三十四分加班打车回家,四十三元", "result_list": [{"text": "家", "start": 24, "end": 25}], "prompt": "目的地"}
{"content": "月五号凌晨0点08分打车回家三十点五元", "result_list": [{"text": "家", "start": 13, "end": 14}], "prompt": "目的地"}

(3)微调训练

因为我有多张显卡,一开始想用多卡并行微调训练,没想到还需要安装一个ncll2,果断放弃,选择单卡也能微调,且速度挺快。总共100多条标注数据,生成训练集600多条数据,10多分钟就训练完了。
注意,我修改的参数,–device gpu:8 指定了特定的gpu,batch_size改为了8,因为显卡内存被别程序占用,8才能跑起来。
微调命令如下所示:

python finetune.py  \
    --device gpu:8 \
    --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  \
    --max_seq_length 512  \
    --per_device_eval_batch_size 8 \
    --per_device_train_batch_size  8 \
    --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

参考:
[1].https://mp.weixin.qq.com/s/lL950H9T7UFsJRopuWQ59w
[2].https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/README.md#%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【刷题笔记8.17】LeetCode:下一个排列

LeetCode:下一个排列 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的…

Java调用https接口添加证书

使用InstallCert.Java生成证书 /** Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** - Redistri…

Druid 德鲁伊 | 安装、使用指南

Druid安装指南 1. druid简介1.1数据库连接池 2. 安装前的环境准备3. 安装步骤3.1 引入maven依赖3.1 编写配置文件3.3 启动Druid Monitor 4. druid使用指南4.1 数据源4.2 SQL监控4.3 SQL防火墙4.4 web应用4.5 URI监控 1. druid简介 druid是阿里开源的一个数据库连接池的解决方案…

【Unity】按Esc进入操作菜单

本文章是基于如下视频的自我总结 https://www.youtube.com/watch?vJivuXdrIHK0 步骤如下 1、在Canvas 界面添加一个Panel Panel中添加一个按钮,调整按钮的大小为合适大小 调整字体的大小为合适大小 可以为字体添加Shadow组件,产生阴影效果 2、调整按…

【IMX6ULL驱动开发学习】05.字符设备驱动开发模板(包括读写函数、poll机制、异步通知、定时器、中断、自动创建设备节点和环形缓冲区)

一、 字符设备驱动简介 字符设备是Linux驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如常见的点灯、按键、IIC、SPI、LCD 等等都是字符设备,这些设备的驱动就叫…

Linux 常见问题解决思路

Linux 常见问题解决思路 CPU 高系统平均负载高(load average) CPU 高 1,步骤:查找进程-》查找线程-》分析threadDump日志-》找出问题代码 a、查看 cpu 高的 java 进程 topb、生成进程下所有线程的栈日志 jstack 1721 > 1712.…

Python入门【TCP建立连接的三次握手、 TCP断开连接的四次挥手、套接字编程实战、 TCP编程的实现、TCP双向持续通信】(二十七)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

ant-design-vue在ios使用AUpload组件唤起了相机,HTML的 `capture` 属性

在使用ant design vue组件的上传组件AUpload的时候有一个问题&#xff0c;直接按照demo写&#xff0c;在ios上会唤起相机&#xff0c;但是实际上我们的需求是弹出选择相册/相机这个弹框。 解决办法是加一个 cupture"null"这个属性即可 <a-upload:capture"nu…

电压放大器的作用有哪些呢

电压放大器是一种基础的电子元件&#xff0c;它能够将输入电压信号转化为更高的输出电压信号&#xff0c;从而实现对信号的放大和处理。电压放大器广泛应用于各个领域&#xff0c;如通讯、控制、测量等。下面我们来详细了解一下电压放大器的作用。 一、信号放大 电压放大器最主…

selenium语法进阶+常用API

目录 浏览器操作 浏览器回退&#xff0c;前进 与刷新 浏览器窗口设置大小 浏览器设置宽高 浏览器窗口最大化 浏览器控制滚动条 信息打印 打印页面的标题和当前页面的URL 定位一组元素 鼠标和键盘事件 键盘 鼠标 下拉框操作 通过索引定位&#xff08;se…

Vue-8.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法&#xff0c;因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而&#xff0c;这也可能增加一些复杂性&#xff0c;需要谨慎配置…

详细记录在迅为iMX6开发板中运行可执行文件

本文主要为了记录通过在虚拟机Ubuntu系统编译生成的可执行文件canitf如何运行在迅为的iMX6开发板上&#xff0c;中间涉及到的一些操作相对来说比较固定&#xff0c;因此可以整理成参考步骤以便之后使用时来依照执行。 一、生成可执行文件 首先在Ubuntu系统对应目录终端运行如…

7-11 到底是不是太胖了

分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 据说一个人的标准体重应该是其身高&#xff08;单位&#xff1a;厘米&#xff09;减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材&#xff08;即 | 真实体重 − 标准体重 | < 标…

【深入了解PyTorch】PyTorch模型解释性和可解释性:探索决策过程与预测结果的奥秘

【深入了解PyTorch】PyTorch模型解释性和可解释性:探索决策过程与预测结果的奥秘 PyTorch模型解释性和可解释性:探索决策过程与预测结果的奥秘1. 引言2. 梯度可视化3. 特征重要性分析4. 结论PyTorch模型解释性和可解释性:探索决策过程与预测结果的奥秘 在机器学习和深度学习…

哈夫曼树(赫夫曼树、最优树)详解

目录 哈夫曼树&#xff08;赫夫曼树、最优树&#xff09;详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树&#xff08;赫夫曼树、最优树&#xff09;详解 哈夫曼树相关的几个名词 路径&#xff1a;…

“西游记“中的项目管理:如何驾驭你的“取经之路”

​1.​引言 自古以来&#xff0c;文学作品不仅仅是为了娱乐&#xff0c;它们也为我们提供了生活的智慧和经验。中国的古典文学巨著《西游记》便是其中的佼佼者&#xff0c;其中的故事和角色为我们提供了丰富的人生哲理和管理智慧。但你可能会问&#xff0c;一个古老的神话故事…

Windows11 Docker Desktop 启动 -wsl kernel version too low

系统环境&#xff1a;windows11 1&#xff1a;docker下载 Docker: Accelerated Container Application Development 下载后双击安装即可 安装后启动Docker提示&#xff1a;Docker Desktop -wsl kernel version too low 处理起来也是非常方便 1:管理员身份启动&#xff1a;…

Python 处理 Excel 表格的 14 个常用操作

目录 1. 安装依赖库 2. 导入库 3. 读取Excel文件 4. 写入Excel文件 5. 创建工作表 6. 访问工作表 7. 读取单元格数据 8. 写入单元格数据 9. 获取行数和列数 10. 过滤数据 11. 排序数据 12. 添加新行 13. 删除行或列 14. 计算汇总统计 总结 无论是数据分析师、财…

CoordAtt注意力网络结构

源码&#xff1a; import torch import torch.nn as nn import math import torch.nn.functional as Fclass h_sigmoid(nn.Module):def __init__(self, inplaceTrue):super(h_sigmoid, self).__init__()self.relu nn.ReLU6(inplaceinplace)def forward(self, x):return self.…

杂记 | 记录一次使用docker安装gitlab-runner的过程(馋哭了)

文章目录 01 前情提要02 编写docker-compose.yml03 启动与注册04 流水线部署 01 前情提要 前不久使用docker部署好了自己的gitlab服务&#xff0c;简直香惨了。 上集传送门&#xff1a;记录一次使用Docker安装gitlab-ce的过程&#xff08;含配置交换内存&#xff09; 现在&am…