学习贝叶斯算法,防止邮件成为垃圾
之前教大家如何一步一步获取别人的QQ号码或者邮箱地址,那下一步就是营销。
但你总是写的邮件被判断为垃圾邮件。广告邮件是有提醒的,而垃圾邮件没有提醒但有提示。提示垃圾邮件+1而已。
很多人觉得学高数没用,难道买菜也要高数几何算一算。没用不等于没用过。今天我们就用贝叶斯算法写出防止发送的邮件不被判断为垃圾的邮件。
首先,先了解什么是贝叶斯算法,是一种概率统计的算法,好吧自己回去看书,这里不细说。
我们就说说它对于邮箱判断为垃圾的原理吧
主要有以下7个步骤:
1. 收集大量的垃圾邮件和非垃圾邮件,建立垃圾邮件集和非垃圾邮件集。
2. 提取邮件主题和邮件体中的独立字符串,例如 ABC32,¥234等作为TOKEN串并统计提取出的TOKEN串出现的次数即字频。按照上述的方法分别处理垃圾邮件集和非垃圾邮件集中的所有邮件。
3. 每一个邮件集对应一个哈希表,hashtable_good对应非垃圾邮件集而hashtable_bad对应垃圾邮件集。表中存储TOKEN串到字频的映射关系。
4. 计算每个哈希表中TOKEN串出现的概率P=(某TOKEN串的字频)/(对应哈希表的长度)。
5. 综合考虑hashtable_good和hashtable_bad,推断出当新来的邮件中出现某个TOKEN串时,该新邮件为垃圾邮件的概率。数学表达式为:
A 事件 —- 邮件为垃圾邮件;
t1,t2 …….tn 代表 TOKEN 串
则 P ( A|ti )表示在邮件中出现 TOKEN 串 ti 时,该邮件为垃圾邮件的概率。
设
P1 ( ti ) = ( ti 在 hashtable_good 中的值)
P2 ( ti ) = ( ti 在 hashtable_ bad 中的值)
则 P ( A|ti ) =P2 ( ti ) /[ ( P1 ( ti ) +P2 ( ti ) ] ;
6. 建立新的哈希表hashtable_probability存储TOKEN串ti到P(A|ti)的映射。
7. 至此,垃圾邮件集和非垃圾邮件集的学习过程结束。根据建立的哈希表 hashtable_probability可以估计一封新到的邮件为垃圾邮件的可能性。
当新到一封邮件时,按照步骤2,生成TOKEN串。查询hashtable_probability得到该TOKEN 串的键值。
假设由该邮件共得到N个TOKEN 串,t1,t2…….tn,hashtable_probability中对应的值为 P1 , P2 , ……PN, P(A|t1 ,t2, t3……tn) 表示在邮件中同时出现多个TOKEN串t1,t2……tn时,该邮件为垃圾邮件的概率。
由复合概率公式可得P(A|t1 ,t2, t3……tn)=(P1*P2*……PN)/[P1*P2*……PN+(1-P1)(1-P2)……(1-PN)],当 P(A|t1 ,t2, t3……tn) 超过预定阈值时,就可以判断邮件为垃圾邮件。
说了原理也不懂,那就说人话吧。。。
就是你写的邮件会被系统分析,提出十个左右的关键内容,这些内容有的是加分项,有的是减分项。减得越多,判为垃圾邮件可能性越大。
那问题来了,怎么做才可以写到加分的内容?
你发邮件,大公司都有很多规定格式的,所以首先要工整,排版居中对齐等。
有加分就有减分,首先不发怪字符,虽然收件人可能读懂,但系统未必能读懂,直接判为垃圾邮件。
网址,图片,手机,qq,邮箱等信息,尽量不要。
那有人就会问,连个图片,网址都没有,怎么宣传?所以这是个概率统计问题,不是你用了一个图片,系统就判断你为垃圾邮件的。
当然,还是用数据说话比较实际。。。
//// 概率判断
double buy_yes=number_yes*1.0/data_length; // 被判断为垃圾邮件的概率
double buy_no=bumber_no*1.0/data_length; // 不被判断为垃圾邮件的概率
System.out.println("训练数据中被判断为垃圾邮件的概率:"+buy_yes);
System.out.println("训练数据中不被判断为垃圾邮件的概率:"+buy_no);
/// 未知用户的判断
double nb_buy_yes=(1.0*num_url_yes/number_yes)*(1.0*num_img_yes/number_yes)*(1.0*num_phone_yes/number_yes)*(1.0*num_qq_yes/number_yes)*(1.0*num_email_yes/number_yes)*buy_yes;
double nb_buy_no=(1.0*num_url_no/bumber_no)*(1.0*num_img_no/bumber_no)*(1.0*num_phone_no/bumber_no)*(1.0*num_qq_no/bumber_no)*(1.0*num_email_no/bumber_no)*buy_no;
System.out.println("新邮件被判断为垃圾邮件的概率:"+nb_buy_yes);
System.out.println("新邮件不被判断为垃圾邮件的概率:"+nb_buy_no);
if(nb_buy_yes>nb_buy_no){
System.out.println("新邮件被判断为垃圾邮件的概率大");
}else {
System.out.println("新邮件不被判断为垃圾邮件的概率大");
}
注意:需要本文源代码可关注微信号艳辉网 回复关键字‘java143’获取。