文本分类(三)专栏主要是对Github优秀文本分类项目的解析,该文本分类项目,主要基于预训练语言模型,包括bert、bert + CNN/RNN/RCNN/DPCNN、ERNIE等,使用PyTorch实现。
目录
1. 项目特点
相比于文本分类(一)、(二),它主要有以下几个不同:
1)提供了一种不同的数据预处理方式。文本分类(一)中我们使用的是THUCNews完整数据集,每条数据都是完整的新闻,属于篇章分类;文本分类(二)、(三),我们使用的是THUCNews的一个子集,每条数据都是从新闻中抽取的标题,属于标题(短文本)分类。之前我们是提前把数据预处理好,存储为数组或tensor的格式,训练时再从文件中加载,适合数据量比较大的情况;现在我们预处理和训练同时进行,将数据预处理完接着进行训练,不需要存储为中间文件,适合数据量比较小的情况。
2)数据生成器:当数据比较大时,没办法一次性把数据全部加载到内存或显存中,此时我们可以使用数据生成器。训练时,不是把全部数据都加载到内存或显存中,而是用到哪一部分数据(某个batch),就用数据生成器生成该部分数据,只把这部分数据加载到内存或显存中,避免溢出。在文本分类(一)中,我们把预处理好的数据想封装为Dataset对象,再使用DataLoader进行加载(PyTorch内置);在文本分类(二)、(三)中,我们自定义数据生成/迭代器。
3)词典/字典构造方式:在文本分类(一)、(二)中我们需要首先构建词典或字典,再把文本中的词或字转变为词典或字典中的索引。在文本分类(三)中使用基于Bert的模型时,不需要手动构建词典或字典,需要下载所使用的Bert模型对应的词表,用Bert内置的分词工具对输入文本进行处理,内部会自动把文本转换为词表中的索引。
4)文本分类(二)中主要是基于character-level,文本以字为间隔进行分割,当然也提供了word-level的版本;文本分类(一)中主要基于word-level,文本以词为间隔进行分割(需要使用一些分词工具,如jieba)。文本分类(三)中Bert系列模型都是character-level,文本都是以字为间隔进行分割(汉语)。
5)命令行工具:文本分类(一)把项目所有相关的超参数都集中在一个文件中,若要修改配置,可以利用fire工具在命令行进行覆盖;文本分类(二)、(三)使用的是argparse工具,每个模块都有一个对应的配置类(包含该模块的超参数)和一个对应的模型定义类(超参定义和模型定义在一个文件中)。
6)使用模型:文本分类(一)和文本分类(二)所使用的模型差不多,都是一些基于深度学习的模型。不同在于,文本分类(二)的FastText模型增加了bi-gram、tri-gram特征,且增加了Transformer模型(利用transformer encoder进行分类)。文本分类(三)主要是基于预训练语言模型,如Bert和ERNIE,在对输入经过encoder编码后,取[CLS] token(输入序列最前面需要添加特定的[CLS] token表示序列开始)对应的最后一层编码向量(隐状态),再接全连接层进行分类;以及预训练语言模型和深度学习模型的结合,如Bert + CNN/RNN/RCNN/DPCNN,即取Bert最后一层所有的编码向量作为后续深度学习模型的输入,再进行分类。
7)文本分类(三)在预处理阶段,需要指明输入序列中哪些部分是填充的,哪些部分是非填充的,如填充部分的token对应0,非填充部分token对应1.在Bert encoder编码过程中,计算多头注意力时,需要把填充部分token的内积结果加mask(置为非常小的数)。
上述是三个项目主要的不同,当然还有一些编码风格和一些具体细节的差异,之后的几篇博客,我会详细介绍。多解析一些相关项目,不仅可以加深我们对该领域的理解,还可以掌握一些不同的编码风格,可以让我们在编程时根据不同的情况有更多选择、更灵活,而且可以更容易的看懂别人优秀的开源代码。
2. 数据集
在THUCNews中抽取20w新闻标题,文本长度在20-30之间,一共10个类别,每个类别2万条。
类别:财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐。
数据集划分:训练集18w(每个类别18,000条),验证集和测试集各1w(每个类别1000条)。
3. 项目组织结构
1)bert_pretrain:bert_config.json和pytorch_model.bin存储了相关bert模型的结构和预训练参数以及相关超参数配置等,vocab.txt是相关bert模型的词表。可以在该网站下载(https://s3.amazonaws.com/models.huggingface.co).本项目使用的是bert-base-Chinese。
2)ERNIE_pretain:包含了ERNIE模型的结构和预训练参数以及相关超参数配置文件以及ERNIE模型的词表文件百度网盘下载链接。
3)models:各个模型的定义以及各自超参数定义
4)pytorch_pretained:pytorch加载预训练语言模型的库,包含了在Pytorch中加载和使用预训练语言模型的通用方法,下载好预训练语言模型(如 bert、XLnet、ERNIR、ALBert、RoBerta等等)相关的文件(配置文件.json、模型文件.bin,词表文件vocab.txt),就可以使用该库加载和使用了。
5)THUCnews/data:存储训练集、验证集、测试集(处理成txt格式,每条数据一行,格式:文本<tab>标签)。
6)run.py:程序入口
7)train_eval.py:定义训练、验证、测试函数
8)utils.py:定义数据预处理和加载的函数
4. 使用方式
1)下载好预训练语言模型(如 bert、XLnet、ERNIR、ALBert、RoBerta等等)相关的文件(配置文件.json、模型文件.bin,词表文件vocab.txt),存储在相应的位置。就可以在程序中使用pytorch_pretained库中的方法加载使用了。
2)训练并测试: