Lucene.Net Spam Filter

摘要:Lucene.Net 過濾垃圾郵件

在這裡我們將提到有關於使用 貝氏過濾法( Bayesian Filter ) 來分析垃圾郵件 , 

 

使用此方法過濾垃圾郵件的概念由 Paul Graham 提出 , 

 

是一種以統計的方式來偵測是否為垃圾郵件 , 

 

英文內容的分詞大部分是根據其空白來做為判斷  ,  

 

相較於中文 , 字跟字間並無空白 , 加上詞意通常由詞產生而非字 , 

 

因此要針對中文做切詞的動作 , 必須搭配中文分詞的解析器 , 

 

因此實作此一目標 , 我們需要有下列的步驟 :

 

 

Step 1 : 準備一堆垃圾郵件  與  正常的郵件

 

這個動作是為了產生大量的垃圾郵件詞庫和正常的郵件詞庫 , 如此一來 在一開始 我們才能有判斷的基礎 , 

 

藉由這個動作 , 我們可以知道每個單字在垃圾郵件詞庫和正常的郵件詞庫中的出現的概率是多少

 

例如 sex 這個字串 , 在 5000 封的垃圾郵件中 , 有 200 封包含這個詞 , 那麼它的出現頻率就是 4% , 

 

而 5000 封的正常郵件中只有 4 封包含這詞彙 , 其概率就是 0.08 % , 而 Paul Graham 假設若某個

 

詞彙只出現在垃圾郵件中 , 那麼它在正常郵件的概率仍然是 1 %

 

 

Step 2 : 中文分詞 

 

在前面的文章中我們有使用了 PanGu 來實作此一動作 , 若是英文分詞 , 

 

直接使用空白分割即可

 

 

Step 3 : 使用停用詞

 

有些字彙太過常見以至於使用貝斯時可能會降低其準確率 

 

 

Step 4 : 使用貝斯過濾法計算得分

 

在這裡我們得先了解概率的構成 : 

 

後驗概率 = 先驗概率 * 調整因子

 

先驗概率 : B 事件發生之前 , A 事件的概率

 

後驗概率 : B 事件發生之後 , A 事件的概率

 

調整因子 : 使預估的概率更接近真實的概率

 

 

 

在這裡我們假設垃圾郵件和正常郵件的先驗概率都是 50 % , 

 

則當新的郵件裡若有包含 sex 單字的話 , 則此郵件是垃圾郵件的概率為

 

              //              4% * 50 % 
              // ---------------------------------------    =  98 %
              //      4%  * 50 % + 0.08 %  *  50% 

 

 

雖然現在概率提升到了 98 % , 但是我們不能說它就一定是垃圾郵件 , 

 

因為一封郵件包含了許多的詞彙 , 不能以單一詞彙作為衡量的標準 , 

 

Paul Graham 的作法是選出這封信中概率最高的 15 個詞彙 , 計算它們的聯合概率 , 

 

如此一來計算聯合概率變成如下 ,  abc各代表每個字彙的概率  

 

             //              abc           
			 //	---------------------------
			 //	abc + (1 - a)(1 - b)(1 - c)

 

而 Paul Graham 認為當概率大於 0.9 , 這封郵件 90% 以上有可能是垃圾郵件

 

而在 Lucene.Net 中已有提供其中貝氏過濾所需要的分詞以及停用詞等 , 

 

我們只需將此評分機制加入 Lucene.Net 即可

 

 

 

在 Paul Graham 提出的基礎上建立的專案 : 

 

A Naive Bayesian Spam Filter for C - Code Project : 

事先建立了 Good 和 Spam 兩種語料庫 , 其作者的案例是用來對抗 Comment Spam , 

例如 Blog 常會出現的廣告貼文 , 作者事先載入語料庫後再經由貝氏過濾法計算出分數藉此判斷是否是廣告貼文

 

 

參考資料來源 : 

 

IThome 垃圾郵件終結者 - 貝氏過濾法

IThome 雞尾酒過濾法

Bayesian filtering wiki

Probability 

Combining Probabilities