垃圾邮件是如何用贝叶斯方法过滤掉的

垃圾邮件曾经是一个令人非常头痛的问题,长期困扰着邮件运营商和用户。据统计,在2005年,用户收到的电子邮件中80%以上是垃圾邮件。

但你有没有感觉到,这些年来,你收到的垃圾邮件越来越少了,甚至已经几乎感受不到它们的存在。背后一定有什么原因,那就是运营商采用了垃圾邮件过滤方法。

一封邮件,判断它是正常邮件还是垃圾邮件,很明显是一个“分类”问题。一谈到“分类”,大家不约而同想到的方法是找“特征”。就像同是猫科动物,老虎和猫怎样分类?肯定是找大小、体重、颜色、花纹等特征进行区分嘛。、
这里写图片描述

那同是邮件,正常邮件和垃圾邮件有什么特征区分?很显然—“关键词(字)”。垃圾邮件的关键词:“发票”,“贷款”,“利率”,“中奖”,“办证”,“抽奖”,“号码”,“钱”,“款”,“幸运”……等等。

所以大家首先能想到的方法是“关键词过滤”,如果邮件存在上述垃圾邮件关键词,就判定为垃圾邮件。但这种方法效果很不理想,而且容易规避。一是正常邮件中也可能有这些关键词,非常容易误判。二是将关键词进行变形,如“代!开-发/票”,就很容易规避关键词过滤,如果将关键词的各种变形都找出来过滤,那是无穷无尽的,而且更容易误判正常邮件。

直到2002年,Paul Graham提出使用“贝叶斯方法”过滤垃圾邮件,经过几年的工程化应用,才算解决了这个问题。而这种方法的效果,好的不可思议。此外,这种过滤方法还具有自我学习能力,会根据新收到的邮件,不断调整。收到的垃圾邮件越多,它的准确率就越高。贝叶斯方法就不详细介绍了,可以看我前期的文章《用于精准判断的贝叶斯定理》。

(一)基本方法
现在我们收到一封新邮件,我们假定它是正常邮件和垃圾邮件的概率各是50%。即:

P(正常)= P(垃圾)=50%

然后,对这封新邮件的内容进行解析,发现其中含有“发票”这个词,那么这封邮件属于垃圾邮件的概率提高到多少?其实就是计算一个条件概率,在有“发票”词语的条件下,邮件是垃圾邮件的概率:P(垃圾|发票)。直接计算肯定是无法计算了,这时要用到贝叶斯定理:

P(|)=P(|)P()P()

根据全概率公式:
P()=P(|)P()+P(|)P()

所以:

P(|)=P(|)P()P(|)P()+P(|)P()

其中,P(发票|垃圾)表示所有垃圾邮件中出现“发票”的概率,我们假设100封垃圾邮件中有5封包含“发票”这个词,那么这个概率是5%。P(发票|正常)表示所有正常邮件中出现“发票”的概率,我们假设1000封正常邮件中有1封包含“发票”这个词,那么这个概率是0.1%。于是:

P(垃圾|发票)=(5%×50%) / (5%×50% + 0.1%×50%)

因此,这封新邮件是垃圾邮件的概率是98%。从贝叶斯思维的角度,这个“发票”推断能力很强,直接将垃圾邮件50%的概率提升到98%了。那么,我们是否就此能给出结论:这是封垃圾邮件?

回答是不能!这里有2个核心问题没有解决:
一是 P(发票|垃圾)和P(发票|正常)是我们假定的,怎样实际计算它们?
二是 正常邮件也是可能含有“发票”这个词的,误判了怎么办?

(二)概率值计算问题
对于第一个问题,该“统计学”出场了。过程很简单,我们首先收集10000封邮件,用人工方式进行简单判断标定,哪个是正常邮件,哪个是垃圾邮件,假设各有5000封,即P(正常)= P(垃圾)=50%。然后编写程序解析所有邮件的内容文本,提取每一个词,计算每个词语在正常邮件和垃圾邮件中的出现频率。例如“发票”在5000封正常邮件中,出现了5次,那么P(发票|正常)=0.1%,“发票”在5000封垃圾邮件中个,出现了250次,那么P(发票|正常)=1%。以后,就全自动运行,随着邮件数量的增加,这些计算结果会自动调整,越来越精确。(注意:如果一个词只出现在垃圾邮件中,正常邮件中没有,那么在正常邮件中的出现频率也需要设定一个很小的值(例如0.1%),反之亦然,这样做是为了避免概率为0)。

(三)误判问题
对于第二个问题,解决的思路是“多特征判断”。就像猫和老虎,如何单看颜色、花纹都不好判断,那就颜色、花纹、大小、体重等一起来判断。同理,对于“发票”不好来判断,那就联合其他词语一起来判断,如果这封邮件中除了“发票”,还有“常年”,“代开”,“各种”,“行业”,“绝对正规”,“税点低”等词语,那么就通过这些词语联合认定这封邮件是垃圾邮件。

计算方法也不复杂,在基本方法计算的基础上,选取前n个(例如n=3,实际应用中是15个词/字以上)概率最高的词,假设为:“发票”,“常年”,“代开”。然后计算其联合条件概率。即在这3个词同时出现的条件下,是垃圾邮件的概率,即:P(垃圾|发票;常年;代开)。这时仍要用到贝叶斯定理:

P(|)=P(|)P()P()

这里还需要一个假设:所有词语彼此之间是不相关的(当然实际上不可能完全没有相关性,但可以忽略)。所以:

P(|)=P(|)P(|)P(|)P()P()

上边式子中右边的分母不太好求。我们可以换种方式,求这封邮件是正常邮件的概率:

P(|)=P(|)P(|)P(|)P()P()

上面两个式子相除,得到:
P(|)P(|)P(|)P()P(|)P(|)P(|)P()

即在这3个词同时出现的情况下,是垃圾邮件的概率与是正常邮件的概率的比值。上边式子中的每一项,都可以用前面介绍的统计学方法得到。假设P(常年|垃圾)=P(常年|正常)=5%,P(代开|垃圾)=5%,P(代开|正常)=0.1%。那么:

(5% × 5% × 5% × 50%) / (0.1% × 5% × 0.1% × 50%)=2500

即多个词(或字)联合认定,这封邮件是垃圾邮件概率是正常邮件概率的2500倍,可以确定是垃圾邮件了。

  • 13
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值