1. 程式人生 > >基於卷積神經網路(CNN)的中文垃圾郵件檢測

基於卷積神經網路(CNN)的中文垃圾郵件檢測

前言

文字分類任務是一個經久不衰的課題,其應用包括垃圾郵件檢測、情感分析等。

傳統機器學習的做法是先進行特徵工程,構建出特徵向量後,再將特徵向量輸入各種分類模型(貝葉斯、SVM、神經網路等)進行分類。

隨著深度學習的發展以及RNN、CNN的陸續出現,特徵向量的構建將會由網路自動完成,因此我們只要將文字的向量表示輸入到網路中就能夠完成自動完成特徵的構建與分類過程。

就分類任務而言,CNN比RNN更為合適。CNN目前在影象處理方向應用最為廣泛,在文字處理上也有一些的應用。本文將參考Denny Britz的WILDML教程 IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW

來設計一個簡單的CNN,並將其應用於中文垃圾郵件檢測任務。

正文

1 預備知識

1.1神經網路基礎知識

如果你對深度學習或RNN、CNN等神經網路並不太熟悉,請先移步至這裡尋找相關文章進行精讀,這個博主寫的每一篇文章都很好,由淺至深,非常適合入門。

1.2如何將CNN運用到文字處理

1.3CNN網路結構和實現方法(必讀)

此博文中的CNN網路結構和實現方法絕大部分是參考了 IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW 這篇文章的,CNN的結構和實現細節在這篇文章均有詳述,在此我就不運相同的內容了,在請務必精讀

這篇文章。

2 訓練資料

2.1 中文垃圾郵件資料集

說明:對TREC06C進行了簡單的清洗得到,以utf-8格式儲存
下載地址:百度網盤

2.2垃圾郵件

spam_5000.utf8

有情之人,天天是節。一句寒暖,一線相喧;一句叮嚀,一箋相傳;一份相思, 一心相盼;一份愛意,一生相戀。 搜尋201:::http://201.855.com 在此祝大家七夕情人快樂! 搜尋201友情提示::: 2005年七夕情人節:811日――別忘了給她(他)送祝福哦!
我司是一家實業貿易定稅企業;有餘額票向外開 費用相對較低,此操作方式可以為貴公司(工廠) 節約部分稅金。 公司本著互利互惠的原則,真誠期待你的來電!
!! 聯絡: 王生 TEL: --13528886061 本公司有部分普通發票(商品銷售發票)增值稅發票及海關代徵增值稅專用繳款書及其它服務行業發票, 公路、內河運輸發票。可以以低稅率為貴公司代開,本公司具有內、外貿生意實力,保證我司開具的票據的真實性。 希望可以合作!共同發展!敬侯您的來電洽談、諮詢! 聯絡人:李先生 聯絡電話:13632588281 如有打擾望諒解,祝商琪。 來京記得找我啊 我社為您提供優惠的旅遊價格,如酒店、機票、火車票、北京地接 線上諮詢:QQ:305652179,歡迎您留言 MSNyezikao8855@hotmail.com 郵件回覆:yezikao8855@163.com 這是一封廣告信,由此給您帶來不變請諒解 2005-8-19 ......

共5000行,每一行對應一封郵件

2.3正常郵件

ham_5000.utf8

講的是孔子後人的故事。一個老領導回到家鄉,跟兒子感情不和,跟貪財的孫子孔為本和睦。 老領導的弟弟魏宗萬是趕馬車的。 有個洋妞大概是考察民俗的,在他們家過年。 孔為本總想出國,被爺爺教育了。 最後,一家人基本和解。 順便問另一類電影,北京青年電影製片廠的。中越戰背景。一軍人被介紹了一個物件,去相親。女方是軍隊醫院的護士,猶豫不決,總是在回憶戰場上負傷的男友,好像還沒死。最後 男方表示理解,歸隊了。
不至於吧,離開這個破公司就沒有課題可以做了? 謝謝大家的關心,她昨天晚上睡的很好。MM她自己已經想好了。見機行事吧,拿到相關的能出來做論文的材料,就馬上辭職。 唉!看看吧,說不定還要各為XDJM幫出出找工作的主意呢。MM學通訊的,哈爾濱工程大學的研究生,不想在哈碌碌無為的做設計,因此才出來的。先謝謝了啊。!!! 本人語文不好,沒加標點。辛苦那些看不懂的XDJM麼了。
生一個玩玩,不好玩了就送人 第一,你要知道,你們戀愛前,你爹媽對她是毫無意義的。沒道理你爹媽就要求她生孩子,她就得聽話。換句話說,你岳父母要未來孩子跟媽姓,你做的到嗎?夫妻是平等的。如果你沒辦法答應岳父母,她幹嗎答應你爹媽呢? 第二,有了孩子你養不養的起?不是說想生就生,圖你爹媽一個高興,如果沒有房子,沒有充足的財力,生孩子只會帶給你們更多的困難,生小孩容易,養小孩難啊。
微軟中國研發啥?本地化? 新浪科技訊 824日晚10點,微軟中國對外宣佈說,在2006財年(20057-20066月),公司將在中國招聘約800名新員工。 其中,一半以上的新聘人員將為研發人員,其他將是銷售、市場和服務人員。同時,有近300個職位將面向新畢業的大學本科生、碩士研究生、MBA和博士生。 在2005財年,微軟在中國的業務取得了驕人成績,成為微軟全球增長速度最快的子公司之一。
......

共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 這篇文章的,CNN的結構和實現細節在這篇文章均有詳述。重複的地方不再說明,主要說說不同的地方。
那篇文章中實現的CNN是用於英文文字二分類的,並且在卷積之前,有一層embedding層,用於得到文字的向量表示。
而本博文中實現的CNN在上面的基礎上略有修改,用於支援中文文字的分類。CNN的結構的唯一變化是去掉了其中的embedding層,改為直接將word2vec預訓練出的embedding向量輸入到網路中進行分類。

網路結構圖如下圖所示:
CNN網路結構圖

4.2 訓練步驟

在預處理階段得到了x和y, 接下來將x 和 y 按照一定比例分成訓練集train_x, train_y和測試集dev_x, dev_y。
接著按照batch_size分批將train_x輸入至網路TextCNN中進行訓練,經過三個卷積層的卷積和max-pool之後,合併得到一個向量,這個向量代表了各個卷積層學到的關於訓練資料的某些特徵,最後將這個向量輸入到一個單層的神經網路並用softmax分類,得到最終的分類結果,計算損失(交叉熵)並開始後向傳播,執行批量梯度下降來更新網路引數。

5 結果

準確率:
準確率

誤差:
誤差

因為資料集並沒有標準的訓練集和測試集,本文只是按照0.1的比例進行了簡單的分割,且並沒有對一些重複的文件進行篩選,所以準確率能夠達到99%左右。如果用比較標準的資料集,並加入交叉驗證等方法,相信準確率會降低一些,但相信準確率仍能夠超過絕大部分用傳統機器學習的方法寫出的分類器。

後記

這兩天又在這個網路的基礎上,嘗試完成一個文字生成的任務(之前大多數人都是用RNN來做的),發現效果並不太好,生成的句子並不通順。CNN對於分類任務較為擅長,但是卷積和pool丟失了一些上下文資訊,因此在對上下文把握方面,RNN還是更甚一籌。當然,有研究表明CNN能夠通過調整卷積層的各種引數來獲取上下文的特徵,但限於我現有的知識水平,並不清楚該怎麼調參。只有等將來對CNN和RNN理解更進一步時再繼續完善這個任務吧。