深度学习在文本分类中的应用

引言

文本分类这个在NLP领域是一个很普通而应用很广的课题,而且已经有了相当多的研究成果,比如应用很广泛的基于规则特征的SVM分类器,以及加上朴素贝叶斯方法的SVM分类器,当然还有最大熵分类器、基于条件随机场来构建依赖树的分类方法、当然还有普通的BP神经网络分类方法。在传统的文本分类词袋模型中,在将文本转换成文本向量的过程中,往往会造成文本向量维度过大的问题,当然也有其他的压缩了维度的一些分类方法。然而,以上的这些方法,又因为在训练的过程中丢失了单词的顺序信息,在文本的分类过程中,效果又不一定尽如人意。本文主要是在学习了几篇深度学习在文本分类上的研究的论文【1,2,3,4,5】以及博文【6】之后,对其论文中提到的方法做一个简单的总结和回顾。

背景

本博文中设计的深度学习内容主要指的是RNN和CNN,而在论文【1,2,3,4,5】中其实主要涉及的是使用CNN进行文本建模与分类,论文【3】提到了使用RNN训练文本向量的方法,所以为了描述的简单起见,我直接使用了深度学习来表示本文中使用的分类方法。
CNN之所以能够被广泛运用到文本分类中去,主要的原因其实很简单,因为CNN和N-gram模型相似,CNN中的filter window其实可以看做是N-gram的方法,不过CNN因为使用了卷积层和pooling层,使得CNN能够一方面减少了训练参数个数,同时也能够抽取到文本的更高层的信息。而RNN更多的是用在文本建模以及机器翻译上,直接用在文本分类上好像不是很多的样子。

CNN用于文本分类

这里打算使用论文【1,2】来说明CNN在文本分类上的应用。两篇文章发表的日期非常接近,都是2014年的文章。

  • 首先来看看论文【1】(Convolutional Neural Network for Sentence Classification)的具体方法

    来看下作者的CNN结构:
    深度学习在文本分类中的应用_第1张图片
    解释一下上图:
    在最左边的输出层有两个channel,每个channel是一个二维的矩阵,矩阵的列的长度等于语句sentence的长度(也就是sentence中的单词个数,通过padding使得待分类的每个sentence都有相同的长度),矩阵的行向量表示每个单词的向量形式,文中作者使用了word2vec工具初始化了,也就是每个单词都做了embedding。两个channel在初始化的时候是一样的,而之所以使用了两个channel就是因为两个channel的目的不一样,其中一个为static,也就是在给定了embedding之后,其值就不会变了,另一个channel为 non-static,表示embedding向量是参数,也是需要在推导中求出来的。使用两个channel的目的是考虑到:第一,如果只是使用static,由于使用word2vec的训练语料和试验中的实验语料可能存在不一致,导致embedding存在偏差;第二,如果只是使用单方面的non-static向量,其初始化对其结果和收敛快慢都有影响。所以使用混合的channel能够使上面的两种问题得到“中和”。
    在输入层之后就是卷积层,以上图为例,最上面的filter的shape是3*6,也就是对于这句话:“wait for the vedio and do n’t rent it”,这个filter每隔三个词就做一次卷积操作,对于长度为8的句子,在这个filter的卷积操作之后,会产生一个7*1的输出。当然卷积层的filter个数和filter的shape都是可以变的,原理是一样的。
    后面的一层是pooling层,这篇论文使用的是max-pooling,也就是上文的7*1 的卷积层输出将会pooling成一个1*1的数值,有n个filter就会产生n个1*1的数值,这n个数值将会用于后面的全连接层。
    之后是一个全连接输出层,输出层输出的个数对应的是文本的类别数量,将上面的n个pooling层输出全连接到输出层,输出层使用的是softmax激励函数。

    从上面的描述可以看出,CNN对于分本分类的思路很清晰,实现起来也不难,参数的训练我就不提了,其实验结果我会在后面的部分中给出代码和结果

  • 然后来看看论文【2】(Effective Use of Word Order for Text Categorization with Convolutional Neural Networks)对CNN分类方法的讨论
    有了上面的基础,理解论文2的观点也就变得容易了,其实论文【2】在对文本向量的预处理过程中还是显得略微粗糙,直接使用的是one-hot模型,不过是进行了一些的改进。主要的区别还是在词向量的表达方式上,在该篇论文中,作者直接使用了one-hot词向量模型,这个作者称之为seq-CNN的模型,它显然这会带来维度的剧烈增加,然后作者提出了一种改进型:bow-CNN模型,其实就是将附近的连续几个单词构建成一个词向量,其区别如下:
    深度学习在文本分类中的应用_第2张图片
    seq-CNN模型
    深度学习在文本分类中的应用_第3张图片
    bow-CNN模型
    其余的训练过程和1类似,所以就不提及了。

