Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
Python實現基于樸素貝葉斯的垃圾郵件分類
標簽:?python樸素貝葉斯垃圾郵件分類 2016-04-20 15:09?2750人閱讀?評論(1)?收藏?舉報 ?分類: 機器學習(19)?聽說樸素貝葉斯在垃圾郵件分類的應用中效果很好,尋思樸素貝葉斯容易實現,就用Python寫了一個樸素貝葉斯模型下的垃圾郵件分類。在400封郵件(正常郵件與垃圾郵件各一半)的測試集中測試結果為分類準確率95.15%,在僅僅統計詞頻計算概率的情況下,分類結果還是相當不錯的。
實現代碼及數據集下載
1、準備工作?
python3.4開發環境;?
結巴分詞工具:https://github.com/fxsjy/jieba
2、貝葉斯公式?
我們要做的是計算在已知詞向量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(1?P(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),則判為垃圾郵件,否則判為正常郵件。
總結
以上是生活随笔為你收集整理的Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习看手相】台湾学生获奖 AI 项
- 下一篇: 奥巴马女儿要上哈佛了!从小给女儿定下了五