README_CODE.md 9.0 KB
Newer Older
K
Kennycao123 已提交
1 2 3 4
# 代码结构、准备工作

## 代码结构

W
webyfdt 已提交
5
- 分类任务位于erniekit_appzoo/tasks/text_classification
K
Kennycao123 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

```plain
.
├── data        # 训练数据
│   ├── dev_data
│   │   └── dev_1.txt
│   ├── dev_data_one_sent_multilingual
│   │   └── multi_dev.tsv
│   ├── dict
│   │   ├── sentencepiece.bpe.model
│   │   └── vocab.txt
│   ├── download_data.sh
│   ├── multi_label_data
│   │   ├── dev_data
│   │   │   └── dev.txt
│   │   ├── test_data
│   │   │   └── test.txt
│   │   └── train_data
│   │       └── train.txt
│   ├── predict_data
│   │   └── infer.txt
│   ├── predict_data_one_sent_multilingual
│   │   └── multi_predict.tsv
│   ├── test_data
│   │   └── test.txt
│   ├── test_data_one_sent_multilingual
│   │   └── multi_test.tsv
│   ├── train_data
│   │   └── train.txt
│   └── train_data_one_sent_multilingual
│       └── multi_train.tsv
├── data_set_reader    # 数据加载相关类
│   ├── dataset_reader_for_ernie_doc_classification.py
│   └── __init__.py
├── examples
│   ├── cls_bow_ch_infer.json
│   ├── cls_bow_ch.json
│   ├── cls_ernie_doc_1.0_one_sent_ch_infer_dy.json
│   ├── cls_ernie_doc_1.0_one_sent_ch.json
│   ├── cls_ernie_fc_ch_infer.json
│   ├── cls_ernie_fc_ch.json
│   ├── cls_ernie_fc_ch_with_data_aug.json
│   ├── cls_ernie_m_1.0_base_one_sent_infer.json
│   ├── cls_ernie_m_1.0_base_one_sent.json
│   ├── cls_ernie_multi_label_ch_infer.json
│   └── cls_ernie_multi_label_ch.json
├── inference       # 推理相关类
│   ├── custom_inference.py
│   ├── ernie_doc_inference_dy.py
│   └── __init__.py
├── __init__.py
├── model
│   ├── base_cls.py
│   ├── bow_classification.py
│   ├── ernie_classification.py
│   ├── ernie_doc_classification.py
│   ├── __init__.py
│   └── multi_label_classification.py
├── reader
│   ├── categorical_field_reader.py
│   └── multi_label_field_reader.py
├── run_infer_dy.py   #ernie_doc 动态图预测的py文件
├── run_infer.py      # 除enrie_doc外的预测文件入口文件,只依靠json进行模型训练的入口脚本
├── run_trainer.py.   # 训练文件入口文件,只依靠json进行模型训练的入口脚本
├── run_with_data_aug.sh
└── trainer
    ├── custom_dynamic_ernie_doc_trainer.py
    ├── custom_dynamic_trainer.py
    ├── custom_trainer.py
    └── __init__.py
```

## 数据准备

- 在文心中,基于ERNIE的模型都不需要用户自己分词和生成词表文件,非ERNIE的模型需要用户自己提前切好词,词之间以空格分隔,并生成词表文件。切词和词表生成可以使用「[分词工具与词表生成工具](../../tools/data/wordseg/README.md)」进行处理。
- 文心中的所有数据集、包含词表文件、label_map文件等都必须为为utf-8格式,如果你的数据是其他格式,请使用「[编码识别及转换工具](../../tools/data/data_cleaning/README.md)」进行格式转换。
W
webyfdt 已提交
82
- 文心中的训练集、测试集、验证集、预测集和词表分别存放在./erniekit_appzoo/tasks/text_classification/data目录下的train_data、test_data、dev_data、predict_data、dict文件夹下。
K
Kennycao123 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
- 在分类任务中,训练集、测试集和验证集的数据格式相同,数据分为两列,列与列之间用**\t**进行分隔。第一列为文本,第二列为标签。以下为示例:

### 单标签分类

- 非ERNIE训练集数据示例:数据分为两列,列与列之间用**\t**进行分隔。第一列为文本,第二列为标签。

```js
房间    其他   一般                  0
LED屏 就是   基本 硬件 配置   均衡  镜面   不错  小黑  我喜欢          1
  要命 , 很大 股霉味 , 勉强   一晚 , 第二天 大早 赶紧          0
```

- 非ERNIE预测数据集示例:仅一列为文本,不需要标签列