CNN和RNN的混合使用

  • CNN和RNN用于文本向量的训练
    论文【4】的观点比较独特,作者倒不是用CNN或者RNN去做分类模型,而是使用了CNN和RNN去训练了文本的向量,最后反而是使用普通的ANN作为分类器,这里就主要说一说作者的产生文本向量的过程
    首先看看CNN模型是如何产生文本向量的。
    对于长度为l的sentence,每个单词都是m维的词向量,对于一个filter,其操作如下:
    深度学习在文本分类中的应用_第4张图片
    上图是filter的shape是3*m,在卷积层,能够得到C1C2..Cl-2,然后对这个进行max-pooling操作,最终得到一个数值
    使用n个filter重复上面的操作,我们能够得到一个n维的向量s,这个就是我们得到的文本向量。
    然后看看RNN模型是如何产生文本向量的。
    文中作者使用的是RNN的变体LSTM,其结构如下:
    深度学习在文本分类中的应用_第5张图片
    上面的x1-xl也是m维度的向量,而h1-hl是维度为n的一维向量,最后面的Pooling层代用的是max-pooling或者mean-pooling
    得到文本向量之后就可以送入ANN神经网络分类器里面去进行分类训练了,训练过程就不提及了
  • CNN和RNN的混合模型使用
    论文【3】(A C-LSTM Neural Network for Text Classification)提到了一种新的模型,也就是将CNN和RNN混合使用作为文本的分类器,论文是2015年的,我觉得观点还是比较新鲜的,所以特地拿出来讲一下。
    模型如下:
    深度学习在文本分类中的应用_第6张图片
    前面的卷积层和前面的文章提到的是一样的,也就是对于每个filter,从sentence的embedding矩阵进行卷积操作之后,得到feature map,然后重点来了,从feature map 层到window feature sequence层,把相同颜色的放在一个序列里面,然后依次排列下来,其实很好看到,在window feature sequence层的每个序列,其实和原始sentence的序列是对应的,保持了原有的相对顺序,只不过是中间进行了卷积的操作。

window feature sequence层的序列向量是下一层的LSTM的网络的输入input,该网络使用了最后一层中间层的隐含层输出h作为该网络的输出结果output。然后就是训练LSTM的参数问题了。

实验

本文的实验是根据博文IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW进行重复实验的。针对的是论文【1】所提出的实验。

实验数据: Movie Review data from Rotten Tomatoes
数据说明:电影评论:5331的正面评论和5331的负面评论
实验工具:Google的tensor flow框架
测试集:1000
训练集:剩下的数据

实验结果:
深度学习在文本分类中的应用_第7张图片
说明:红色线表示的是训练集,蓝色线表示的是测试集,测试集的准确度最好大概能到76%,这和论文中的数据差不多

结论

深度学习在这几年特别火,在NLP领域,深度学习也是风中翘楚,尤其是在机器翻译、语音识别等领域颇有建树,这次也是总结了几篇关于文本分类的这方面论文,顺别学习一下Google的深度学习tensor flow框架,还是有一点小收获的。

参考文献

[1]Kim Y. Convolutional Neural Networks for Sentence Classification[J]. Eprint Arxiv, 2014.
[2]Johnson R, Zhang T. Effective Use of Word Order for Text Categorization with Convolutional Neural Networks[J]. Eprint Arxiv, 2014.
[3]Zhou C, Sun C, Liu Z, et al. A C-LSTM Neural Network for Text Classification[J]. Computer Science, 2015.
[4]Ji Young Lee, Franck Dernoncourt. Sequential Short-Text Classification with Recurrent and Convolutional Neural Networks[J]. 2016.
[5]Kalchbrenner N, Grefenstette E, Blunsom P. A Convolutional Neural Network for Modelling Sentences[J]. Eprint Arxiv, 2014, 1.
[6] IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW

你可能感兴趣的:(自然语言处理,深度学习)