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

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

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

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

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

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

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

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

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

P(垃圾|发票)=P(发票|垃圾)⋅P(垃圾)P(发票)

P(垃圾|发票)=\frac{P(发票|垃圾)\cdot P(垃圾)}{P(发票)}
根据全概率公式:

P(发票)=P(发票|垃圾)⋅P(垃圾)+P(发票|正常)⋅P(正常)

P(发票)=P(发票|垃圾) \cdot P(垃圾)+P(发票|正常) \cdot P(正常)
所以:

P(垃圾|发票)=P(发票|垃圾)⋅P(垃圾)P(发票|垃圾)⋅P(垃圾)+P(发票|正常)⋅P(正常)

P(垃圾|发票)=\frac{P(发票|垃圾)\cdot P(垃圾)}{P(发票|垃圾) \cdot P(垃圾)+P(发票|正常) \cdot 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(垃圾|发票;常年;代开)=\frac{P(发票;常年;代开|垃圾)\cdot P(垃圾)}{P(发票;常年;代开)}

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

P(垃圾|发票;常年;代开)=P(发票|垃圾)⋅P(常年|垃圾)⋅P(代开|垃圾)⋅P(垃圾)P(发票;常年;代开)

P(垃圾|发票;常年;代开)=\frac{P(发票|垃圾)\cdot P(常年|垃圾) \cdot P(代开|垃圾) \cdot P(垃圾)}{P(发票;常年;代开)}

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

P(正常|发票;常年;代开)=P(发票|正常)⋅P(常年|正常)⋅P(代开|正常)⋅P(正常)P(发票;常年;代开)

P(正常|发票;常年;代开)=\frac{P(发票|正常)\cdot P(常年|正常) \cdot P(代开|正常) \cdot P(正常)}{P(发票;常年;代开)}
上面两个式子相除,得到:

P(发票|垃圾)⋅P(常年|垃圾)⋅P(代开|垃圾)⋅P(垃圾)P(发票|正常)⋅P(常年|正常)⋅P(代开|正常)⋅P(正常)

\frac{P(发票|垃圾)\cdot P(常年|垃圾) \cdot P(代开|垃圾) \cdot P(垃圾)}{P(发票|正常)\cdot P(常年|正常) \cdot P(代开|正常) \cdot P(正常)}

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

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

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

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

  1. 转:数学之美番外篇:平凡而又神奇的贝叶斯方法 收藏

    为什么80%的码农都做不了架构师?>>>    转自:http://blog.csdn.net/pongba/archive/2008/09/21/2958094.aspx 数学之美 ...

  2. 数学之美番外篇:平凡而又神奇的贝叶斯方法(转自刘未鹏)

    概率论只不过是把常识用数学公式表达了出来. --拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到 ...

  3. 详解机器学习的凸优化、图神经网络、强化学习、贝叶斯方法等四大主题

    AI是一门入门简单,但想深入却很难的学科,这也是为什么AI高端人才一直非常紧缺的重要原因.在AI领域技术领域,我们可以说机器学习功底决定了一个人的上限也不为过.为什么?机器学习就像物理学中的数学,如果 ...

  4. 独家 | 为什么要尝试A/B测试的贝叶斯方法(附链接)

    作者:Michael Armanious 翻译:欧阳锦 校对:阿笛 本文约3400字,建议阅读8分钟 本文通过一个A/B测试的实例,介绍了贝叶斯方法的各种优点和具体的实现方法,同时也将贝叶斯推断方法与 ...

  5. 贝叶斯方法与连续值离散化

    https://www.toutiao.com/a6701998782122295819/ 奇技指南 实际算法工作中,需要经常处理特征值为连续值,而目标变量为可数属性的情况.这时, 将特征变量进行离散 ...

  6. 《统计学习方法》—— 朴素贝叶斯方法、详细推导及其python3实现(二)

    前言 在上一篇博客中,我们介绍了朴素贝叶斯方法以及详细推导.在这篇博客中,我们将介绍朴素贝叶斯的python3实现代码. 这里,我们将算法复述如下: 输入:数据集 T={(x1,y1),(x2,y2) ...

  7. 《统计学习方法》—— 朴素贝叶斯方法、详细推导及其python3实现(一)

    前言 朴素贝叶斯方法通过构造数据生成分布来预测未知数据的类型,属于生成模型.这里之所以称为"朴素",是因为我们假设数据特征之间具有互相独立的假设. 在这篇博客里,我们将介绍朴素贝叶 ...

  8. 贝叶斯方法学习笔记(二)

    贝叶斯方法学习笔记(二) 原文来自于知乎<你一定从未看过如此通俗易懂的马尔科夫链蒙特卡洛方法解读>.在这里只是将文章主要的核心知识点进行提炼汇总. 链接:你一定从未看过如此通俗易懂的马尔科 ...

  9. 贝叶斯方法学习笔记(一)

    贝叶斯方法学习笔记(一) 一.基本概念 二.实例(史蒂文的身份): 三.基本的概率分布及其性质 四.实例(用短信数据推断行为): 数据集来源 一.基本概念 先验概率:我们把对一个事件A发生的信念记作P ...

最新文章

  1. 插件框架Extensible Framework for Delphi
  2. mysql redis hbase_MySQL之基本介绍
  3. unittest测试框架_python接口自动化测试 - 4.unittest单元测试框架学习
  4. js判断客户浏览器类型,版本
  5. Linux开机自动启动Tomcat
  6. [Spark]如何设置使得spark程序不输出 INFO级别的内容
  7. Java从入门到精通 第4章 常量与变量
  8. 让vim在utf-8的local下打开 gbk 文件
  9. 太宰治小说《人间失格》读后感及txt、epub、mobil电子图书下载
  10. python正则抓取身份证号码,验证18位身份证号码是否正确
  11. android 区分平板,加量不加价!台电首款基于Android 11的平板终上市
  12. java 二进制最大值_java int型最大值/最小值,最大值+1,最小值-1
  13. 阿里云大数据平台的实操:ODPS的SQL语句
  14. maven、md5、git学习
  15. 【DOM】初识DOM
  16. java时钟课程设计_JAVA课程设计报告电子钟
  17. 智能社 Javascript之Node.Js-经典全套教程(价值300元)
  18. Spring 缓存的详解
  19. 5G商用前夜,这些领域已经蓄势待发!
  20. WRF,WPS,WRF-Chem安装及编译步骤及bug总结(转载)

热门文章

  1. android之来电自动拒接并自动回复短信_上课模式app
  2. java OA办公自动化系统毕业设计
  3. 微信小程序 | 基于ChatGPT实现模拟面试小程序
  4. c语言编程求完数的方法,求一完数算法
  5. Android不需要权限也能关机、重启的实现
  6. Python学习周记
  7. 如何使用机器学习来预测新型冠状病毒
  8. IC验证培训——SV通用库共享
  9. Web服务器份额排行榜
  10. oracle中undo解析,oracle undo解析