基于卷积神经网络(CNN)的中文垃圾邮件检测

前言

文本分类任务是一个经久不衰的课题,其应用包括垃圾邮件检测、情感分析等。

传统机器学习的做法是先进行特征工程,构建出特征向量后,再将特征向量输入各种分类模型(贝叶斯、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,并将其应用于中文垃圾邮件检测任务。

正文

1 预备知识

1.1神经网络基础知识

如果你对深度学习或RNN、CNN等神经网络并不太熟悉,请先移步至 http://www.wildml.com/ 寻找相关文章进行精读,这个博主写的每一篇文章都很好,由浅至深,非常适合入门。

1.2如何将CNN运用到文本处理

参考understanding-convolutional-neural-networks-for-nlp

http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/

1.3CNN网络结构和实现方法(必读)

此博文中的CNN网络结构和实现方法绝大部分是参考了 IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW

http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

这篇文章的,CNN的结构和实现细节在这篇文章均有详述,在此我就不运相同的内容了,在请务必精读这篇文章。

2 训练数据

2.1 中文垃圾邮件数据集

说明:对TREC06C进行了简单的清洗得到,以utf-8格式存储

下载地址: 百度网盘 https://pan.baidu.com/s/1i4HaYTB#list/path=%2F

2.2垃圾邮件

spam_5000.utf8

5 ......

共5000行,每一行对应一封邮件

2.3正常邮件

ham_5000.utf8

5 ......

共5000行,每一行对应一封邮件

3 预处理

3.1输入

  • 上述两个文件 ( spam_5000.utf8 ham_5000.utf8)
  • embedding_dim (word embedding的维度, 即用多少维度的向量来表示一个单词)

3.2 输出

  • max_document_length (最长的邮件所包含的单词个数)
  • x (所有邮件的向量表示, 维度为[所有邮件个数,max_doument_length, embedding_dim])
  • y (所有邮件对应的标签,[0, 1]表示正常邮件,[1, 0]表示垃圾邮件,y的维度为[所有邮件个数, 2])

3.3 主要流程

  • 3.3.1 过滤字符 为了分词的方便,示例程序中去除了所有的非中文字符,你也可以选择保留标点符号,英文字符,数字等其他字符,但要在分词时进行一定的特殊处理
  • 3.3.2 分词 为了训练Word2Vec 模型,需要先对训练文本进行分词。这里为了方便起见,直接对每个中文字符进行分隔,即最后训练处的word2vec 的向量是对字的embedding, 效果也比较不错
  • 3.3.3 对齐 为了加快网络的训练过程,需要进行批量计算,因此输入的训练样本需要进行对齐(padding)操作,使得其维度一致。这里的对齐就是把所有的邮件长度增加到max_document_length (最长的邮件所包含的单词个数),空白的位置用一个指定单词进行填充(示例程序中用的填充单词为”PADDING”)
  • 3.3.4 训练word2vec 在对文本进行分词和对齐后,就可以训练处word2vec模型了,具体的训练过程不在此阐述,程序可以参考项目文件中的word2vec_helpers.py。

4 定义CNN网络与训练步骤

4.1 网络结构

此博文中的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向量输入到网络中进行分类。

网络结构图如下图所示:

4.2 训练步骤

在预处理阶段得到了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分类,得到最终的分类结果,计算损失(交叉熵)并开始后向传播,执行批量梯度下降来更新网络参数。

5 结果

准确率:

误差:

因为数据集并没有标准的训练集和测试集,本文只是按照0.1的比例进行了简单的分割,且并没有对一些重复的文档进行筛选,所以准确率能够达到99%左右。如果用比较标准的数据集,并加入交叉验证等方法,相信准确率会降低一些,但相信准确率仍能够超过绝大部分用传统机器学习的方法写出的分类器。

后记

这两天又在这个网络的基础上,尝试完成一个文本生成的任务(之前大多数人都是用RNN来做的),发现效果并不太好,生成的句子并不通顺。CNN对于分类任务较为擅长,但是卷积和pool丢失了一些上下文信息,因此在对上下文把握方面,RNN还是更甚一筹。当然,有研究表明CNN能够通过调整卷积层的各种参数来获取上下文的特征,但限于我现有的知识水平,并不清楚该怎么调参。只有等将来对CNN和RNN理解更进一步时再继续完善这个任务吧。

附:本文所实现的基于CNN进行垃圾邮件检测的项目下载地址 https://github.com/clayandgithub/zh_cnn_text_classify

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2017-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

斯坦福CS231N深度学习与计算机视觉第八弹:神经网络训练与注意点

14330
来自专栏大数据挖掘DT机器学习

在深度学习TensorFlow 框架上使用 LSTM 进行情感分析

在这篇教程中,我们将介绍如何将深度学习技术应用到情感分析中。该任务可以被认为是从一个句子,一段话,或者是从一个文档中,将作者的情感分为积极的,消极的或者中性的。...

85370
来自专栏人工智能

机器学习实战之朴素贝叶斯

机器学习实战之朴素贝叶斯 1.1、简介 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。已知某条件概率,如何得到两个事件交换后...

20870
来自专栏数据科学与人工智能

【应用】 信用评分:第7部分 - 信用风险模型的进一步考虑

以满足科学模型开发的主要标志 - 严谨性,可测试性,可复制性和精确性以及可信度 - 考虑模型验证以及如何处理不平衡数据非常重要。 本文概述了可用于满足这些标志的...

11730
来自专栏计算机视觉战队

深度学习超参数简单理解

首先谢谢读者的指正,现在已经把所有遮挡的都处理完毕,谢谢您们的指正,谢谢! ---- 正文: 说到这些参数就会想到Stochastic Gra...

38440
来自专栏解飞的专栏

实习生的监控算法: 利用机器学习方法进行曲线分类

本篇文章主要采用机器学习的方法来实现曲线分类,基本思路是对训练集先用聚类方法(如Kmeans和Birch等进行聚类,对数据打上标签),然后在对测试集采用分类方法...

1.4K10
来自专栏AI科技评论

干货 | 如何理解深度学习分布式训练中的large batch size与learning rate的关系?

问题详情: 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseli...

85390
来自专栏智能算法

Kaggle热门 | 用一个框架解决所有机器学习难题

Abhishek Thakur:数据科学家每天都要处理数据载入问题。有一些研究者称,自己有60%--70%的时间都花在了数据清洗、处理(筛选)和转换上,从而让机...

50180
来自专栏机器学习算法与Python学习

教你如何用python解决非平衡数据建模(附代码与数据)

96460
来自专栏大数据文摘

机器都会学习了,你的神经网络还跑不动?来看看这些建议

在很多机器学习的实验室中,机器已经进行了上万小时的训练。在这个过程中,研究者们往往会走很多弯路,也会修复很多bug,但可以肯定的是,在机器学习的研究过程中,学到...

11500

扫码关注云+社区

领取腾讯云代金券