Bayes Spam Filtering

Bayes’ Theorem

Bayes’ Theorem(贝氏定理/贝叶斯定理/贝叶斯方法/贝叶斯推断)

Bayes定理是现代机器学习的核心,其基本公式如下:

Bayes rule

其中A和B为事件且P(B) ≠ 0

  • P(A)和P(B)分别为A与B事件独立发生的概率(先验概率),其中P(B)也称标准化常量(Normalized Constant)
  • P(A|B)为事件B发生时A的条件概率
  • P(B|A)为事件A发生时B的条件概率

一个经典的例子是:

一座别墅在过去的 20 年里一共发生过 2 次被盗,别墅的主人有一条狗,狗平均每周晚上叫 3 次,在盗贼入侵时狗叫的概率被估计为 0.9,问题是:在狗叫的时候发生入侵的概率是多少?

假设 A 事件为狗在晚上叫,B 为盗贼入侵,则以天为单位统计,P(A) = 3/7,P(B) = 2/(20365) = 2/7300,P(A|B) = 0.9,按照公式很容易得出结果:P(B|A) = 0.9(2/7300) / (3/7) = 0.00058

Bayes推断在垃圾邮件扫描的应用

早在1996年,Jason Rennie的ifile便已采用Bayes推断过滤邮件,然而2002年,Paul Graham大大降低了过滤的错误率。

Paul Graham的做法是,首先通过对正常邮件和垃圾邮件的样本进行扫描和解析,计算出关键字/关键词在正常和垃圾邮件中出现的频率。比如我们假定对于“发票”这个词,通过扫描样本分析,在正常邮件中出现的频率是0.1%,在垃圾邮件样本中出现的频率是10%。

以此样本分析数据为基础,假如我们收到一封邮件,其中内容包含“发票”这个词,首先假定该邮件是正常邮件和垃圾邮件的先验概率为50%(这是一个中性的假定,实际根据情况也可以适当调整),于是根据公式可得:

P(A|B) = (0.1 x 0.5)/(0.1 x 0.5 + 0.001 x 0.5) = 0.990099

由此我们这封邮件是垃圾邮件的概率是99%。

当然,实际产品应用中并不是以一个单词或者词组的概率来确定该邮件是否为垃圾邮件,因为正常邮件里也会有出现这些关键字的可能。实际做法是需要通过一系列关键字计算这封邮件中的联合概率。

Realtime Blackhole List

定义

RBL : Realtime Blackhole List
中国反垃圾邮件联盟目前提供黑名单服务分为4部分:CBL,CDL,CBL+,CBL-。另外中国互联网协会反垃圾邮件(信息)中心也提供了RBL服务

配置方法

- 地址 测试地址 返回状态码
CBL cbl.anti-spam.org.cn 2.0.0.127.cbl.anti-spam.org.cn. 127.0.8.2
CDL cdl.anti-spam.org.cn 0.0.0.240.cdl.anti-spam.org.cn. 127.0.8.4
CBL+ cblplus.anti-spam.org.cn 2.0.0.127.cblplus.anti-spam.org.cn. 127.0.8.6
CBL- cblless.anti-spam.org.cn 2.0.0.127.cblless.anti-spam.org.cn. 127.0.8.5
RBL rbl.anti-spam.cn 1.1.168.192.rbl.anti-spam.cn 127.0.0.2

在Postfix2中配置smtpd_recipient_restrictions:

1
2
3
4
smtpd_recipient_restrictions = XXXXXXX
reject_rbl_client cbl.anti-spam.org.cn,
reject_rbl_client cdl.anti-spam.org.cn,
...

测试服务可以在 reject_rbl_client 前加上 warning_if_reject

其他常用RBL

- 服务器地址 返回状态码
SPAMHAUS SBL sbl.spamhaus.org 127.0.0.2
SPAMHAUS XBL xbl.spamhaus.org 127.0.0.4-6
SPAMHAUS SBL+ XBL sbl-xbl.spamhaus.org 127.0.0.2-6
spamcop RBL bl.spamcop.net 127.0.0.2

其中spamhaus.org提供三种类型:XBL,SBL,ROKSO

  • XBL(Exploits Block List)
  • SBL(The Spamhaus Block List)
  • ROKSO (TheRegister of Known Spam Operations)确定(有确切证据)的已知垃圾邮件发送者

另外还有(部分服务已下线,未验证)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ORDB-RBL-------------------------------relays.ordb.org
spamhaus-------------------------------sbl.spamhaus.org
spamcop--------------------------------bl.spamcop.net
Infinite-Monkeys-----------------------proxies.relays.monkeys.com
NJABL----------------------------------dnsbl.njabl.org
osirusoft.com--------------------------relays.osirusoft.com
MAPS-RBL-------------------------------blackholes.mail-abuse.org
MAPS-DUL-------------------------------dialups.mail-abuse.org
MAPS-RSS-------------------------------relays.mail-abuse.org
MAPS-RBL+------------------------------rbl-plus.mail-abuse.ja.net
Easynet-DNSBL--------------------------blackholes.easynet.nl
Easynet-Proxies------------------------proxies.blackholes.easynet.nl
Easynet-Dynablock----------------------dynablock.easynet.nl
OSIRUSOFT-SPEWS------------------------spews.relays.osirusoft.com

spamassassin compile and install

准备

下载源代码

1
http://spamassassin.apache.org

依赖

spamassassin的编译依赖以下perl模块:

1
2
3
4
5
6
7
8
9
10
11
REQUIRED module : NetAddr::IP
optional module : Digest::SHA1
optional module : Mail::SPF
optional module : Geo::IP
optional module : Net::CIDR::Lite
optional module : Razor2
optional module : Mail::DKIM
optional module : DBI
optional module : Encode::Detect::Detector
optional module : Net::Patricia
optional binary : fetch

编译和安装

解压源代码,在源代码工程root路径下:

1
2
3
4
$ export LC_ALL=C
$ perl Makefile.PL
$ make
$ sudo make install

配置和启动

TODO