Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】
Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)
应用实践:分类模型大集成者[PaddleHub、Finetune、prompt]
Paddlenlp之UIE关系抽取模型【高管关系抽取为例】
PaddleNLP基于ERNIR0文本分类以中医疗搜索检索词意分类为例【多分类】
基于Ernie-0CAIL2019法研杯要素识别多标签分类任务
文本分类任务是自然语言处理中最常见的任务,文本分类任务简单来说就是对给定的一个句子或一段文本使用文本分类器进行分类。文本分类任务广泛应用于长短文本分类、情感分析、新闻分类、事件类别分类、政务数据分类、商品信息分类、商品类目预测、文章分类、论文类别分类、专利分类、案件描述分类、罪名分类、意分类、论文专利分类、邮件自动标签、评论正负识别、药物反应分类、对话分类、税种识别、来电信息自动分类、投诉分类、广告检测、敏感违法内容检测、内容安全检测、舆情分析、话题标记等各类日常或专业领域中。
PaddleNLP采用AutoModelForSequenceClassification,AutoTokenizer提供了方便易用的接口,可指定模型名或模型参数文件路径通过from_pretrained方法加载不同网络结构的预训练模型,并在输出层上叠加一层线性层,且相应预训练模型权重下载速度快、稳定。Transformer预训练模型汇总包含了如ERNIE、BERT、RoBERTa等40多个主流预训练模型,500多个模型权重。下面以ERNIE0中文base模型为例,演示如何加载预训练模型和分词器:
from paddlenlp.transformers import AutoModelForSequenceClassification, AutoTokenizer
num_classes = 10
model_name = "ernie-3.0-base-zh"
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_classes=num_classes)
tokenizer = AutoTokenizer.from_pretrained(model_name)
文本多标签分类是自然语言处理中常见的文本分类任务,文本多标签分类在各种现实场景中具有广泛的适用性,例如商品分类、网页标签、新闻标注、蛋白质功能分类、电影分类、语义场景分类等。多标签数据集中样本用来自n_classes个可能类别的m个标签类别标记,其中m的取值在0到n_classes之间,这些类别具有不相互排斥的属性。我们将每个样本的标签用One-hot的形式表示,正类用1表示,负类用0表示。例如,数据集中样本可能标签是A、B和C的多标签分类问题,标签为[1,0,1]代表存在标签A和C而标签B不存在的样本。
在现实中的案情错综复杂,同一案件可能适用多项法律条文,涉及数罪并罚,需要多标签模型充分学习标签之间的关联性,对文本进行分类预测。CAIL2018—SMALL数据集中罪名预测任务数据来自“中国裁判文书网”公开的刑事法律文书,包括16万份文书样例,其中每份数据由法律文书中的案情描述和事实部分组成,包括每个案件被告人被判的罪名,数据集共包含202项罪名,被告人罪名通常涉及一项至多项。以数据集中某一法律文书为例:
"公诉机关指控,2009年12月18日22时许,被告人李某(已判刑)伙同被告人丁某、李某乙、李某甲、杨某某在永吉县岔路河镇夜宴歌厅唱完歌后离开,因之前对该歌厅服务生刘某某心怀不满,遂手持事先准备好的镐把、扎枪再次返回夜宴歌厅,在追赶殴打刘某某过程中,任意损毁歌厅内的笔记本电脑、调音台、麦克接收机等物品。被告人丁某用镐把随意将服务员齐某某头部打伤。经物价部门鉴定,笔记本电脑、调音台、麦克接收机总价值人民币7120.00元;经法医鉴定,齐某某左额部硬膜外血肿,构成重伤。被告人丁某、李某乙、李某甲、杨某某案发后外逃,后主动到公安机关投案。并认为,被告人丁某随意殴打他人,致人重伤,其行为已构成××罪。被告人李某乙、李某甲、杨某某在公共场所持械随意殴打他人,情节恶劣,任意毁损他人财物,情节严重,其行为均已构成××罪,应予惩处。"
该案件中被告人涉及故意伤害,寻衅滋事两项罪名。接下来我们将讲解如何利用多标签模型,根据输入文本预测案件所涉及的一个或多个罪名。
数据准备如果没有已标注的数据集,推荐doccano数据标注工具,如何使用doccano进行数据标注并转化成指定格式本地数据集详见文本分类任务doccano使用指南。如果已有标注好的本地数据集,我们需要根据不同任务要求将数据集整理为文档要求的格式:多分类数据集格式要求、多标签数据集格式要求、层次分类数据集格式要求。
准备好数据集后,我们可以根据现有的数据集规模或训练后模型表现选择是否使用数据增强策略进行数据集扩充。
模型训练数据准备完成后,可以开始使用我们的数据集对预训练模型进行微调训练。我们可以根据任务需求,调整可配置参数,选择使用GPU或CPU进行模型训练,脚本默认保存在开发集最佳表现模型。中文任务默认使用"ernie-0-base-zh"模型,英文任务默认使用"ernie-0-base-en"模型,ERNIE0还支持多个轻量级中文模型,详见ERNIE模型汇总,可以根据任务和设备需求进行选择。
训练结束后,我们可以加载保存的最佳模型进行模型测试,打印模型预测结果。
模型预测
在现实部署场景中,我们通常不仅对模型的精度表现有要求,也需要考虑模型性能上的表现。我们可以使用模型裁剪进一步压缩模型体积,文本分类应用已提供裁剪API对上一步微调后的模型进行裁剪,模型裁剪之后会默认导出静态模型。
模型部署需要将保存的最佳模型参数导出成静态参数,用于后续的推理部署。
文本分类应用提供了基于ONNXRuntime的本地部署predictor,并且支持在GPU设备使用FP1在CPU设备使用动态量化的低精度加速推理。
文本分类应用同时基于PaddleServing的服务端部署方案。
本项目主要讲解:数据准备、模型训练、模型预测部分,对于部署部分篇幅有限,感兴趣同学可以跑一跑试一试。
[https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/text_classification](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/text_classification
文本分类任务doccano使用指南【多分类、多标签、层次分类】
Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)
基于ERNIR0文本分类任务模型微调
以公开数据集CAIL2018—SMALL中罪名预测任务为示例,在训练集上进行模型微调,并在开发集上验证。程序运行时将会自动进行训练,评估,测试。同时训练过程中会自动保存开发集上最佳模型在指定的save_dir中,保存模型文件结构如下所示:
checkpoint/
├── model_config.json
├── model_state.pdparams
├── tokenizer_config.json
└── vocab.txt
加载本地数据集
# !wget https://paddlenlp.bj.bcebos.com/datasets/cail2018_small_charges.tar.gz
!tar -zxvf cail2018_small_charges.tar.gz
!mv cail2018_small_charges data
data/
├── train.txt # 训练数据集文件
├── dev.txt # 开发数据集文件
├── test.txt # 可选,测试训练集文件
├── label.txt # 分类标签文件
└── data.txt # 可选,待预测数据文件
train.txt,dev.txt,test.txt中输入文本序列与标签数据用‘ ’分隔开,标签中多个标签之间用‘,’逗号分隔开。
<输入序列1>" "<标签1>","<标签2>
<输入序列2>" "<标签1>
...
label.txt记录数据集中所有标签集合,每一行为一个标签名。
label.txt文件格式:
故意伤害
盗窃
危险驾驶
非法[持有、私藏][枪支、弹药]
...
label.txt文件样例:
故意伤害
盗窃
危险驾驶
非法[持有、私藏][枪支、弹药]
...
data.txt
data.txt文件格式:
<输入序列1>
<输入序列2>
...
data.txt文件样例:
2模型预测
#单卡训练
!python train.py --early_stop --epochs 10 --warmup --save_dir "./checkpoint" --batch_size 32 --dataset_dir "data/cail2018_small_charges"
[2022-07-27 15:03:55,267] [ INFO] - global step 530, epoch: 1, batch: 530, loss: 0.19550, micro f1 score: 0.01304, macro f1 score: 0.01056, speed: 0.60 step/s
[2022-07-27 15:04:12,334] [ INFO] - global step 540, epoch: 1, batch: 540, loss: 0.18821, micro f1 score: 0.01303, macro f1 score: 0.01053, speed: 0.60 step/s
[2022-07-27 15:04:29,497] [ INFO] - global step 550, epoch: 1, batch: 550, loss: 0.18063, micro f1 score: 0.01302, macro f1 score: 0.01051, speed: 0.59 step/s
[2022-07-27 15:04:46,820] [ INFO] - global step 560, epoch: 1, batch: 560, loss: 0.17561, micro f1 score: 0.01301, macro f1 score: 0.01049, speed: 0.59 step/s
[2022-07-27 15:05:04,307] [ INFO] - global step 570, epoch: 1, batch: 570, loss: 0.17048, micro f1 score: 0.01300, macro f1 score: 0.01046, speed: 0.58 step/s
[2022-07-27 15:05:22,099] [ INFO] - global step 580, epoch: 1, batch: 580, loss: 0.16223, micro f1 score: 0.01299, macro f1 score: 0.01044, speed: 0.57 step/s
[2022-07-27 15:05:39,808] [ INFO] - global step 590, epoch: 1, batch: 590, loss: 0.15865, micro f1 score: 0.01298, macro f1 score: 0.01041, speed: 0.58 step/s
[2022-07-27 15:05:57,613] [ INFO] - global step 600, epoch: 1, batch: 600, loss: 0.15361, micro f1 score: 0.01297, macro f1 score: 0.01039, speed: 0.57 step/s
[2022-07-27 15:06:15,583] [ INFO] - global step 610, epoch: 1, batch: 610, loss: 0.14710, micro f1 score: 0.01296, macro f1 score: 0.01037, speed: 0.57 step/s
[2022-07-27 15:06:33,658] [ INFO] - global step 620, epoch: 1, batch: 620, loss: 0.14317, micro f1 score: 0.01295, macro f1 score: 0.01034, speed: 0.56 step/s
[2022-07-27 15:06:51,894] [ INFO] - global step 630, epoch: 1, batch: 630, loss: 0.13964, micro f1 score: 0.01294, macro f1 score: 0.01032, speed: 0.56 step/s
[2022-07-27 15:07:10,206] [ INFO] - global step 640, epoch: 1, batch: 640, loss: 0.13328, micro f1 score: 0.01293, macro f1 score: 0.01030, speed: 0.56 step/s
[2022-07-27 15:07:28,673] [ INFO] - global step 650, epoch: 1, batch: 650, loss: 0.12832, micro f1 score: 0.01292, macro f1 score: 0.01028, speed: 0.55 step/s
[2022-07-27 15:07:47,244] [ INFO] - global step 660, epoch: 1, batch: 660, loss: 0.12585, micro f1 score: 0.01292, macro f1 score: 0.01026, speed: 0.55 step/s
[2022-07-27 15:08:05,915] [ INFO] - global step 670, epoch: 1, batch: 670, loss: 0.12514, micro f1 score: 0.01291, macro f1 score: 0.01024, speed: 0.55 step/s
[2022-07-27 15:08:24,775] [ INFO] - global step 680, epoch: 1, batch: 680, loss: 0.11939, micro f1 score: 0.01290, macro f1 score: 0.01021, speed: 0.54 step/s
[2022-07-27 15:08:43,779] [ INFO] - global step 690, epoch: 1, batch: 690, loss: 0.11547, micro f1 score: 0.01289, macro f1 score: 0.01019, speed: 0.54 step/s
[2022-07-27 15:09:02,844] [ INFO] - global step 700, epoch: 1, batch: 700, loss: 0.11291, micro f1 score: 0.01288, macro f1 score: 0.01017, speed: 0.53 step/s
[2022-07-27 15:09:22,234] [ INFO] - global step 710, epoch: 1, batch: 710, loss: 0.10988, micro f1 score: 0.01287, macro f1 score: 0.01015, speed: 0.53 step/s
[2022-07-27 15:09:41,752] [ INFO] - global step 720, epoch: 1, batch: 720, loss: 0.10556, micro f1 score: 0.01286, macro f1 score: 0.01013, speed: 0.52 step/s
[2022-07-27 15:10:01,621] [ INFO] - global step 730, epoch: 1, batch: 730, loss: 0.10424, micro f1 score: 0.01285, macro f1 score: 0.01011, speed: 0.51 step/s
[2022-07-27 15:10:21,675] [ INFO] - global step 740, epoch: 1, batch: 740, loss: 0.09951, micro f1 score: 0.01284, macro f1 score: 0.01009, speed: 0.51 step/s
[2022-07-27 15:10:41,949] [ INFO] - global step 750, epoch: 1, batch: 750, loss: 0.09677, micro f1 score: 0.01283, macro f1 score: 0.01007, speed: 0.50 step/s
[2022-07-27 15:11:02,267] [ INFO] - global step 760, epoch: 1, batch: 760, loss: 0.10009, micro f1 score: 0.01282, macro f1 score: 0.01005, speed: 0.50 step/s
[2022-07-27 15:11:22,657] [ INFO] - global step 770, epoch: 1, batch: 770, loss: 0.09277, micro f1 score: 0.01281, macro f1 score: 0.01003, speed: 0.50 step/s
样本集过大这边就部继续演示了,
可支持配置的参数:
dataset:训练数据集;默认为"cail2018_small"。
dataset_dir:本地数据集路径,数据集路径中应包含train.txt,dev.txt和label.txt文件;默认为None。
task_name:训练数据集;默认为"charges"。
max_seq_length:ERNIE模型使用的最大序列长度,最大不能超过512,若出现显存不足,请适当调低这一参数;默认为51
model_name:选择预训练模型;默认为"ernie-0-base-zh"。
device:选用什么设备进行训练,可选cpu、gpu、xpu、npu。如使用gpu训练,择使用参数gpus指定GPU卡号。
batch_size:批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;默认为3
learning_rate:Fine-tune的最大学习率;默认为3e-
weight_decay:控制正则项力度的参数,用于防止过拟合,默认为0.00。
early_stop:选择是否使用早停法;默认为False。
early_stop_nums:在设定的早停训练轮次内,模型在开发集上表现不再上升,训练终止;默认为
epochs:训练轮次,默认为1000。
warmup:是否使用学习率warmup策略;默认为False。
warmup_steps:学习率warmup策略的steps数,如果设为2000,则学习率会在前2000steps数从0慢慢增长到learning_rate,而后再缓慢衰减;默认为2000。
logging_steps:日志打印的间隔steps数,默认
seed:随机种子,默认为
1评价指标定义
对评价指标进行阐述一下:
本次使用的是metrics.py文件从sklearn库导入的:
from sklearn.metrics import f1_score, classification_report
如有额外需求可以,使用metricspy文件从sklearn库导入的:
from sklearn.metrics import roc_auc_score, f1_score, precision_score, recall_score
import numpy as np
from sklearn.metrics import roc_auc_score, f1_score, precision_score, recall_score
from paddle.metric import Metric
class MultiLabelReport(Metric):
"""
AUC and F1 Score for multi-label text classification task.
"""
def __init__(self, name="MultiLabelReport", average="micro"):
super(MultiLabelReport, self).__init__()
self.average = average
self._name = name
self.reset()
def f1_score(self, y_prob):
"""
Returns the f1 score by searching the best threshhold
"""
best_score = 0
for threshold in [i * 0.01 for i in range(100)]:
self.y_pred = y_prob > threshold
score = f1_score(y_pred=self.y_pred, y_true=self.y_true, average=self.average)
if score > best_score:
best_score = score
precison = precision_score(y_pred=self.y_pred, y_true=self.y_true, average=self.average)
recall = recall_score(y_pred=self.y_pred, y_true=self.y_true, average=self.average)
return best_score, precison, recall
def reset(self):
"""
Resets all of the metric state.
"""
self.y_prob = None
self.y_true = None
def update(self, probs, labels):
if self.y_prob is not None:
self.y_prob = np.append(self.y_prob, probs.numpy(), axis=0)
else:
self.y_prob = probs.numpy()
if self.y_true is not None:
self.y_true = np.append(self.y_true, labels.numpy(), axis=0)
else:
self.y_true = labels.numpy()
def accumulate(self):
auc = roc_auc_score(
y_score=self.y_prob, y_true=self.y_true, average=self.average)
f1_score, precison, recall = self.f1_score(y_prob=self.y_prob)
return auc, f1_score, precison, recall
def name(self):
"""
Returns metric name
"""
return self._name
#多卡训练:
#unset CUDA_VISIBLE_DEVICES
#!python -m paddle.distributed.launch --gpus "0" train.py --early_stop --dataset_dir data
#使用多卡训练可以指定多个GPU卡号,例如 --gpus "0,1"
3模型预测
输入待预测数据和数据标签对照列表,模型预测数据对应的标签
使用默认数据进行预测:
python predict.py --params_path ./checkpoint/
也可以选择使用本地数据文件data/data.txt进行预测:
!python predict.py --params_path ./checkpoint/ --dataset_dir data/cail2018_small_charges
输入样本:
输出结果:自行运行一下
结论
Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】
Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)
应用实践:分类模型大集成者[PaddleHub、Finetune、prompt]
Paddlenlp之UIE关系抽取模型【高管关系抽取为例】
PaddleNLP基于ERNIR0文本分类以中医疗搜索检索词意分类为例【多分类】
基于Ernie-0CAIL2019法研杯要素识别多标签分类任务
本项目主要讲解了犯罪名预测任务、以及doccano标注指南,和对性能指标的简单探讨,可以看到实际更多问题是关于多标签分类的。
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点