王 芳
(太原科技大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,太原 030024)
在電子郵件大量使用的同時,也出現(xiàn)了許多垃圾郵件,一方面在時間上有所浪費,同時通過在郵件中夾雜一些帶有病毒的網(wǎng)址,有可能竊取電腦中的重要文件,從而損壞被害人計算機中的重要信息。由于英文引起的垃圾郵件的數(shù)目可以說是最多的,由此可見,對于英文的垃圾郵件與正常郵件的分類至關(guān)重要[1-2]。而如何高效的處理信息則是關(guān)注的焦點。郵件分類可以將垃圾郵件進行過濾,提高工作效率。
1)決策樹分類
決策樹是一種樹形結(jié)構(gòu)的分類模型,如圖1所示,決策樹模型是根據(jù)樣本的特征屬性進行分類,分類結(jié)果再次按照屬性進行分類,最后模型需要的分類結(jié)果。該方法的優(yōu)點就是非常直觀且易于理解,但算法是是貪婪算法,只考慮當(dāng)前的屬性,并且當(dāng)數(shù)據(jù)量很大時,過擬合現(xiàn)象經(jīng)常發(fā)生[3-4]。
圖1 決策樹分類算法Fig.1 Decision tree classification algorithms
2)k近鄰分類
k近鄰分類算法沒有訓(xùn)練階段,該方法是首先在進行實驗時給出訓(xùn)練集,而測試集數(shù)據(jù)的選取,是選取訓(xùn)練集中的k個值,這k個實例中多數(shù)屬于哪一個分類,則認為該測試樣本屬于哪一個分類。
k值需要通過交叉驗證法來進行優(yōu)化選取[5]。
3)樸素貝葉斯分類
樸素貝葉斯分類器模型是首先,計算該數(shù)據(jù)屬于標記的概率,再計算出特征項的概率,再計算出后驗概率,最后概率值最大的將會作為該樣本的類別,根據(jù)其分析內(nèi)容,該模型與其他分類方法相比存在很小的誤差。但是,在選擇屬性時,在屬性個數(shù)較多時或者屬性之間的相關(guān)性較大時,樸素貝葉斯模型的分類效率比不上決策樹,但是屬性相關(guān)性較小時,樸素貝葉斯模型的性能要比決策樹好很多[6]。
本文采用的是卷積神經(jīng)網(wǎng)絡(luò)進行英文郵件分類。而卷積神經(jīng)網(wǎng)絡(luò)通常進行的是圖片的處理與識別,并且在圖形圖像識別方面達到了一定的高度以及效果,所以設(shè)計思路就是首先把文字轉(zhuǎn)化為圖形圖像進行處理,然后用卷積神經(jīng)網(wǎng)絡(luò)對郵件分類從而達到預(yù)期效果。通過實驗結(jié)果分析,利用卷積神經(jīng)網(wǎng)絡(luò)進行英文郵件中垃圾郵件分類分類在準確率以及分類速度都有明顯的提高。
卷積神經(jīng)網(wǎng)絡(luò)是一種專門用來處理具有類似網(wǎng)絡(luò)結(jié)構(gòu)的數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),最常見的是其在圖像處理上的優(yōu)秀成果,不僅運行速度快,效率高,而且準確率高。其工作原理是首先通過CONV卷積層進行圖像特征的提取,接著通過激活函數(shù)層使得特征的提取達到一個非線性的效果,從而使得特征提取得更好,經(jīng)過多層卷積以及多層激活函數(shù)層后,通過pool池化層對之前提取出來的特征進行壓縮,最后通過FC全連接層,對之前提取出來的特征進行連接,最終得到屬于各個類別的概率值 。
利用卷積神經(jīng)網(wǎng)絡(luò)進行英文郵件分類設(shè)計思路如下,比如:I like this movie very much,要想使用卷積神經(jīng)網(wǎng)絡(luò),則必須將其轉(zhuǎn)換為圖像進行處理,則此句話可以轉(zhuǎn)換為7*5的矩陣,而對于文本數(shù)據(jù)沒有顏色通道,則可以進行卷積操作,但是,對于7*5的文本數(shù)據(jù)來說,有很大的可能一句話代表不了一個單詞,所以可以一次卷積短語來確定filter的大小,通過此類方式構(gòu)成滑動窗口(3region代表一次卷積三個單詞),但是不同的單詞數(shù)量可能意思不同,所以為了使卷積神經(jīng)網(wǎng)絡(luò)更具有代表性,所以設(shè)region分別為2,3,4,每個region采用2個filter,通過此類方法,會得到6個特征圖,對特征圖進行壓縮,然后對所有特征圖進行全連接操作,對全連接得到的特征圖進行壓縮,得到最終提取出來的特征并進行分類[7-8]。如圖2所示:
圖2 卷積神經(jīng)網(wǎng)絡(luò)算法Fig.2 Convolutional neural network algorithms
1)數(shù)據(jù)集選取
本文采用的數(shù)據(jù)集是Enron郵件數(shù)據(jù)集,一是該數(shù)據(jù)集的數(shù)據(jù)量大,可以在文本分類上有較好的效果,二是該數(shù)據(jù)集的使用廣泛性,所以本文采用該數(shù)據(jù),該數(shù)據(jù)有兩種格式:一種是以.txt結(jié)尾的原始數(shù)據(jù),第二種是經(jīng)過處理的SQL格式的數(shù)據(jù),而在本試驗中,本文采用的是前一種格式。
將數(shù)據(jù)集中的內(nèi)容分為ham文件夾,其中包含垃圾郵件,spam文件夾,其中包含正常郵件。其中垃圾郵件均已ham.txt結(jié)尾,垃圾郵件的數(shù)目為3 500個。非垃圾郵件均已spam.txt結(jié)尾,正常郵件數(shù)目為3 500個。
2)數(shù)據(jù)處理
①編碼格式設(shè)置
文件中由于編碼格式不當(dāng),所以在讀取文件中的內(nèi)容時,首先要將文件中的文本以utf.8的形式進行編碼。
②分離單個郵件
當(dāng)讀取郵件進行訓(xùn)練時,需要從郵件的文件夾中讀取一封封的郵件進行訓(xùn)練,而在訓(xùn)練時無須區(qū)分正常郵件與垃圾郵件,只需要對其進行標記之后再一起進行訓(xùn)練。
③清除非關(guān)鍵字符
在郵件中和結(jié)尾會有一些空格出現(xiàn),所以應(yīng)該去除掉非關(guān)鍵的字符。
④指定標簽
最后要指定正常郵件與垃圾郵件的label值,以判斷該郵件屬于正常郵件,還是垃圾郵件,最終求取結(jié)果的正確率以及損失值,在此次實驗中,本文用矩陣[0,1]表示垃圾郵件,[1,0]表示正常郵件。
3)測試集的選取
測試集的選取有三種方法:留出法,交叉驗證法、自助法。
本文選擇的是交叉驗證的方法。因為此次實驗的數(shù)據(jù)集比較大并且交叉驗證存在隨機性,交叉驗證經(jīng)常在評估模型是時使用,用在本課題上最適合不過了,本身該驗證集中的內(nèi)容和訓(xùn)練集沒有很大的出入,使得該方法過擬合風(fēng)險很小。對比之后本文采用交叉驗證。
本文將整個程序內(nèi)容劃分為3各模塊,其中包含數(shù)據(jù)預(yù)處理功能、卷積神經(jīng)算法模塊、訓(xùn)練模塊,各個模塊完成相應(yīng)的功能,做到模塊之間的耦合性低,內(nèi)聚性高。
該數(shù)據(jù)預(yù)處理的模塊在于將數(shù)據(jù)處理成可供卷積層使用的數(shù)據(jù)集,對數(shù)據(jù)集的處理包括編碼格式、分離單個郵件、清除字符、指定標簽。
1)清除多余字符
在對郵件進行處理時,需要去除一些對結(jié)果產(chǎn)生影響的字符,其中包含空格,制表符等字符,保留需要的字符。
2)加載文件
加載文件中的文件,將文件夾中的文件以一個txt為一個單位,作為R組的其中一個值,最終返回R數(shù)組。
1)初始化權(quán)重參數(shù)
在卷積層設(shè)計時初始化權(quán)重參數(shù)W的值,以及b的值。
2)卷積層處理
在卷積層進行處理時,調(diào)用Tensorflow中特定的函數(shù)conv2d()來進行處理。
3)激活函數(shù)層處理
在激活函數(shù)層中需要使用Tensorflow中的relu()函數(shù)進行處理,將之前卷積層產(chǎn)生的結(jié)果與參數(shù)b進行運算。
4)池化層處理
在遲化層中需要使用Tensorflow中的max_pool()函數(shù)進行處理,將激活函數(shù)層的結(jié)果作為max_pool的實際參數(shù),計算出結(jié)果。
5)全連接層處理
在全連接層中需要使用Tensorflow中的concat()函數(shù)進行處理,將池化層的結(jié)果作為參數(shù),計算結(jié)果。
6)學(xué)習(xí)率處理
當(dāng)通過模型調(diào)整參數(shù)時,需要按一定的比例修改之前的參數(shù)。
7)損失值計算
當(dāng)通過測試集測試其準確率以及損失值loss,來觀察每一次測試的損失情況。
風(fēng)影跟到了天井里,站定了,看著頭頂青色的天空。以往寺院的大門關(guān)了的時候,他也經(jīng)常來到這里,抬頭看天空,白天看云飄過,夜晚看星閃亮。這里還可以聽到蟲子的鳴叫,聲音很好聽,就像彈琴一樣。聽著蟲叫,聊解寂寞。風(fēng)影開始想爹想娘了,他想娘比想爹要多一點,因為爹有時脾氣火爆,對他很兇,而娘從來都溫柔如水,從來不兇巴巴的。他心里想哭,眼淚開始在眼眶里面打轉(zhuǎn),小和尚的心思沒有誰知道,小和尚的傷心也就沒有誰能撫慰。
8)準確率計算
當(dāng)通過測試集測試其準確率accurancy以及損失值,來觀察每一次測試的準確率情況。
1)超參數(shù)
其中的參數(shù)包括隱層維度embedding_dim,卷積大小filter_sizes,特征圖的大小num_filters,學(xué)習(xí)率dropout_kep_prob,懲罰項l2_reg_lambda。
2)訓(xùn)練時需要的參數(shù)
其中包括每次需要訓(xùn)練的個數(shù)batch_size,迭代次數(shù)num_epochs,每次顯示的結(jié)果數(shù)目100條evalute_every,每100次保存一次結(jié)果checkpoint_every,保存最近5次的結(jié)果num_checkpoint。
3)數(shù)據(jù)集劃分(訓(xùn)練集、測試集)
根據(jù)訓(xùn)練集與測試集所占的比例變量來劃分訓(xùn)練集與測試集,x_train,y_train表示訓(xùn)練集的數(shù)據(jù)以及標記x_dev,y_dev表示測試集的數(shù)據(jù)以及標記
4)卷積
開始是用卷積神經(jīng)網(wǎng)絡(luò)進行卷積操作,調(diào)用卷積神經(jīng)網(wǎng)絡(luò)算法模塊,執(zhí)行卷積神經(jīng)操作。
本實驗采用的是基于卷積神經(jīng)網(wǎng)絡(luò)的英文郵件分類,通過訓(xùn)練出模型然后用測試集得到準確率,該實驗100次實驗保存一次數(shù)據(jù),總是保存最新的5次數(shù)據(jù)。
1)實驗一和實驗二
在第一次做此次實驗時,采用的數(shù)據(jù)集是一些非正規(guī)的郵件數(shù)據(jù)集,經(jīng)過Tensorflow框架編寫出卷積神經(jīng)網(wǎng)絡(luò)的簡單過程,得到的準確率僅僅只有50%左右.
在第二次試驗中,通過更換數(shù)據(jù)集,采用的Enron公司提供的開放的數(shù)據(jù)集,使得準確率有了一定的提高,達到了65%左右,也存在一些準確率高達81%.
經(jīng)過的數(shù)據(jù)集的變化選取,在模型的準確率方面有了一定的提高,從之前的50%上升到了65%左右,在準確率上有了一定的提高,對比結(jié)果如表1所示。
表1 不同數(shù)據(jù)集訓(xùn)練結(jié)果對比
2)實驗三
在實驗中數(shù)據(jù)集仍采用Ernor數(shù)據(jù)集,實驗三共做了四次小實驗,分別為:
①在實驗三中,通過修改embedding.dim(隱層維度)的值,將其從64調(diào)節(jié)到128,發(fā)現(xiàn)準確率下降很快,結(jié)果如表2所示:
表2 實驗三訓(xùn)練結(jié)果
續(xù)表2
分析:當(dāng)實驗中隱層維度上升時,準確率下降的很快
結(jié)論:隱層維度為64的時候最佳
②將filter.size修改,將其值由原來的1,2,3換為2,3,4,結(jié)果如表3所示:
表3 實驗四訓(xùn)練結(jié)果
續(xù)表3
分析:當(dāng)卷積的數(shù)目從1,2,3變?yōu)?,3,4時,準確率有了明顯的下降,平均準確率在40%左右,最低為28%.
結(jié)論:在卷積個數(shù)上面,1,2,3,使得準確更高一些。
③將懲罰項為0,將其值由原來的0轉(zhuǎn)換為0.1,結(jié)果如表4所示:
表4 實驗五訓(xùn)練結(jié)果
續(xù)表4
分析:對懲罰項小幅度的調(diào)整,本文發(fā)現(xiàn)準確率提高很大,所以接下來試一下為0.2時,結(jié)果如表5所示:
表5 實驗六訓(xùn)練結(jié)果
續(xù)表5
④學(xué)習(xí)率從0.5調(diào)整0.1,結(jié)果如表6所示:
分析:相比于學(xué)習(xí)率為0.1,學(xué)習(xí)率為0.2并沒有太大的提高,而且存在小幅度的減小。
結(jié)論:學(xué)習(xí)率為0.1較為合適。
續(xù)表6
從表2到表6完成了對同一數(shù)據(jù)集的不同參數(shù)進行修改后的測試,得到表7:
表7 實驗三至實驗七結(jié)果對比
本文基于Python語言,采用Google的Tensorflow框架,實驗部分本文采用的數(shù)據(jù)集是Enron郵件數(shù)據(jù)集,在Enron數(shù)據(jù)集的基礎(chǔ)上對準備的數(shù)據(jù)進行一些關(guān)于數(shù)據(jù)集預(yù)處理的操作;根據(jù)卷積神經(jīng)網(wǎng)絡(luò)的一些結(jié)構(gòu)以及層次。利用前向傳播以及最初做好的郵件類型標記進行分類,然后利用反向傳播調(diào)節(jié)參數(shù),使得參數(shù)達到一個最好值;在該項研究中,本文采用的是交叉驗證,即將整個數(shù)據(jù)及分為測試集以及訓(xùn)練集,通過訓(xùn)練集訓(xùn)練處模型,再通過測試集測試結(jié)果(該測試集也存在測試標記),得到該模型的較高正確率,從而方便其用于英文郵件的分類。