王 芳
(太原科技大學 計算機科學與技術學院,太原 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數據集的基礎上對準備的數據進行一些關于數據集預處理的操作;根據卷積神經網絡的一些結構以及層次。利用前向傳播以及最初做好的郵件類型標記進行分類,然后利用反向傳播調節參數,使得參數達到一個最好值;在該項研究中,本文采用的是交叉驗證,即將整個數據及分為測試集以及訓練集,通過訓練集訓練處模型,再通過測試集測試結果(該測試集也存在測試標記),得到該模型的較高正確率,從而方便其用于英文郵件的分類。