王 芳
(太原科技大学 计算机科学与技术学院,太原 030024)
在电子邮件大量使用的同时,也出现了许多垃圾邮件,一方面在时间上有所浪费,同时通过在邮件中夹杂一些带有病毒的网址,有可能窃取电脑中的重要文件,从而损坏被害人计算机中的重要信息。由于英文引起的垃圾邮件的数目可以说是最多的,由此可见,对于英文的垃圾邮件与正常邮件的分类至关重要[1-2]。而如何高效的处理信息则是关注的焦点。邮件分类可以将垃圾邮件进行过滤,提高工作效率。
1)决策树分类
决策树是一种树形结构的分类模型,如图1所示,决策树模型是根据样本的特征属性进行分类,分类结果再次按照属性进行分类,最后模型需要的分类结果。该方法的优点就是非常直观且易于理解,但算法是是贪婪算法,只考虑当前的属性,并且当数据量很大时,过拟合现象经常发生[3-4]。
图1 决策树分类算法Fig.1 Decision tree classification algorithms
2)k近邻分类
k近邻分类算法没有训练阶段,该方法是首先在进行实验时给出训练集,而测试集数据的选取,是选取训练集中的k个值,这k个实例中多数属于哪一个分类,则认为该测试样本属于哪一个分类。
k值需要通过交叉验证法来进行优化选取[5]。
3)朴素贝叶斯分类
朴素贝叶斯分类器模型是首先,计算该数据属于标记的概率,再计算出特征项的概率,再计算出后验概率,最后概率值最大的将会作为该样本的类别,根据其分析内容,该模型与其他分类方法相比存在很小的误差。但是,在选择属性时,在属性个数较多时或者属性之间的相关性较大时,朴素贝叶斯模型的分类效率比不上决策树,但是属性相关性较小时,朴素贝叶斯模型的性能要比决策树好很多[6]。
本文采用的是卷积神经网络进行英文邮件分类。而卷积神经网络通常进行的是图片的处理与识别,并且在图形图像识别方面达到了一定的高度以及效果,所以设计思路就是首先把文字转化为图形图像进行处理,然后用卷积神经网络对邮件分类从而达到预期效果。通过实验结果分析,利用卷积神经网络进行英文邮件中垃圾邮件分类分类在准确率以及分类速度都有明显的提高。
卷积神经网络是一种专门用来处理具有类似网络结构的数据的神经网络,最常见的是其在图像处理上的优秀成果,不仅运行速度快,效率高,而且准确率高。其工作原理是首先通过CONV卷积层进行图像特征的提取,接着通过激活函数层使得特征的提取达到一个非线性的效果,从而使得特征提取得更好,经过多层卷积以及多层激活函数层后,通过pool池化层对之前提取出来的特征进行压缩,最后通过FC全连接层,对之前提取出来的特征进行连接,最终得到属于各个类别的概率值 。
利用卷积神经网络进行英文邮件分类设计思路如下,比如:I like this movie very much,要想使用卷积神经网络,则必须将其转换为图像进行处理,则此句话可以转换为7*5的矩阵,而对于文本数据没有颜色通道,则可以进行卷积操作,但是,对于7*5的文本数据来说,有很大的可能一句话代表不了一个单词,所以可以一次卷积短语来确定filter的大小,通过此类方式构成滑动窗口(3region代表一次卷积三个单词),但是不同的单词数量可能意思不同,所以为了使卷积神经网络更具有代表性,所以设region分别为2,3,4,每个region采用2个filter,通过此类方法,会得到6个特征图,对特征图进行压缩,然后对所有特征图进行全连接操作,对全连接得到的特征图进行压缩,得到最终提取出来的特征并进行分类[7-8]。如图2所示:
图2 卷积神经网络算法Fig.2 Convolutional neural network algorithms
1)数据集选取
本文采用的数据集是Enron邮件数据集,一是该数据集的数据量大,可以在文本分类上有较好的效果,二是该数据集的使用广泛性,所以本文采用该数据,该数据有两种格式:一种是以.txt结尾的原始数据,第二种是经过处理的SQL格式的数据,而在本试验中,本文采用的是前一种格式。
将数据集中的内容分为ham文件夹,其中包含垃圾邮件,spam文件夹,其中包含正常邮件。其中垃圾邮件均已ham.txt结尾,垃圾邮件的数目为3 500个。非垃圾邮件均已spam.txt结尾,正常邮件数目为3 500个。
2)数据处理
①编码格式设置
文件中由于编码格式不当,所以在读取文件中的内容时,首先要将文件中的文本以utf.8的形式进行编码。
②分离单个邮件
当读取邮件进行训练时,需要从邮件的文件夹中读取一封封的邮件进行训练,而在训练时无须区分正常邮件与垃圾邮件,只需要对其进行标记之后再一起进行训练。
③清除非关键字符
在邮件中和结尾会有一些空格出现,所以应该去除掉非关键的字符。
④指定标签
最后要指定正常邮件与垃圾邮件的label值,以判断该邮件属于正常邮件,还是垃圾邮件,最终求取结果的正确率以及损失值,在此次实验中,本文用矩阵[0,1]表示垃圾邮件,[1,0]表示正常邮件。
3)测试集的选取
测试集的选取有三种方法:留出法,交叉验证法、自助法。
本文选择的是交叉验证的方法。因为此次实验的数据集比较大并且交叉验证存在随机性,交叉验证经常在评估模型是时使用,用在本课题上最适合不过了,本身该验证集中的内容和训练集没有很大的出入,使得该方法过拟合风险很小。对比之后本文采用交叉验证。
本文将整个程序内容划分为3各模块,其中包含数据预处理功能、卷积神经算法模块、训练模块,各个模块完成相应的功能,做到模块之间的耦合性低,内聚性高。
该数据预处理的模块在于将数据处理成可供卷积层使用的数据集,对数据集的处理包括编码格式、分离单个邮件、清除字符、指定标签。
1)清除多余字符
在对邮件进行处理时,需要去除一些对结果产生影响的字符,其中包含空格,制表符等字符,保留需要的字符。
2)加载文件
加载文件中的文件,将文件夹中的文件以一个txt为一个单位,作为R组的其中一个值,最终返回R数组。
1)初始化权重参数
在卷积层设计时初始化权重参数W的值,以及b的值。
2)卷积层处理
在卷积层进行处理时,调用Tensorflow中特定的函数conv2d()来进行处理。
3)激活函数层处理
在激活函数层中需要使用Tensorflow中的relu()函数进行处理,将之前卷积层产生的结果与参数b进行运算。
4)池化层处理
在迟化层中需要使用Tensorflow中的max_pool()函数进行处理,将激活函数层的结果作为max_pool的实际参数,计算出结果。
5)全连接层处理
在全连接层中需要使用Tensorflow中的concat()函数进行处理,将池化层的结果作为参数,计算结果。
6)学习率处理
当通过模型调整参数时,需要按一定的比例修改之前的参数。
7)损失值计算
当通过测试集测试其准确率以及损失值loss,来观察每一次测试的损失情况。
风影跟到了天井里,站定了,看着头顶青色的天空。以往寺院的大门关了的时候,他也经常来到这里,抬头看天空,白天看云飘过,夜晚看星闪亮。这里还可以听到虫子的鸣叫,声音很好听,就像弹琴一样。听着虫叫,聊解寂寞。风影开始想爹想娘了,他想娘比想爹要多一点,因为爹有时脾气火爆,对他很凶,而娘从来都温柔如水,从来不凶巴巴的。他心里想哭,眼泪开始在眼眶里面打转,小和尚的心思没有谁知道,小和尚的伤心也就没有谁能抚慰。
8)准确率计算
当通过测试集测试其准确率accurancy以及损失值,来观察每一次测试的准确率情况。
1)超参数
其中的参数包括隐层维度embedding_dim,卷积大小filter_sizes,特征图的大小num_filters,学习率dropout_kep_prob,惩罚项l2_reg_lambda。
2)训练时需要的参数
其中包括每次需要训练的个数batch_size,迭代次数num_epochs,每次显示的结果数目100条evalute_every,每100次保存一次结果checkpoint_every,保存最近5次的结果num_checkpoint。
3)数据集划分(训练集、测试集)
根据训练集与测试集所占的比例变量来划分训练集与测试集,x_train,y_train表示训练集的数据以及标记x_dev,y_dev表示测试集的数据以及标记
4)卷积
开始是用卷积神经网络进行卷积操作,调用卷积神经网络算法模块,执行卷积神经操作。
本实验采用的是基于卷积神经网络的英文邮件分类,通过训练出模型然后用测试集得到准确率,该实验100次实验保存一次数据,总是保存最新的5次数据。
1)实验一和实验二
在第一次做此次实验时,采用的数据集是一些非正规的邮件数据集,经过Tensorflow框架编写出卷积神经网络的简单过程,得到的准确率仅仅只有50%左右.
在第二次试验中,通过更换数据集,采用的Enron公司提供的开放的数据集,使得准确率有了一定的提高,达到了65%左右,也存在一些准确率高达81%.
经过的数据集的变化选取,在模型的准确率方面有了一定的提高,从之前的50%上升到了65%左右,在准确率上有了一定的提高,对比结果如表1所示。
表1 不同数据集训练结果对比
2)实验三
在实验中数据集仍采用Ernor数据集,实验三共做了四次小实验,分别为:
①在实验三中,通过修改embedding.dim(隐层维度)的值,将其从64调节到128,发现准确率下降很快,结果如表2所示:
表2 实验三训练结果
续表2
分析:当实验中隐层维度上升时,准确率下降的很快
结论:隐层维度为64的时候最佳
②将filter.size修改,将其值由原来的1,2,3换为2,3,4,结果如表3所示:
表3 实验四训练结果
续表3
分析:当卷积的数目从1,2,3变为2,3,4时,准确率有了明显的下降,平均准确率在40%左右,最低为28%.
结论:在卷积个数上面,1,2,3,使得准确更高一些。
③将惩罚项为0,将其值由原来的0转换为0.1,结果如表4所示:
表4 实验五训练结果
续表4
分析:对惩罚项小幅度的调整,本文发现准确率提高很大,所以接下来试一下为0.2时,结果如表5所示:
表5 实验六训练结果
续表5
④学习率从0.5调整0.1,结果如表6所示:
分析:相比于学习率为0.1,学习率为0.2并没有太大的提高,而且存在小幅度的减小。
结论:学习率为0.1较为合适。
续表6
从表2到表6完成了对同一数据集的不同参数进行修改后的测试,得到表7:
表7 实验三至实验七结果对比
本文基于Python语言,采用Google的Tensorflow框架,实验部分本文采用的数据集是Enron邮件数据集,在Enron数据集的基础上对准备的数据进行一些关于数据集预处理的操作;根据卷积神经网络的一些结构以及层次。利用前向传播以及最初做好的邮件类型标记进行分类,然后利用反向传播调节参数,使得参数达到一个最好值;在该项研究中,本文采用的是交叉验证,即将整个数据及分为测试集以及训练集,通过训练集训练处模型,再通过测试集测试结果(该测试集也存在测试标记),得到该模型的较高正确率,从而方便其用于英文邮件的分类。