
基于貝葉斯算法的JavaMail垃圾郵件過濾實現
劉嵐賈躍偉
,
武漢理工大學信息工程學院,武漢(430070)
E-mail: simon_jia_2005@
摘 要:JavaMail 在中小型企業的郵件系統中有著廣泛的應用,謹以貝葉斯算法為基礎,
提出并實現一套簡單,高效的自適應垃圾郵件的過濾方案。它采用基于詞熵的特征提取方法,
在過濾的過程中不斷的進行自學習,具有較強的自適應能力,最終通過閾值來判別郵件是否
為垃圾郵件。
關鍵詞:JavaMail;貝葉斯算法;垃圾郵件;自學習
1. 引言
JavaMail是Sun發布的處理電子郵件的應用程序接口,預置了常用的郵件傳送協議(如
SMTP、POP、IMAP、NNTP)的實現方法,與JSP和QMAIL 結合開發出穩定可靠的企業級
web mail系統,可以滿足中小型企業的日常辦公需求。
但目前這種辦公郵箱最大的困擾是來自internet的大量以廣告為目的垃圾郵件,尤其是在
網站上對外公布的郵箱,其垃圾郵件的比例甚至達到了90%以上,日平均有20封以上的垃圾
郵件,對郵箱使用造成了很大的不便,這是郵箱系統的開發和維護首要解決的問題。
2. 反垃圾郵件過濾技術
2.1 基于黑白名單的過濾技術
此技術使用最早也最為常用,即是對于地址在白名單的服務器的郵件全部接收,對地址
在黑名單的服務器的郵件全部拒收,國際和國內的一些反垃圾郵件組織會實時更新和提供一
種實時的黑名單(Real Time Black List)的郵件服務器IP數據庫,簡稱RBL,任何郵件服務
器都可以訂閱RBL以達到過濾垃圾郵件的目的。
[1]
但這種方法缺點很也很明顯:處理陌生郵件無能為力;需要不斷更新和維護;效率不高
容易誤判。
2.2 基于加密信息的過濾技術
加密信息過濾技術主要是采用類似于公鑰密碼的一類方法,主要目的是對郵件發送者進
行驗證,防止目前泛濫的偽造域名和木馬發送,域名密鑰體制利用公鑰技術和DNS構建一個
域名層次的電子郵件來源和內容認證框架,簡單的講,即為發送郵件時候同時產生密鑰和公
鑰,密鑰跟隨郵件,收件服務器從密鑰中獲取簽名和域名,然后通過網絡公鑰驗證通過后完
成郵件的發送。
此種方法的缺點也顯而易見,即使得郵件的網絡傳遞負擔加重,同時缺乏大規模的認證
標準,使得目前階段難以大范圍的推廣。
2.3 基于規則和統計的過濾技術
規則是指預設垃圾郵件關鍵詞進行的郵件過濾,而其最大的缺點是實效性較差,不易維
護,垃圾郵件往往通過關鍵詞中增加特殊符號來躲避規則,同時也會使過濾缺乏彈性。
而貝葉斯過濾算法是一種典型的基于統計的垃圾郵件過濾技術,這種理論的基礎是通過
對大量垃圾郵件的常見關鍵詞進行分析后得出其分布的統計模型,并由此推算目標是垃圾郵
- 1 -
件的概率,再根據所設閾值來判斷是否接受郵件,它最大的特點是自學習功能,不斷的自我
更新過濾規則,保證了不需維護即可獲得長期穩定的過濾效率。
但貝葉斯算法其缺點也同樣明顯,它同時需要一定量的垃圾郵件數據庫完成初始自學習
過程,同時需要用來匹配的大量的漢字和英文單詞樣本庫,而且對于基于JavaMail中小型規
模的企業郵件服務器,其初始大量的自學習過程所耗費的系統資源是辦公環境無法忍受的,
基于此,本文將結合規則過濾的優點,將兩個種方法進行互補的整合,在初始預設一定規則
的情況下,由貝葉斯算法所實現的模塊完成對垃圾郵件的判斷并且不斷的通過自學習功能對
規則進行完善和修改,以達到自我維護的目的。
3. 貝葉斯過濾算法推理
根據貝葉斯公式:
[5]
P(B|A)
i
=
P(A|B)P(B)
i
∑
P(A|B)P(B)
jj
j
=
1
n
把兩種郵件看作是兩個隨機事件A、B,其中A為垃圾郵件,B為正常郵件,是全部自學
習E的樣本空間S的全部隨機事件。T為郵件單詞的集合,其中
T
i
為T的元素。根據貝葉斯公
示有:
P(A|T)
i
=
P(T|A)*P(A)
i
P(T|A)*P(A)P(T|B)*P(B)
ii
+
而樣本空間中垃圾郵件的數量與正常郵件相當,故,又令
P(A)=P(B)=0.5
f(T)P(T|A)f(T)P(T|B)
AiiBii
==
、,由此推導出由一個單詞的出現的情況下,判斷郵件
是否為垃圾郵件的概率:
P(A|T)
i
=
f(T)
Ai
(公式3.1)
fTfT
AiBi
()()
+
當拒收關鍵詞列表學習完畢,在多關鍵詞過濾的情況下,由合并概率公式(Combining
Probabilities)可得:
P(A|T)*P(A|T)*.....P(A|T)
12n
[P(A|T)*P(A|T)*.....P(A|T)][(1P(A|T))*(1P(A|T))*......(1P(A|T))]
12nnn11
+???
?
(公式3.2)
P(A|T,...,T)
1n
=
由此,我們很容易算出所收到郵件時垃圾郵件的概率,再根據所設閾值判定是否為垃圾
郵件。
4. 本算法實現的JavaMail環境
本次是實現的貝葉斯算法的JavaMail系統邏輯架構如下圖所示:
- 2 -
圖1 JavaMail服務器系統架構圖
但由于是中小企業級郵件系統,數據庫服務器沒有專門配置,而是將郵件,和配置文件
數據一起存放在應用服務器上,郵件文件存放在根目錄下的domain文件夾中。
5. 貝葉斯過濾算法的java實現
貝葉斯過濾算法在企業應用的郵件系統的具體實現中,會遇到以下幾個關鍵問題:
關鍵字表單等數據的存儲問題;郵件箱中大量郵件的讀取;收郵件的同時郵件內容解碼分析
的問題;對郵件內容進行關鍵詞的遍歷比較并進行自學習。下面便分別實現上述功能:
5.1 關鍵字表單數據的存儲問題
由于本系統是中小型企業的郵件服務器,所以并未使用大型的數據庫如:oracle等,而
是采用xml文件的形式進行數據的存儲,它的優點是系統架構簡單,便于修改和維護。
[3]
import nt;
import t;
import t;
//完成對xml文件的操作需要4j 的開發包
this.m_FileName = pPath + "/" + Domain + "/" + Name + "/" ;
doc = ext("
OutputFormat format = PrettyPrint(); //格式化輸出
oding("GBK"); //指定XML編碼
writer = new XMLWriter(new FileWriter(new File(pFileName)), format);
El = ment("Filter"); //增加“Filter”的節點
t("");
// 完成對xml文件的創建
El = (Element)SingleNode("root/Filter");
= t();
//完成對xml文件的讀取
- 3 -
5.2 郵箱中大量郵件的讀取
由本文第四部分可知,本系統的郵件文件的存儲是放在根目錄下的文件夾中。
import putStream;
File f = new File(BoxDir); File[] files = les();
// BoxDir 為郵件所存放文件夾的路徑,如:“/maildir/inbox”
for (int i = -1; i >= 0; i--) {
FileInputStream in = new FileInputStream(files[i]);
}
//這樣變利用的fileinputStream將所有郵件從文件夾中循環的讀入內存
5.3 收郵件并對郵件內容進行解碼分析
由于郵件發送是根據SMTP(Simple Mail Transfer Protocol)協議,而smtp服務器只能接
受7bit字節流,所以要根據MIME()協議將郵件內容進行編
Multipurpo Internet Mail Extensions
碼,所以再解碼端也要對應的將信件內容的格式作出判斷,如圖1:
圖 2 MIME解碼過程示意圖
import .* ;
Store store = re("pop3");
t(pop3Server, urName, password); //利用pop3協議和賬戶,密碼連接服務器
Folder folder = der("INBOX");
(_WRITE); //打開收件箱文件夾
Message message[] = sages();
//通過以上幾個步驟,已經把郵件從服務器中收到系統中。
for (int i = 0; i < ; i++)
{ String ContentString = new String();
Object object = message[i].getContent(); //獲得郵件內容
if ( message[i].isMimeType("text/plain")|| message[i].isMimeType("text/html"))
{ ContentString=" "+(String)object+" ";} //判斷是否為“text/html”
if ( message[i].isMimeType("multipart/*"))
- 4 -
{ Multipart mp = (Multipart)object; //判斷是否為 “Multipart”
for (int j = 0; j < nt(); j++) {
ContentString =ContentString+"t"+ tent (); //將所有郵件內容放入一個字符串
}
//郵件內容分析完畢
5.4 根據規則對郵件樣本進行遍歷自學習
由第2節可知,鑒于實用資源和效率的考慮,本模塊將預設一定的規則。
String[] banword = XML Word(); //由5.2模塊獲得xml配置文件的預設規則
for(int k=0;k<;k++){
boolen contain =FilterKeyWord(ContentString, banword [k]);
//關鍵詞對比過濾器,返回ture
if(contain == true) { Spam=Spam+1; SpamAll=SpamAll+1;}
=
el {Legit=Legit+1; LegitAll=LegitAll+1;}
//根據過濾結果,自學習更改判斷數據,即將本次查詢記錄在案,作為下次概率判斷的依據
==
}
private boolean FilterKeyWord(String strContent,String strKeyWord) {
boolean retVal = fal;
for(int i0;i<(()-());i++) {
int end = i+();
if(ing(i,end).equalsIgnoreCa(strKeyWord))
{ retValtrue;
break;}
}
return retVal;
}
//將banword 的關鍵字詞與郵件類容逐字比較
[2]
,若郵件內容中包含,則返回ture
5.5 根據歷史數據的概率和貝葉斯公式對收到的郵件進行評估
String[] banword = XML Word(); //由5.2模塊獲得xml配置文件的預設規則
double[] Pbanword = null;
double[] Pmail = null;
for(int k=0;k<;k++){
double Spam = XML m(banword[k]);
double SpamAll = XML mAll(banword[k]);
double Legit = XML it (banword[k]);
double LegitAll = XML LegitAll (banword[k]);
//由5.2模塊獲得xml配置文件的對應Banword的歷史數據
for(int k=0;k<;k++){
Pbanword[k] = (Spam*LegitAll)/( Spam*LegitAll+ Legit*SpamAll)
//根據(公式3.1)
}
//所有已有的banword的
P(A|T),P(A|T),.....P(A|T)
12
n
,都已經算出放入Pbanword[]
- 5 -
double Pup = Pbanword[0]; double Pdown = (1-Pbanword[0]);
for(int j=1;j<;j++){
Pup= Pup* Pbanword[j];
Pdown= Pdown* (1-Pbanword[j]);
}
Pmail = Pup/(Pup+Pdown);
//根據(公式3.2)
if(Pmail < 0.8) //將閾值設為0.8
{ OutputStream out = new FileOutputStream(“/newbox”);}
el{OutputStream out = new FileOutputStream("/delbox");
String newBanword = ing(indexof(“票”)-2,indexof(“票”))}
Boolen add = ture;
for(m=0,m if((banword[m])) add = fal} if(add) a(newBanword); //其中tdata函數為5.2的寫xml文件模塊 message[i].writeTo(out); ();} //當收到的這封mail的概率Pmail>0.8時候,便被存放到垃圾郵件箱delbox 同時把郵件中含有的歷史記錄里所沒有的易干擾字的樣本存入記錄中 5.6 總結 貝葉斯過濾算法的java實現的流程圖如下: [4] - 6 - 圖3 java實現的N-S流程圖 6. 測試 6.1 程序代碼測試 設置初始規則和自學習 由長期郵件服務器收集的垃圾郵件樣本可知,數量最大的垃圾郵件內容集中在:發票, 廣告,免費,報告,業績,稅票,推廣;因此我們初始banword列表中列入以上幾個初始banword, 同時Spam,SpamAll和Legit,LegitAll也作出相應設置,然后用帶干擾的郵件進行自學習, 如“發*票”,“發#票”,“稅 票”等進行干擾自學習,其結果如圖: - 7 - 圖4 關鍵字自學習后的結果 接收郵件并判斷 Java程序在eclip下運行,其概率計算與理論推導結果相符,垃圾郵件判斷也得出相應 概率,轉成String打印出來如下圖: 圖5 判斷垃圾郵件結果 6.2 JavaMail系統使用測試 由4節提到的JavaMail服務器,在6個人的辦公環境中測試,在近五周的時間里,使用貝 葉斯算法的webmail通過自學習,逐漸將垃圾郵件的數量降低,而使用一般規則過濾的 webmail并沒有下降,甚至有輕微上升的趨勢,具體情況如下圖: - 8 - 圖6 JavaMail系統測試結果 6.3 測試結果分析 以上測試表明,貝葉斯公式的JavaMail實現程序可以成功的實現對關鍵詞的過濾,同時 具有自學習功能,能夠進行干擾詞的自動添加,達到了算法的理論值。 同時,在服務器將近五周的測試中,加入貝葉斯過濾模塊的JavaMail系統運行正常,效 率并未明顯降低,同時,由垃圾郵件統計數量曲線圖可以明顯的看到,通過自學習系統,過 濾規則不斷的進行自我完善,使得,垃圾郵件接收數呈顯著的下降趨勢,實現了預期設想的 功能。 7. 結束語 由于企業郵件環境要求較高的安全性的同時還要兼顧辦公效率,本套基于貝葉斯算法的 JavaMail郵件系統達到了一定的辦公要求,同時也經過了一段時間的服務器測試,因此,具 有一定的實用價值。 但同時也應該看到,由于字詞識別技術和字詞樣本的缺乏,關鍵詞自學習還有相當的局 限性,而且,存儲采用xml文件,顯然不及oracle等大型服務器的處理性能,因此本系統還有 很大的升級空間。 參考文獻 [1] 陳勇著. 反垃圾郵件完全手冊. 清華大學出版社, 2006-12 [2] (美)Adam Drozdek著. 周翔 譯 數據結構與算法(java語言版). 機械工業出版社, 2006-6 [3] (美)Bruce Eckel 著,侯捷 譯. Java編程思想. 機械工業出版社. 2002-9 [4] 譚浩強. Java編程技術. 人民郵電出版社. 2003-4 [5] 朱慧明 韓玉啟. 貝葉斯多元統計推斷理論. 機械工業出版社. 2005-1 - 9 - Spam Filtering bad on Bayes algorithm in JavaMail Liu LanJia Yuewei , Wuhan university of technology,Wuhan(430070) Abstract JavaMail has widely been applied to Mail System for Small and medium-sized enterpri. A brief and efficient lf-adaptable spam filtering solution bad on Bayes algorithm is prented and realization, which adopts a way of attribute lection, bad on word entropy and has ability of continuous learning. Finally, a threshold is pret to distinguish whether a mail is spam or not. Keywords: JavaMail; Bayes algorithm; spam; continuous learning - 10 -

本文發布于:2023-11-18 15:42:55,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1700293375219030.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:基于貝葉斯算法的JavaMail垃圾郵件過濾實現.doc
本文 PDF 下載地址:基于貝葉斯算法的JavaMail垃圾郵件過濾實現.pdf
| 留言與評論(共有 0 條評論) |