最为自然语言处理中最为基础的任务,文本分类一直受到了很多的关注,本文主要关注在深度学习在文本分类中的应用。通过textCNN,DCNN,RCNN,HAN四种经典的文本分类模型来描述深度学习在文本分类模型中的应用。
目前,大多数的深度学习都是从CNN神经网络模型开始的,我们知道,CNN模型被更多的应用在了图像领域之中,原因在于相比于文本数据,图像数据更加的整齐,一张图片可以很容易的就被抽象成一个矩阵的形式,矩阵中的每一个元素可以看做是一个像素点,定义一个或者多个CNN的卷积核,可以很容易的在矩阵上进行滑动,进而通过池化操作,最终可以抽取的图片中的特征。而文本数据和图片数据不同,首先,在文本数据中,我们无法去规范一个词的大小,因为其可能有单个字,也有可能由多个字所组成,在上一层,我们也无法去确定一个句子中词的个数。由于这种数据的不规整性,我们在应用CNN这种模型的时候需要一些额外的设计。一般来讲,当我们面对的是文本数据的时候,我们对于这种数据的处理方式一般包括以下两种:
这里假设各位读者对于CNN模型已经有了基本的了解,所有这里就不对CNN模型在进行赘述了。整个TextCNN模型的基本组成包括初始的Embedding层,卷积层,池化层和输出层。整体如下图所示:
Embedding层作为所有NLP任务的基础,如何对于文本中的词汇进行Embedding可能会决定模型后续的效果,一般来讲,模型的Embedding包括两种种方法。
第一种是采用词袋模型和读热编码,这种方式指的是将文本整理成词表的形式,每一个词的向量的维度为V,V为词典的大小,在根据词汇在词表中的位置,将对应的位置标记为1,其他位置标记为0,形成一个01向量。进一步,可以采用TF-IDF等频率统计算法来确定每一个词的TF-IDF的值,将01向量变成0TF-IDF的形式。
第二种方式是采用训练的的方式,为每一个词生成一个稠密的向量表示,生成的算法包括ELMO,GLOVE,Word2Vector,Bert等算法,一般思想都是基于语言模型来为每一个词生成一个词向量。
相对而言,预训练的方式采用的更多,因为预训练的模型中考虑了模型的语义信息,也就是可以为后面的层提供更多的特征信息。
在得到每一个词的词向量之后,我们就可以根据词向量来组成一个表示句子或者文本的矩阵,矩阵中的行是一个词的词向量。这里需要注意的是,由于句子或者文本中的词的数量不同,那么组成的表示句子或者文本的矩阵的行数是不同的,一般可以采用截断或者填充的方式进行进一步的处理成规范的数据。最终的用公式表示拼接的过程为:
X = [ X 1 : X 2 , . . . . . , X n ] X=[X_1:X_2,.....,X_n] X=[X1:X2,.....,Xn]
文本中包括n个词汇,每一个词汇的向量表示为 X i X_i Xi,最终形成的矩阵用X来表示。
在获得句子或者文本矩阵之后,我们下一步的操作就是一个卷积操作,一般来讲,我们在处理图片数据的时候,因为图片可以抽象成一个二维的矩阵,所以我们将卷积核定义成一个二维的,但是对于文本数据而言,其表示矩阵是由一个一个词的词向量拼接而成,如果采用的二维的卷积核,在矩阵上滑动会涉及到的是每一个词的一部分信息,这些被抽取到的信息显然不能作为一个句子或者文本的特征。也就是说这种二维的卷积的实际意义并不大,所以这里我们选择的是一维的卷积方式。逐个的在每个词上进行特征抽取,进而表示成文本的特征矩阵。在论文中定义了三个区域,第一个每个区域的长度为4,3,2,这里可以理解成语言模型的n-gram过程。然后在每个区域上定义两个卷积核,每个卷积核的维度为4。经过卷积核的滑动之后,生成了如上图的第二个部分的文本特征矩阵。三个区域,每一个区域生成两个文本特征矩阵。该部分如下图所示:
用公式表示上述每一个卷积过程为:
C i = f ( W ⋅ X i : i + h − 1 + b ) C_i=f(W·X_{i:i+h-1}+b) Ci=f(W⋅Xi:i+h−1+b)
在获得卷积结果之后,下一步就是池化操作,池化操作本事的目标就是放大视野,提取泛化特征,提高模型的泛化能力。论文中采用的是一维的池化核,对卷积结果中的每一行进行最大池化操作,每一个提取出一个池化特征。然后将各个池化结果进行拼接,形成池化结果。如下图所示:
C i ∗ = m a x { C i } C_i^*=max\{C_i\} Ci∗=max{Ci}
通过上面池化的结果,我们可以得到关于文本或者句子的特征向量,通过softmax的操作,我们就可以对文本进行分类操作。其最终的计算结果如下图所示:
y = s o f t m a x ( W ⋅ [ C i 1 : C i 2 : , . . , : C i k ] + b ) y=softmax(W·[C_i^1:C_i^2:,..,:C_i^k]+b) y=softmax(W⋅[Ci1:Ci2:,..,:Cik]+b)
作为一个经典的文本分类模型,TextCNN的分类机制比较简单,便于理解。并且通过不同特征区域的划分,再做卷积的方式,一定程度上考虑到了语义信息。