基于贝叶斯算法的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,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1700293375219030.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:基于贝叶斯算法的JavaMail垃圾邮件过滤实现.doc
本文 PDF 下载地址:基于贝叶斯算法的JavaMail垃圾邮件过滤实现.pdf
留言与评论(共有 0 条评论) |