# 层次分类指南
**目录**
- [1. 层次分类简介](#层次分类简介)
- [2. 快速开始](#快速开始)
- [2.1 运行环境](#运行环境)
- [2.2 代码结构](#代码结构)
- [2.3 数据准备](#数据准备)
- [2.4 模型训练](#模型训练)
- [2.5 模型部署](#模型部署)
- [2.6 模型效果](#模型效果)
<a name="层次分类简介"></a>
## 1. 层次分类简介
本项目提供通用场景下**基于预训练模型微调的层次分类端到端应用方案**,打通数据标注-模型训练-模型调优-模型压缩-预测部署全流程,有效缩短开发周期,降低AI开发落地门槛。
层次文本分类任务的中数据样本具有多个标签且标签之间存在特定的层级结构,目标是**预测输入句子/文本可能来自于不同级标签类别中的某一个或几个类别**。以下图新闻文本分类为例,该新闻的一级标签为体育,二级标签为足球,体育与足球之间存在层级关系。在现实场景中,大量的数据如新闻分类、专利分类、学术论文分类等标签集合存在层次化结构,需要利用算法为文本自动标注更细粒度和更准确的标签。
<div align="center">
<img src=https://user-images.githubusercontent.com/63761690/186654723-6a287f18-56cc-4727-9347-09cfaf11b1dc.png width="550"/>
</div>
<br>
**方案亮点:**
- **效果领先🏃:** 使用在中文领域内模型效果和模型计算效率有突出效果的ERNIE 3.0 轻量级系列模型作为训练基座,ERNIE 3.0 轻量级系列提供多种尺寸的预训练模型满足不同需求,具有广泛成熟的实践应用性。
- **高效调优✊:** 文本分类应用依托[TrustAI](https://github.com/PaddlePaddle/TrustAI)可信增强能力和[数据增强API](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/dataaug.md),提供模型分析模块助力开发者实现模型分析,并提供稀疏数据筛选、脏数据清洗、数据增强等多种解决方案。
- **简单易用👶:** 开发者**无需机器学习背景知识**,仅需提供指定格式的标注分类数据,一行命令即可开启文本分类训练,轻松完成上线部署,不再让技术成为文本分类的门槛。
**更多选择:**
对于大多数层次分类任务,我们推荐使用预训练模型微调作为首选的文本分类方案,层次分类项目中还提供 提示学习(小样本)和语义索引的两种全流程文本分类方案满足不同开发者需求,更多技术细节请参见[文本分类技术特色介绍](../README.md)。
- 【标注成本高、标注样本较少的小样本场景】 👉 [提示学习层次分类方案](./few-shot#readme)
- 【标签类别不固定场景、标签数量众多】 👉 [语义索引层次分类方案](./retrieval_based#readme)
<a name="快速开始"></a>
## 2. 快速开始
我们以[2020语言与智能技术竞赛:事件抽取任务](https://aistudio.baidu.com/aistudio/competition/detail/32/0/introduction)抽取的多标签层次数据集为例,演示层次分类全流程方案使用。下载数据集:
```shell
wget https://paddlenlp.bj.bcebos.com/datasets/baidu_extract_2020.tar.gz
tar -zxvf baidu_extract_2020.tar.gz
mv baidu_extract_2020 data
rm baidu_extract_2020.tar.gz
```
<div align="center">
<img width="900" alt="image" src="https://user-images.githubusercontent.com/63761690/187828356-e2f4f627-f5fe-4c83-8879-ed6951f7511e.png">
</div>
<div align="center">
<font size ="2">
层次分类数据标注-模型训练-模型分析-模型压缩-预测部署流程图
</font>
</div>
<a name="运行环境"></a>
### 2.1 运行环境
- python >= 3.6
- paddlepaddle >= 2.3
- paddlenlp >= 2.4.8
- scikit-learn >= 1.0.2
**安装PaddlePaddle:**
环境中paddlepaddle-gpu或paddlepaddle版本应大于或等于2.3, 请参见[飞桨快速安装](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html)根据自己需求选择合适的PaddlePaddle下载命令。
**安装PaddleNLP:**
安装PaddleNLP默认开启百度镜像源来加速下载,如果您使用 HTTP 代理可以关闭(删去 -i https://mirror.baidu.com/pypi/simple),更多关于PaddleNLP安装的详细教程请查见[PaddleNLP快速安装](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/get_started/installation.rst)。
```shell
python3 -m pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple
```
**安装sklearn:**
```shell
python3 -m pip install scikit-learn==1.0.2
```
<a name="代码结构"></a>
### 2.2 代码结构
```text
hierarchical/
├── few-shot # 小样本学习方案
├── retrieval_based # 语义索引方案
├── analysis # 分析模块
├── deploy # 部署
│ └── predictor # 离线部署
│ ├── paddle_serving # PaddleServing在线服务化部署
│ └── triton_serving # Triton在线服务化部署
├── train.py # 训练评估脚本
├── predict.py # 预测脚本
├── export_model.py # 静态图模型导出脚本
├── utils.py # 工具函数脚本
├── metric.py # metric脚本
├── prune.py # 裁剪脚本
└── README.md # 使用说明
```
<a name="数据准备"></a>
### 2.3 数据准备
训练需要准备指定格式的标注数据集,如果没有已标注的数据集,可以参考 [数据标注指南](../doccano.md) 进行文本分类数据标注。指定格式本地数据集目录结构:
```text
data/
├── train.txt # 训练数据集文件
├── dev.txt # 开发数据集文件
├── test.txt # 测试数据集文件(可选)
├── label.txt # 分类标签文件
└── data.txt # 待预测数据文件(可选)
```
**训练、开发、测试数据集文件:** 文本与标签类别名用tab符`'\t'`分隔开,标签中多个标签之间用英文逗号`','`分隔开,文本中避免出现tab符`'\t'`。
- train.txt/dev.txt/test.txt 文件格式:
```text
<文本>'\t'<标签>','<标签>','<标签>
<文本>'\t'<标签>','<标签>
...
```
- train.txt/dev.txt/test.txt 文件样例:
```text
又要停产裁员6000!通用汽车罢工危机再升级股价大跌市值蒸发近300亿! 组织行为,组织行为##罢工,组织关系,组织关系##裁员
上海一改建厂房坍塌已救出19人其中5人死亡 人生,人生##死亡,灾害/意外,灾害/意外##坍/垮塌
车闻:广本召回9万余辆;领动上市,10.98万起;艾力绅混动 产品行为,产品行为##召回
86岁老翁过马路遭挖掘机碾压身亡警方:正在侦办中 灾害/意外,灾害/意外##车祸,人生,人生##死亡
...
```
**分类标签文件:** 包含数据集中所有标签,每个标签一行。
- label.txt 文件格式:
```text
<一级标签>
<一级标签>'##'<二级标签>
<一级标签>'##'<二级标签>'##'<三级标签>
...
```
- label.txt 文件样例:
```text
人生
人生##死亡
灾害/意外
灾害/意外##坍/垮塌
灾害/意外##车祸
产品行为
产品行为##召回
...
```
**待预测数据文件:** 包含需要预测标签的文本数据,每条数据一行。
- data.txt 文件格式:
```text
<文本>
<文本>
...
```
- data.txt 文件样例:
```text
金属卡扣安装不到位,上海乐扣乐扣贸易有限公司将召回捣碎器1162件
卡车超载致使跨桥侧翻,没那么简单
消失的“外企光环”,5月份在华裁员900余人,香饽饽变“臭”了
...
```
<a name="模型训练"></a>
### 2.4 模型训练
#### 2.4.1 预训练模型微调
使用CPU/GPU训练,默认为GPU训练。使用CPU训练只需将设备参数配置改为`--device cpu`,可以使用`--device gpu:0`指定GPU卡号:
```shell
python train.py \
--dataset_dir "data" \
--device "gpu" \
--max_seq_length 128 \
--model_name "ernie-3.0-medium-zh" \
--batch_size 32 \
--early_stop \
--epochs 100
```
如果在GPU环境中使