文本分类任务是一个经久不衰的课题,其应用包括垃圾邮件检测、情感分析等。
传统机器学习的做法是先进行特征工程,构建出特征向量后,再将特征向量输入各种分类模型(贝叶斯、SVM、神经网络等)进行分类。
随着深度学习的发展以及RNN、CNN的陆续出现,特征向量的构建将会由网络自动完成,因此我们只要将文本的向量表示输入到网络中就能够完成自动完成特征的构建与分类过程。
就分类任务而言,CNN比RNN更为合适。CNN目前在图像处理方向应用最为广泛,在文本处理上也有一些的应用。本文将参考 Denny Britz 的 WILDML 教程 IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW
http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/
来设计一个简单的CNN,并将其应用于中文垃圾邮件检测任务。
如果你对深度学习或RNN、CNN等神经网络并不太熟悉,请先移步至 http://www.wildml.com/ 寻找相关文章进行精读,这个博主写的每一篇文章都很好,由浅至深,非常适合入门。
参考understanding-convolutional-neural-networks-for-nlp
http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/
此博文中的CNN网络结构和实现方法绝大部分是参考了 IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW
http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/
这篇文章的,CNN的结构和实现细节在这篇文章均有详述,在此我就不运相同的内容了,在请务必精读这篇文章。
说明:对TREC06C进行了简单的清洗得到,以utf-8格式存储
下载地址: 百度网盘 https://pan.baidu.com/s/1i4HaYTB#list/path=%2F
spam_5000.utf8
5 ......
共5000行,每一行对应一封邮件
ham_5000.utf8
5 ......
共5000行,每一行对应一封邮件
此博文中的CNN网络结构和实现方法绝大部分是参考了 IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW
http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/
这篇文章的,CNN的结构和实现细节在这篇文章均有详述。重复的地方不再说明,主要说说不同的地方。
那篇文章中实现的CNN是用于英文文本二分类的,并且在卷积之前,有一层embedding层,用于得到文本的向量表示。
而本博文中实现的CNN在上面的基础上略有修改,用于支持中文文本的分类。CNN的结构的唯一变化是去掉了其中的embedding层,改为直接将word2vec预训练出的embedding向量输入到网络中进行分类。
网络结构图如下图所示:
在预处理阶段得到了x和y, 接下来将x 和 y 按照一定比例分成训练集train_x, train_y和测试 http://lib.csdn.net/base/softwaretest集dev_x, dev_y。
接着按照batch_size分批将train_x输入至网络TextCNN中进行训练,经过三个卷积层的卷积和max-pool之后,合并得到一个向量,这个向量代表了各个卷积层学到的关于训练数据的某些特征,最后将这个向量输入到一个单层的神经网络并用softmax分类,得到最终的分类结果,计算损失(交叉熵)并开始后向传播,执行批量梯度下降来更新网络参数。
准确率:
误差:
因为数据集并没有标准的训练集和测试集,本文只是按照0.1的比例进行了简单的分割,且并没有对一些重复的文档进行筛选,所以准确率能够达到99%左右。如果用比较标准的数据集,并加入交叉验证等方法,相信准确率会降低一些,但相信准确率仍能够超过绝大部分用传统机器学习的方法写出的分类器。
这两天又在这个网络的基础上,尝试完成一个文本生成的任务(之前大多数人都是用RNN来做的),发现效果并不太好,生成的句子并不通顺。CNN对于分类任务较为擅长,但是卷积和pool丢失了一些上下文信息,因此在对上下文把握方面,RNN还是更甚一筹。当然,有研究表明CNN能够通过调整卷积层的各种参数来获取上下文的特征,但限于我现有的知识水平,并不清楚该怎么调参。只有等将来对CNN和RNN理解更进一步时再继续完善这个任务吧。
附:本文所实现的基于CNN进行垃圾邮件检测的项目下载地址 https://github.com/clayandgithub/zh_cnn_text_classify