Python實現基於樸素貝葉斯的垃圾郵件分類

聽說樸素貝葉斯在垃圾郵件分類的應用中效果很好,尋思樸素貝葉斯容易實現,就用python寫了一個樸素貝葉斯模型下的垃圾郵件分類。在400封郵件(正常郵件與垃圾郵件各一半)的測試集中測試結果爲分類準確率95.15%,在僅僅統計詞頻計算概率的情況下,分類結果還是相當不錯的。

實現代碼及數據集下載

1、準備工作
python3.4開發環境;
結巴分詞工具:https://github.com/fxsjy/jieba

2、貝葉斯公式
我們要做的是計算在已知詞向量w=(w1,w2,...,wn) 的條件下求包含該詞向量郵件是否爲垃圾郵件的概率,即求:

P(s|w),w=(w1,w2,...,wn)

其中,s 表示分類爲垃圾郵件
根據貝葉斯公式和全概率公式,
P(s|w1,w2,...,wn)
=P(s,w1,w2,...,wn)P(w1,w2,...,wn)
=P(w1,w2,...,wn|s)P(s)P(w1,w2,...,wn)
=P(w1,w2,...,wn|s)P(s)P(w1,w2,...,wn|s)p(s)+P(w1,w2,...,wn|s)p(s)...1
根據樸素貝葉斯的條件獨立假設,並設先驗概率P(s)=P(s)=0.5 ,上式可化爲:
=j=1nP(wj|s)j=1nP(wj|s)+j=1nP(wj|s)
再利用貝葉斯P(wj|s)=P(s|wj)P(wj)P(s) ,式子化爲
=j=1nP(s|wj)j=1nP(s|wj)+j=1nP(s|wj)
=j=1nP(s|wj)j=1nP(s|wj)+j=1n(1P(s|wj))...2
至此,我們接下來會用式2來計算概率P(s|w) ,爲什麼不用式1而用式2來計算概率,是因爲通過式2可以將關於s 的部分用s 表示,方便計算。

3、實現步驟
具體實現的源碼已經給出,這裏簡單說下思路,就是一個分詞並記錄詞頻的過程:
(1)對訓練集用結巴分詞,並用停用表進行簡單過濾,然後使用正則表達式過濾掉郵件中的非中文字符;
(2)分別保存正常郵件與垃圾郵件中出現的詞有多少郵件出現該詞,得到兩個詞典。例如詞”瘋狂”在8000封正常郵件中出現了20次,在8000封垃圾郵件中出現了200次;
(3)對測試集中的每一封郵件做同樣的處理,並計算得到P(s|w) 最高的15個詞,在計算過程中,若該詞只出現在垃圾郵件的詞典中,則令P(w|s)=0.01 ,反之亦然;若都未出現,則令P(s|w)=0.4 。PS.這裏做的幾個假設基於前人做的一些研究工作得出的。
(4)對得到的每封郵件中重要的15個詞利用式2計算概率,若概率> 閾值α(0.9) ,則判爲垃圾郵件,否則判爲正常郵件。

發佈了50 篇原創文章 · 獲贊 229 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章