```js
USB接口 只有 2       不能  太多   设备  表面 容易 留下 污垢  
平时  用来 工作   上网  挺不错   没有 冗余  功能  样子  比较 正式   可以   价格 实惠   宾馆 反馈   2008年4月17日      谢谢  欢迎 再次 入住 其士 大酒店 
```

- 非ERNIE模型的词表文件示例:词表分为两列,第一列为词,第二列为id(从0开始),列与列之间用**\t**进行分隔。文心的词表中,[PAD]、[CLS]、[SEP]、[MASK]、[UNK]这5个词是必须要有的,若用户自备词表,需保证这5个词是存在的。部分词表示例如下所示:

```js
[PAD]	0 
[CLS]	1 
[SEP]	2 
[MASK]	3 
[UNK]	4 
郑重	5 
天空	6 
工地	7 
神圣	8
```

- ERNIE数据集与非ERNIE数据集格式一致,不同之处在于不用分词,如下所示:

```js
选择珠江花园的原因就是方便有电动扶梯直接到达海边周围餐馆食廊商场超市摊位一应俱全酒店装修一般但还算整洁         1 
15.4寸笔记本的键盘确实爽基本跟台式机差不多了蛮喜欢数字小键盘输数字特方便样子也很美观做工也相当不错         1 
房间太小其他的都一般。。。。。。。。。         0
```

- ERNIE词表文件格式与非ERNIE的格式一致,由文心提供。

```js
[PAD]   0 
[CLS]  1 
[SEP]  2 
[MASK] 3 
  4 
  5 
  6 
  7 
  8 
  9
```

### 多标签分类

- ERNIE训练集数据示例:数据分为两列,列与列之间用**\t**进行分隔。第一列为文本,第二列为标签,当该样本拥有多个标签时,标签之间使用空格进行分隔。比如你的标签有100种,某个样例的标签是第50个标签和第87个标签,其标签列就是“49 86”。像这个情况就是标签的第49和86维是正例1,其他维是负例0。非ERNIE的训练集数据与ERNIE一致,区别就是非ERNIE的文本需要切词,这里不再赘述。

```js
互联网创业就如选秀 需求与服务就是价值	0 1 
郭德纲式生存时代的变与未变	2 
快讯腾讯市值突破10000亿港元	3
```

- ERNIE预测数据集示例:仅一列为文本,不需要标签列,非ERNIE的训练集数据与ERNIE一致,区别就是非ERNIE的文本需要切词,这里不再赘述。

```js
互联网创业就如选秀 需求与服务就是价值 
郭德纲式生存时代的变与未变 
快讯腾讯市值突破10000亿港元
```

- 词表的格式与单标签分类一致,不再赘述

## 网络(模型)选择

W
webyfdt 已提交
161
文心预置的可用于文本分类的模型源文件在./erniekit_appzoo/tasks/text_classification/model目录下,各个模型的特点如下所示(后面章节会依次展示使用方法):
K
Kennycao123 已提交
162 163 164 165 166 167 168 169 170 171

| 网络名称(py文件的类名)                                | 简介                                                         | 支持类型   | 支持预训练模型                                               | 备注 |
| ------------------------------------------------------- | ------------------------------------------------------------ | ---------- | ------------------------------------------------------------ | ---- |
| BowClassification(bow_classification.py)                | 词袋模型,不考虑语法和语序,用一组无序单词来表达一段文本。   | 单标签分类 | 无                                                           |      |
| ErnieClassification(ernie_classification.py)            | 基于ERNIE预训练模型的最简单的分类模型,在ERNIE的embedding输出层之后直接添加FC(全链接层)降维到标签数量的纬度,loss使用交叉熵。网络结构简单,效果好。 | 单标签分类 | ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium、ERNIE-M |      |
| MultiLabelClassification(multi_label_classification.py) | 处理多标签分类任务的网络结构,在ErnieClassification的基础上,loss由二分类交叉熵更换为 sigmoid cross entropy | 多标签分类 | ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium、ERNIE-M |      |
| ErnieDocClassification(ernie_doc_classification.py)     | 长文本分类任务的网络                                         | 单标签分类 | ERNIE-Doc                                                    |      |

## ERNIE预训练模型下载

T
Tesla 已提交
172
文心提供的ERNIE预训练模型的参数文件和配置文件在./erniekit_appzoo/tasks/models_hub/目录下,由对应的download_xx.sh文件是下载得到。ERNIE部分模型介绍,请详见文档「[ERNIE模型介绍](../../models_hub/README.md)
K
Kennycao123 已提交
173 174 175

## 模型评估指标选择

T
Tesla 已提交
176
分类任务常用的指标有:Acc(准确率)、Precision(精确率)、Recall(召回率)、F1。