简介: 本文作者,陈九思,东华大学功能材料专业一名在校生,感谢来稿。
0x01 项目背景介绍
垃圾邮件是一种令人头痛的顽症,困扰着所有的互联网用户。
正确识别垃圾邮件的技术难度非常大。传统的垃圾邮件过滤方法,主要有”关键词法”和”校验码法”等。前者的过滤依据是特定的词语;后者则是计算邮件文本的校验码,再与已知的垃圾邮件进行对比。它们的识别效果都不理想,而且很容易规避。
2002年,Paul Graham提出使用”贝叶斯推断”过滤垃圾邮件。他说,这样做的效果,好得不可思议。1000封垃圾邮件可以过滤掉995封,且没有一个误判。
另外,这种过滤器还具有自我学习的功能,会根据新收到的邮件,不断调整。收到的垃圾邮件越多,它的准确率就越高。
虽然这个方法很早就提出来了,但是其实用性依旧非常好,故我通过自己的理解使用语言实现了一个基础的基于贝叶斯推断的垃圾邮件过滤器
0x02 过滤器工作原理
在这个邮件过滤器中,我通过训练前期搜集的16000封邮件数据(包含8000正常邮件和8000垃圾邮件),得出预测模型,用以进行垃圾邮件的判定,具体做法为:
解析所有邮件,利用分词技术提取邮件中的每一个词
计算每个词语在正常邮件和垃圾邮件中的出现频率
当收到一封未知邮件时,我们假定它是垃圾邮件和正常邮件的概率各 为50%,p(s) = p(n) = 50%。
解析该邮件,提取每个词,计算该词的p(s|w),也就是受该词影响,该邮件是垃圾邮件的概率,计算公式如下:
然后提取该邮件中p(s|w)最高的15个词,计算联合概率,公式如下
我们设定垃圾邮件的阈值为 。那么接收一封邮件之后的如果该邮件的贝叶斯概率值大于, 则认定为垃圾邮件。否则认为是正常邮件。
如果新收到的邮件中有的词在史料库中还没出现过,就假定p(s|w) = 0.4
0x03 过滤器实现
首先是邮件分割模块,该模块主要通过分词技术将邮件分割成单个词语,并进一步用作模型训练集,计算每个词的贝叶斯频率。实现代码如下:
其次是垃圾邮件识别部分,将邮件数据进行分词,并计算器贝叶斯概率,从而判断是否为垃圾邮件,实现代码如下:
0x04 运行结果
运行环境:
ubuntu16.04
python2.7
首先使用python编写一个回射服务器作为模拟邮件客户端和服务器,模拟发送邮件数据,实验结果证明可以有效过滤垃圾邮件:
做有心的技术公众号,欢迎关注代码之间
领取专属 10元无门槛券
私享最新 技术干货