文本分类任务是自然语言处理中最常见的任务之一。文本分类简单定义来说就是对给定的文本,可以是一句话、一段文本、一篇文章利用文本分类器进行分类和打标签。文本分类任务广泛应用于长短文本、情感分析、新闻分类、事件类型分类、政务信息分类、商品类型分类、文章类型分类、论文类别、专利领域、案件描述、罪名分类、意图分类、论文专利分类、邮件自动分类、评论类型分类、药物反应分类、对话分类、税收分类、投诉分类、广告检测、敏感违禁内容分类、内容安全检测、预情分析、话题分类等等日常或者专业领域中。
本文内容简介:本文主要是根据PaddleNLP框架,利用中医疗搜索检索词意图分类数据集为样例,来介绍多分类场景实例。本文会全流程介绍文本分类场景的建模流程,包括从前期准备阶段、数据准备阶段、模型训练与评估阶段。
文本分类任务可以根据标签类型分为多分类(multi class)、多标签(multi label)、层次分类(hierarchical)等三类任务,从以下新闻文本分类样例中就可以知道三种分类任务的区别。文本分类具体方案可以参考文本分类方案,飞浆PaddleNLP涵盖了所有!
多分类(multi class)任务定义:二分类/多分类数据集的标签集含有两个或两个以上的类别,所有输入句子/文本有且只有一个标签。在文本多分类场景中,我们需要预测输入句子/文本最可能来自 n 个标签类别中的哪一个类别。例如上图中的多分类样例,第一个场景中说明了新闻分类 游戏 是输出的标签。
多分类任务方案介绍:
(1)效果领先: 使用在中文领域内模型效果和模型计算效率有突出效果的ERNIE 3.0 预训练语言模型作为训练基座,ERNIE 3.0 轻量级系列提供多种尺寸的预训练模型满足不同需求,具有广泛成熟的实践应用性。
(2)高效调优: 文本分类应用依托TrustAI可信增强能力和数据增强API,提供模型分析模块助力开发者实现模型分析,并提供稀疏数据筛选、脏数据清洗、数据增强等多种解决方案。
(3)简单易用: 开发者无需机器学习背景知识,仅需提供指定格式的标注分类数据,一行命令即可开启文本分类训练,轻松完成上线部署,不再让技术成为文本分类的门槛。
安装PaddlePaddle:环境中paddlepaddle-gpu或paddlepaddle版本应大于或等于2.3, 请参见飞桨快速安装根据。
安装PaddleNLP:安装PaddleNLP默认开启百度镜像源来加速下载,如果您使用 HTTP 代理可以关闭(删去 -i https://mirror.baidu.com/pypi/simple),更多关于PaddleNLP安装的详细教程请查见PaddleNLP快速安装。
pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple
安装sklearn:直接通过pip来安装即可,只需要注意一下版本。
pip install scikit-learn==1.0.2
最新开源ERNIE 3.0系列预训练模型:
PaddleNLP内置了ERNIE、BERT、RoBERTa、Electra等40多个的预训练模型,并且内置了各种预训练模型对于不同下游任务的Fine-tune网络。用户可以使用PaddleNLP提供的模型,完成问答、序列分类、token分类等任务。查阅 预训练模型 了解更多。这里以ERNIE 3.0模型为例,介绍如何将预训练模型Fine-tune完成文本分类任务。PaddleNLP采用AutoModelForSequenceClassification,AutoTokenizer提供了简单易用的接口,可以用过from_pretrained() 方法来加载不同的预训练模型,在输出层上叠加一层线性层,且相应预训练模型权重下载速度快、稳定。下面以ERNIE 3.0中文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)
首先,克隆paddlenlp对应的想项目代码:
git clone https://github.com/PaddlePaddle/PaddleNLP.git
checkout release/2.4
cd PaddleNLP/applications/text_classification/multi_class/
然后可以看到整个项目的代码结构,代码结构如下:
multi_class/
├── deploy # 部署
│ └── predictor # 离线部署
│ │ ├── infer.py # 测试脚本
│ │ ├── predictor.py 离线部署脚本
│ │ └── README.md # 离线部署使用说明
│ ├── paddle_serving # PaddleServing在线服务化部署
│ │ ├──config.yml # 服务端的配置文件
│ │ ├──rpc_client.py # 客户端预测脚本
│ │ ├──service.py # 服务端的脚本
│ │ └── README.md # 在线服务化部署使用说明
│ └── triton_serving # Triton在线服务化部署
│ ├── README.md # Triton部署使用说明
│ ├── seqcls_grpc_client.py # 客户端预测脚本
│ └── models
├── train.py # 训练评估脚本
├── predict.py # 预测脚本
├── export_model.py # 静态图模型导出脚本
├── utils.py # 工具函数脚本
├── prune.py # 裁剪脚本
└── README.md # 多分类使用说明
通过使用PaddleNLP提供的 load_dataset, MapDataset 和 IterDataset ,可以方便的自定义属于自己的数据集。
目前PaddleNLP的通用数据处理流程如下:
1. 加载数据集(内置数据集或者自定义数据集,数据集返回 原始数据)。
2. 定义 trans_func() ,包括tokenize,token to id等操作,并传入数据集的 map() 方法,将原始数据转为 feature 。
3. 根据上一步数据处理的结果定义 batchify 方法和 BatchSampler 。
4. 定义 DataLoader , 传入 BatchSampler 和 batchify_fn() 。
PaddleNLP提供了以下数据集的快速读取API,实际使用时请根据需要添加splits信息,PaddleNLP Datasets API:供参考:
快速加载内置数据集 目前PaddleNLP内置20余个NLP数据集,涵盖阅读理解,文本分类,序列标注,机器翻译等多项任务。目前提供的数据集可以在 数据集列表 中可以找到。
以 cola 数据集为例:load_dataset() 方法会从 paddlenlp.datasets 下找到cola数据集对应的数据读取脚本(默认路径:paddlenlp/datasets/cola.py),并调用脚本中 DatasetBuilder 类的相关方法生成数据集。load_dataset() 方法提供了一个 name 参数用来指定想要获取的子数据集。使用方法如下:
from paddlenlp.datasets import load_dataset
train_ds, dev_ds = load_dataset("glue", name="cola", splits=("train", "dev"))
for i in range(3):
print(train_ds[i])
通过使用PaddleNLP提供的 load_dataset() , MapDataset 和 IterDataset 。任何人都可以方便的定义属于自己的数据集。从本地文件创建数据集 从本地文件创建数据集时,我们 推荐 根据本地数据集的格式给出读取function并传入 load_dataset() 中创建数据集。
以 中医疗搜索检索词意图分类 任务中的数据为例:
def read_local_dataset(path, label_list=None, is_test=False):
"""
Read dataset
"""
with open(path, 'r', encoding='utf-8') as f:
for line in f:
if is_test:
items = line.strip().split('\t')
sentence = ''.join(items)
yield {'text': sentence}
else:
items = line.strip().split('\t')
sentence = ''.join(items[:-1])
label = items[-1]
yield {'text': sentence, 'label': label_list[label]}
# data_path为read()方法的参数
map_ds = load_dataset(read_local_dataset, data_path='数据集/data1/dev.txt', label_list=label_list, lazy=False)
注解:
1. 需要注意的是,只有PaddleNLP内置的数据集具有将数据中的label自动转为id的功能(详细条件参见 创建DatasetBuilder)。
2. 像上例中的自定义数据集需要在自定义的convert to feature方法中添加label转id的功能。
3. 自定义数据读取function中的参数可以直接以关键字参数的的方式传入 load_dataset() 中。而且对于自定义数据集,lazy 参数是必须传入的。
训练需要准备指定格式的本地数据集,如果没有已标注的数据集,可以参考可以借助一些开源文本分类数据标注工具进行标注。
本文将以CBLUE数据集中医疗搜索检索词意图分类(KUAKE-QIC)任务为例进行介绍,如何加载本地固定格式数据集进行训练,指定格式本地数据集目录结构:
data/
├── train.txt # 训练数据集文件
├── dev.txt # 开发数据集文件
├── test.txt # 可选,测试数据集文件
├── label.txt # 分类标签文件
└── data.txt # 待预测数据文件
!wget https://paddlenlp.bj.bcebos.com/datasets/KUAKE_QIC.tar.gz
!tar -zxvf KUAKE_QIC.tar.gz
!mv KUAKE_QIC data
训练、开发、测试数据集:文本与标签类别名用tab符’\t’分隔开,文本中避免出现tab符’\t’。
<文本>‘\t’<标签>
<文本>‘\t’<标签>
…
25岁已经感觉脸部松弛了怎么办 治疗方案
小孩的眉毛剪了会长吗? 其他
172的身高还能长高吗? 其他
冻疮用三金冻疮酊有效果么? 功效作用
…
**分类标签:**label.txt(分类标签文件)记录数据集中所有标签集合,每一行为一个标签名。
<标签>
<标签>
…
病情诊断
治疗方案
病因分析
指标解读
就医建议
…
**待预测数据:**data.txt(待预测数据文件),需要预测标签的文本数据。
<文本>
<文本>
…
黑苦荞茶的功效与作用及食用方法
交界痣会凸起吗
检查是否能怀孕挂什么科
鱼油怎么吃咬破吃还是直接咽下去
…
如果使用CPU训练,只需将设备参数配置改为 –device cpu;同时可以设置多核训练,只需将多核训练参数配置成 –nproc_per_node 8,说明是8核训练;
python -m paddle.distributed.launch --nproc_per_node 8 --backend gloo train.py \
--model_name ernie-3.0-medium-zh \
--dataset_dir ./data/ \
--save_dir checkpoint \
--device cpu \
--learning_rate 3e-5 \
--epochs 100 \
--max_seq_length 128 \
--batch_size 32 \
--early_stop True
如果使用GPU训练,可以指定gpus参数进行单卡/多卡训练。使用多卡训练可以指定多个GPU卡号,例如 –gpus 0,1。如果设备只有一个GPU卡号默认为0,可使用nvidia-smi命令查看GPU使用情况:
unset CUDA_VISIBLE_DEVICES
python -m paddle.distributed.launch --gpus 0,1 train.py \
--model_name ernie-3.0-medium-zh \
--dataset_dir ./data/ \
--save_dir checkpoint \
--device gpu \
--learning_rate 3e-5 \
--epochs 100 \
--max_seq_length 128 \
--batch_size 32 \
--early_stop True
数据集定义: 以公开数据集CBLUE数据集中医疗搜索检索词意图分类(KUAKE-QIC)任务为示例,在训练集上进行模型微调,并在开发集上使用准确率Accuracy评估模型表现。数据集默认为:默认为"cblue"。
主要的配置的参数为:
(1)程序运行时将会自动进行训练,评估。同时训练过程中会自动保存开发集上最佳模型在指定的 save_dir 中,保存模型文件结构如下所示:
checkpoint/
├── model_config.json
├── model_state.pdparams
├── tokenizer_config.json
└── vocab.txt
(2)如需恢复模型训练,则可以设置 init_from_ckpt , 如 init_from_ckpt=checkpoint/model_state.pdparams 。
(3)如需训练英文文本分类任务,只需更换预训练模型参数 model_name 。英文训练任务推荐使用"ernie-2.0-base-en"、“ernie-2.0-large-en”。
(4)英文和中文以外语言的文本分类任务,推荐使用基于96种语言(涵盖法语、日语、韩语、德语、西班牙语等几乎所有常见语言)进行预训练的多语言预训练模型"ernie-m-base"、“ernie-m-large”。
训练评估主要是借助模型在测试集中的表现,具体表现就是看在测试集上评价指标。如果指标已经达到要求,那就不需要再进行效果调优工作了。
如果模型效果不佳,可以从数据层面、模型层面进行分析。
(1)数据层面可以做bad case分析,筛选数据,提高数据质量;此外,还可以做数据增强,解决数据长尾问题,增加数据数量。
(2)模型层面上可以做参数调优,尝试不同的模型参数,进行优化。比如说learning_rate、batch_size、max_seq_length。
训练结束后,输入 待预测数据 和 类别标签对照列表,使用训练好的模型进行,默认在GPU环境下使用,在CPU环境下修改参数配置为–device “cpu”:
python predict.py \
--device "gpu" \
--max_seq_length 128 \
--batch_size 32 \
--dataset_dir "data"
可支持配置的参数:
params_path:待预测模型参数文件夹;默认为"./checkpoint/"。
dataset_dir:本地数据集路径,数据集路径中应包含data.txt和label.txt文件;默认为None。
max_seq_length:ERNIE模型使用的最大序列长度,最大不能超过512, 若出现显存不足,请适当调低这一参数;默认为512。
batch_size:批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;默认为32。
device: 选用什么设备进行训练,可选cpu、gpu、xpu、npu;默认为gpu。
本文内容回顾:本文着重讲解了多分类场景的原理以及实例,并且以paddleNLP代码来实现了建模流程。具体实例是标准的数据–中医疗搜索检索词意图分类数据集。
后期还会继续讲解文本分类相关的场景、案例、模型调优方法、数据标注等内容,敬请期待。
如果觉得文章对您有帮助,请给博主点赞、收藏、关注,博主会不断推出优质的文章。
本博主内相关文章:
1.文本分类方案,飞浆PaddleNLP涵盖了所有!
2.用深度学习解决大规模文本分类问题
3.基于深度学习的文本分类方法库(NLP)
4.word2vec的应用----使用gensim来训练模型
5.NLP大赛冠军总结:300万知乎多标签文本分类任务(附深度学习源码)