点击这里阅读英文原文
译者电邮:liji@brandeis.edu
![]()
| 更好的贝叶斯过滤法 | |
| 零散二元多项式散列法(SBPH),及CRM114判别式 | |
| 垃圾邮件过滤的99.9%准确率瓶颈,及其克服方法 |
![]()
2002年8月
(本文介绍了一些我们在使用 Arc 编写一个 Web 邮件阅读器过程中所采用新的防网际垃圾邮件的方法,一个提高版本将在<更好的贝叶斯过滤器>一文中得到介绍,另外在<过滤器反击战>中介绍了一个更为强硬的手段.)
我想制止垃圾邮件是可能的,基于内容的过滤器就是最佳方案。传发垃圾邮件者的致命缺陷就是他们的邮件。至今为止,他们可以绕过任何你所设下的其他障碍,但他们必须传达他们的信息,不管是什么。如果我们编写出能识别他们信息的软件,他们就再也没办法避开了.
![]()
对接收者来说,垃圾文件是一目了然的。若你雇佣某人来读你的邮件并把垃圾邮件删除,他几乎不会遇上什么难题。可在缺少人工智能的情况下,我们应做些什么来模拟这项工作呢?
我认为我们应当能用相当少的算法来解决这个问题。事实上,我已经发现,只需把个别单词的垃圾可能性找出来,进行一种贝叶斯组合,当下的垃圾邮件就可以被相当不错地过滤掉。用一个稍作变异(以下将详加说明)的贝叶斯过滤器,我们可以做到在1000 个垃圾邮件中放过少于 5 个,同时不错纠任何一个.
一般说来,在编写垃圾过滤器时,人们第一个尝试的不会是统计学。大多数黑客的第一反应是试着编写能辨认出垃圾邮件个体性质的软件。你看着垃圾邮件就会想,那帮家伙真够有胆,竟称呼我作"Dear
Friend",或是在标题栏用一溜大写字母结束以八个惊叹号。我能用一行代码把那玩意儿给过滤掉.
于是你这样做了。一开始这法子能行。一两个简单规则能让你把每日垃圾邮件的进项干掉大半。光是找一下"click"这词就能发现我垃圾邮件总数的
79.7%,错纠率仅1.2%.
我花了六个月时间编写查找垃圾邮件个别特征的软件,然后我试了统计学方法后发现,要滤掉剩下那点比例的垃圾邮件甚是困难,并且当我提高过滤严格度时,错纠率也随之增加了.
错纠邮件是那些无害却被错当作垃圾的邮件。对大部分用户来说,遗失合法邮件所带来的损失远远超过接收垃圾邮件。所以一个伴随错纠的过滤器,就象一种疗法用来治疗暗疮,却带给患者相当死亡率一样无稽.
一个用户所接收的垃圾邮件越多,他就有越低的几率从他的垃圾充斥的文件夹里发现一封合法邮件。不无奇怪的是,一个垃圾过滤器越好,错纠的危险性就越高。因为当一个过滤器真好的时候,用户会倾向忽视掉所有被过滤掉的文件.
我不明白自己为什么这么久都没尝试统计方法。我想大概是我有点沉迷于一手辨识垃圾邮件的特征,就好像我在跟那些散发垃圾的人竞赛。(非黑客们不大能意识到这点,就是大部分黑客都很有竞技性.) 当我尝试统计分析后,立刻发现这玩意比我已经做过的要聪明得多。它自然能发现象
virtumundo,teens 这种词是挺好的垃圾邮件指示器,可它还发现了per,FL,ff0000。事实上,ff0000("红色"的html语言) 作为垃圾邮件指示器的功用,跟任何黄色词汇都相似.
![]()
这有我的统计过滤方法的大略。一开始我收集了一个垃圾邮件集和一个非垃圾邮件集,这时它们各自大约有 4000 个邮件在里面。我扫描所有内容,包括每个邮件头,嵌入的 html 和
javascript。现在我把那些同时包含字母和数字的词,以及
"-","'","$" 这些看作 token,其他的看作 token 分隔符(大概可以有改进余地)。我忽视那些纯数字的
token,以及网页解释,甚至不将它们看成 token 分隔符.
我数出所有 token 在各个集子里出现的次数。这时我得到两个大哈希表,一集一个,标识出每个 token 的出现次数。然后我建立第三个哈希表。这次每个 token 对应的是其所在邮件是垃圾的概率。用以下方法算出:[1]
(let ((g (* 2 (or (gethash word good) 0)))
(b (or (gethash word bad) 0)))
(unless (< (+ g b) 5)
(max .01
(min .99 (float (/ (min 1 (/ b nbad))
(+ (min 1 (/ g ngood))
(min 1 (/ b nbad)))))))))
这里 word 是指这个我们正在算的 token,good 和 bad 是我在第一步建立的两个哈希表,ngood,nbad 则分别是其出现非垃圾邮件和垃圾邮件中的数目.
我用上述代码来解释一些重要的细节。我要把概率略作偏差来避免错纠,反复试验后我发现,把 good 中所有数值加倍是个不错的方法。这也帮助区别了那些偶尔在合法邮件出现的词和那些几乎从不出现的。我只考虑那些整个出现过五次以上的词(由于加倍,事实上三次就足够了)。下一个问题是,对那些只出现在其中一个集子的词,其概率作何处理。同样是反复试验后我选用 0.01 和
0.99。这些数目大概还可以再作调整。不过当集子变大时,它们自然而然就调整了.
观察力特别强的人会注意到,当我将单个集子看作一大串文本一作计算次数用途的时候,我是用的各个集子所含邮件数量,而不是它们的整体长度,来作为计算垃圾概率的除数。这时另一个为防止错纠而采取的偏差手段.
当新邮件到来,它首先是被扫描成 token。然后其中特别关键的十五个 token(这里关键度取决于其垃圾概率离中立的 0.5 的遥远程度)将被用于计算这邮件是垃圾与否的概率。令 probs 为一份十五个个体概率的清单,你可以如下来计算其组合概率:
(let ((prod (apply #'* probs)))
(/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x))
probs)))))
在实际应用中会产生这样一个问题,即如何定义一个从未见过词的概率。好比一个在哈希表里从未出现过的词。一样是经过反复试验后我发现,0.4在这挺好用。你若从未见过一个词,它多半是无害的,因为垃圾邮件用词都倾向于再熟悉不过.
在附录中你将看见用以上算法检验一个现实邮件的例子.
若以上算法得出超过 0.9 的概率,我就当这个邮件是垃圾。不过在现实中这个门槛放哪并不重要,因为几乎没有什么邮件的概率算出来在中间的.
![]()
统计学方法的一个极大好处是,你不必再亲自阅读所有的垃圾邮件。在那过去的六个月里,我读了有上千计的垃圾邮件,真要命。诺波特.维纳说过,你若要跟奴隶竞争你得先成为一个奴隶。跟垃圾邮件散发者竞争的有损人格与之相似。为了识别那些单个的垃圾邮件特性,你不得不去试着钻进垃圾邮件散发者的脑袋。说真的,这种事我指望越少越好.
但话说回来,贝叶斯方法的真正好处在于,你可以知道你在测量的是什么。用于特性识别的过滤器(例如 SpamAssassin)给每封邮件打分。贝叶斯方法提供了一个确实的概率。打分的问题在于没人知道分数究竟代表什么。用户不知道,更糟的是,设计过滤器的人也不知道。一个含 sex 这词的邮件究竟应该打多少分? 一个概率自然有可能有错误,但我们不会不明白它代表的是什么,或者它是如何从现有证据中得出的。以我的集子来说,包含 sex 代表这个邮件有 0.97 的可能性是垃圾,sexy 所对应的则是
0.99。同样明白的是,根据贝叶斯法则,一个邮件若同时包含这两个词,在假设所有其他证据不存在(这是不大可能的)的情况下,它将有 99.7% 的可能性是垃圾.
因为计算的是概率,贝叶斯方法考虑的是一个邮件中的所有好坏双方的证据。那些在垃圾邮件中出现得不成比例之少的词(好比
though,tonight,或是 apparently),其降低概率的程度同那些坏词如
unsubscribe,opt-in 的提高概率一样多。所以一个无害邮件若不小心包含了 sex 这词,也不至于一下子就定位为垃圾邮件.
当然,理想情况是每个用户都有自己的计算概率的方法。我收到很多含 lisp 这词的邮件,并且(迄今为止)它没有出现在垃圾邮件中过。所以这样的词是一个给我发邮件的通关口令。在我早期的垃圾邮件过滤器软件里,用户可以设定一个此类"口令"单词的清单,所有包含它们的邮件都将自动不被过滤。在我的清单上,有 lisp 这词,还有我的邮政编码,这样(除非是太象垃圾邮件了)我的在线购物邮件可以直接通过。我以为我够聪明了,可我发现贝叶斯过滤器在替我做同样的事情,更有甚者,它还发现了好些我没想到过的词.
一开头我提到这个过滤器在 1000 个垃圾邮件里放过 5 个错纠 0 个的事,那是说的利用我的邮件集子处理我的邮件上的结果。但这些数据并非提供错误印象,因为那正是我在宣扬的方法: 在单个用户的垃圾邮件和非垃圾邮件基础上,对其邮件进行过滤.实际上,用户界面上会有两个删除键,一个是普通删除,一个是当作垃圾邮件进行删除。这样进入后者的邮件将成为垃圾邮件集的一部分,其他的则进入非垃圾邮件集.
在开始所有的用户将拥有同一个初始过滤器,但最终单个用户将拥有他自己的一份,那是建立在他日常邮件的基础上对每个单词进行的概率统计。这样可以 (1)使过滤器更有效,(2)让每个用户决定他们自己的一套垃圾邮件定义法则,(3)也许是最好的一点,就是使垃圾邮件散发者无法就瞒过过滤器进行调整。如果一个过滤器的大部分智能都来自不同人的数据系统,这种个人化的过滤器将变化多端,而且训练有素,那么光是调整邮件以便通过初始过滤器的做法将很难逃过个人过滤器的法眼.
经常地,基于内容的垃圾邮件过滤器伴随有一个白名单:一个自动免查的邮件发送者清单。弄这么个白名单的简单做法是把此用户发邮件对象记录下来。如果用户有一个专门用来删除垃圾邮件的删除键,那么这个用户当作普通垃圾删除的邮件的发送者也可以被加进白名单.
我是一个白名单的宣扬者,不过更主要是为了节省计算量而非是为了提高过滤效率.我曾以为白名单会使过滤简单化,因为这样就只需检查那些从未听说过的地址发来的邮件,并且那些首次发邮件给你的人说起话来必得是某一种套路。那些你认识的人也许会发邮件来跟你讨论性,那些第一次发邮件给你的人就不大会了。可问题在于,人们可以用不止一个邮件地址,所以一个新来的发送者地址并不保证那人是第一次发邮件给你。挺经常的是,一个老朋友(特别若他是个黑客)会突然用一个新地址给你发邮件,所以你不能冒错纠的危险,对那些首次出现的邮件地址进行严格过滤.
不过在某种意义上,我的过滤器确实包含有一个象白名单样的玩意(还有黑名单),因为它们是基于包含邮件头在内的全部文档进行工作的。所以在一定程度上,它们"知道"那些可信发送者的邮件地址,甚至包括其如何到我手里的路由。同样它们知道关于垃圾邮件的一切,包括其服务器,邮件版本,和协议.
![]()
我要是能保持现在这个过滤效率的话,这个问题已经解决了。可只能过滤掉目前为止的垃圾邮件不说明什么问题,因为垃圾邮件在进化。实际上迄今为止,大部分防垃圾技术所做的,就像一个除了创造出一种新的更顽固的害虫变种之外什么都没干的防虫剂.
对于贝叶斯过滤器我更期待些,因为它们同垃圾邮件一样在进化。所以我们看到,当垃圾散发者开始用 c0ck 代替 cock 来闯过那些基于个别词的低级过滤器时,贝叶斯过滤器自动就发觉了。事实上,c0ck 比 cock 更说明问题得多,而且贝叶斯过滤器特清楚这个"多"的多少.
然而,若想提出一个垃圾邮件过滤方案,你得先回答这样一个问题:要是垃圾散发者清楚知道了你在做的,他们会有多大把握逃过你的过滤? 举例说,当一个基于校验和的垃圾过滤器成为很大障碍,垃圾散发者就会转向 mad-lib 技术去制造邮件正文.
把邮件弄得特别,或者是停止使用猎奇词汇这些手段,都不足以用来对付贝叶斯过滤器。他们还得把邮件弄得跟你的日常邮件无法区分。就这点,我想已经足够限制他们.大部分垃圾邮件都是推销广告,所以除非你的正常邮件也是推销广告,否则垃圾邮件不可避免地会有不同。然后那些垃圾散发者还得改变(而且是不停地改变)他们的整体结构,要不然,不管他们怎么改邮件正文,光那些邮件头就足以让贝叶斯过滤器警觉.对垃圾散发者的结构部分我知道不多,所以我不知道他们怎么能把邮件头改得看上去足够无辜。就我猜,这会比把内容改得看似无辜更加的困难.
假设他们解决了邮件头的问题,那未来的垃圾邮件会象这样:
Hey there。Thought you should check out the following: http://www.27meg.com/foo
因为这样的商业广告,已经在是基于内容的过滤器所能容忍的范围内所能做到的极限.(实际上,就这样的信息要想通过过滤器已经非常困难,因为要是邮件其他部分都呈中性,这个垃圾邮件多半只得强调其所提供的链接,而想要这么做得看上去中性委实困难.)
垃圾散发者无所不有,从根本懒得遮掩身份的所谓 opt-in 清单的商业运作,到黑了服务器来大量散发黄色站点的个人。如果过滤器能把他们限制到只能发送如上邮件的程度,这将把垃圾散发者逼到一个难以行得通的"合理性"运作边缘。为应付各个不同洲的洲法,他们得给出为何他们的垃圾邮件不是垃圾邮件的规范说法,还得告诉你如何取消你的"加入",这些文本都是很容易认出的.
(我一度以为,法律更严格的话垃圾邮件会减少这说法挺天真的。现在我觉得,也许更严格的法律未必造成垃圾邮件数量的直接减少,但他们确实能帮助过滤器更好地工作,使接收者真正看到的垃圾邮件更少.)
在大范围之内,你若能控制垃圾散发者所制造的商业广告,这将不可避免地使他们越来越没法运作。business 是一个值得记住的重要的词。垃圾散发者们是商人。他们散发垃圾邮件因为有利可图。因为哪怕回应率是如此可恶的低(顶多一百万中有十五个,对应于归类邮件的一百万中三千的回应率)也有利润,对他们来说成本几乎为零。但接收者的损失的巨大的,当一百万接收者花一秒钟来删除垃圾邮件,加起来就是五个星期的人工。可这帐算不到垃圾散发者的头上.
不过,散发垃圾邮件多少还是得有点成本的。[2]所以我们使回应率降到越少(不管是通过过滤,还是通过过滤器的存在使得垃圾散发者不得不减少他们的广告程度)商业手段就越难通过散发垃圾邮件来获利.
垃圾散发者之所以使用种种促销手段,是为了提高回应率。虽说这大概比钻进一个垃圾散发者的大脑还更恶心,不过让我们迅速看一眼一个回应垃圾邮件的人是怎么想的。这家伙要不是耸人听闻的轻信就是重度性冷感。不管哪样,不管垃圾邮件在我们看来有多讨厌和愚蠢,他们会感觉刺激。要不是刺激那些垃圾散发者也不会这么说了。那么 "thought you should check out the following" 可不会有垃圾散发者现在说的话那么有推动力。结果是:如果不能加进刺激的商业广告,作为市场推动手段的垃圾邮件会变得不那么有效,那么就会有更少的商人会想用它们.
那将会是完胜。我编写垃圾过滤器软件是为了不再看到那些玩意儿。可我们如果成功到把垃圾邮件都给过滤掉了,那它们就会停止生效,那么垃圾散发者就会停止散发它们.
![]()
从软件到法律,为了对付垃圾邮件有种种的努力,在这当中我觉得贝叶斯过滤器是独一无二的最有效的一个。但我认为,我们所做出的防垃圾的努力越多越好,因为其他限制垃圾散发者的手段可以提高过滤的容易程度。即便在基于内容的过滤器的范围内,我想,有各种不同的软件加入进来同时工作也会不错。不同的过滤器越多,垃圾散发者想要调整邮件来不被过滤掉就越难.
![]()
这里有一个垃圾邮件的例子,它出现在我正写此文的时候。这个垃圾邮件所含的十五个最关键词是:
qvp0045
indira
mx-05
intimail
$7500
freeyankeedom
cdo
bluefoxmedia
jpg
unsecured
platinum
3d0
qves
7c5
7c266675
作为垃圾邮件的典型,这些词既有出现在邮件头部的也有在邮件正文的。同样典型的是,在我数据库中,所有这些词都有一个 0.99 的垃圾概率。事实上概率 0.99 的词不光这些,它们不过是头十五个.
不幸的是,如此一来,这封邮件便成为贝叶斯方法运用的无趣示例。让我们来看另一个相当非典型的垃圾邮件,一个不同概率关键词大杂烩.
这个垃圾邮件中最关键的十五个词及其概率如下:
madam 0.99
promotion 0.99
republic 0.99
shortest 0.047225013
mandatory 0.047225013
standardization 0.07347802
sorry 0.08221981
supported 0.09019077
people's 0.09019077
enter 0.9075001
quality 0.8921298
organization 0.12454646
investment 0.8568143
very 0.14758544
valuable 0.82347786
这回的证据有好有坏了。象"shortest"这种词,其作为辩方证词的力度,同"madam"或"promotion"这种词作为控方证词的力度相当。即使如此,控方在这里还是占了上风。用贝叶斯方法来对以上数字进行组合,我们得到 0.9027 的最终概率.
显然,"Madam"来自那些打头以"Dear Sir or Madam"的垃圾邮件。它们不算很寻常.不过"madam"这词是从来没有出现过在我的合法邮件里,比例就是这样.
"Republic"得分高的理由是它老出现在尼日利亚垃圾邮件里,同时在谈及朝鲜和南非的垃圾邮件里,它也出现过一两回。你也许会说,以这个词来鉴别这个垃圾邮件纯属巧合。但其实在检验垃圾概率的时候,我发现来很多这种巧合,并且它们具有不可思议的倾向,能把事情往好的而非坏的方向上推动。就此例而言,"Republic"同时出现在尼日利亚垃圾邮件和这个垃圾邮件中,这并非全然巧合。因为在不发达国家中存在有一大批可疑商贩,与此同时不发达国家更倾向于在国名中指明它们是共和国(因为事实上它们不是).[3]
另一方面来说,enter 是一个真正的误击。它大多时候出现在取消订阅的说明中,但在这里它的用法全然是清白的。幸运的是,统计方法的全面性,使得相当一部分误击不至于影响最终结果.
作为比较,这里有一个小概率示例,一个避过了过滤器的垃圾邮件。为什么会这样? 因为纯粹偶然地,它刚好用的全是我正常邮件的用词:
perl 0.01
python 0.01
tcl 0.01
scripting 0.01
morris 0.01
graham 0.01491078
guarantee 0.9762507
cgi 0.9734398
paul 0.027040077
quite 0.030676773
pop3 0.042199217
various 0.06080265
prices 0.9359873
managed 0.06451222
difficult 0.071706355
这里有几个好消息。第一,要不是我专长编程语言,还刚好有一个名叫 Morris的好友,这个邮件要想通过过滤恐怕不行。对于一般用户,上述头五个词都应呈中性,不会被用于计算垃圾概率.
第二,我想一个如下的基于双词的过滤器应该会抓住这个邮件:"cost effective","setup
fee","money back",---相当明显的证据。当然了,如果他们还接着发垃圾给我(或者给我所在的网络),光 Hostex 就会成为一个垃圾用语.
最后,这里有一个无辜邮件示例。它的十五个关键词汇如下:
continuation 0.01
describe 0.01
continuations 0.01
example 0.033600237
programming 0.05214485
i'm 0.055427782
examples 0.07972858
color 0.9189189
localhost 0.09883721
hi 0.116539136
california 0.84421706
same 0.15981844
spot 0.1654587
us-ascii 0.16804294
what 0.19212411
这些词的大部分都在标明这个邮件的合法性。有两个不大好的词,"color"(垃圾散发者爱用彩色字体)和"California"(出现在奖状和正式菜单),不过它们不足以压过那些明显是合法的词,好比"continuation"和"example".
挺有趣的是,"describe"的排名如此彻底的合法。它没有在我四千个垃圾邮件中的哪怕一个中出现过。调查结果总是出人意料。当你分析垃圾邮件文档时,你学到的一件事是,那些垃圾散发者干活用的词汇量是如此之小。贝叶斯过滤器得以良好运作,正是赖以这个事实的存在,以及日常用户邮件的类似词汇特性.
![]()
一个我还没试过的主意是,在双词甚至三连词的基础上进行过滤。这将会导致更精细的多的概率估计。举例说,在我现有的数据库里,"offers"这词的概率是
0.96。如果基于双词的话,你会得到"special offers"和"valuable offers"的 0.99 的概率,然后,好比说"approach offers"(出现在"this approach offers"里)的概率会是 0.1或者更少.
我之所以没这么干的原因是,基于单个词汇的过滤器已经工作得如此之好。不过这确实说明,要是垃圾邮件变得更难过滤的话,要缩紧过滤器还可以有空间.(有趣的是,一个基于双词的过滤器,实际上相当于一个逆向运作的马可夫链生成器.)
当然,垃圾邮件的个别特征(好比在"To:"栏见不到收件人地址)对鉴别垃圾是有价值的。在这个算法中,它们可以被当作词汇得到应用。我大概会在将来的版本里这么做,至少用到一小把过分明显的垃圾指示器。基于特征识别的垃圾过滤器的很多细节上都是对的,它们所缺少的,是一个用来归纳证据的总体法则.
识别非垃圾邮件的特征,可能比识别垃圾特征还更重要。错纠造成的麻烦之大,使它们需要被额外管制。在将来的版本里,我大概会加上一个第二级别的测试,专门用来避免错纠。如果一个邮件触动了第二级过滤器,哪怕其垃圾概率超过标准,它也不会被过滤掉.
我不指望这个第二级过滤器用贝叶斯做。不可避免地,它将不仅是即兴的,而且建立在猜测的基础上。因为错纠的总体数目不至于能大到足以发现规律.(再说了,它不过一个跟主体系统技术无关的备份系统.)
另外我还想在将来尝试的是,用额外注意力在邮件的特定部位上。例如,大约 95% 的垃圾邮件包含有一个它想让你去看的链接.(剩下的5%想让你打某个电话号码,回复邮件,或是发信给某个特定地址,或着有一小部分是让你买某个股票.)在这情况下,此链接就足以证明这个邮件是不是垃圾邮件.
在一个(非德国的)邮件里,域名和文本其他部分的区别在于,它们经常包含有挤成一串的几个词汇。虽说在一般情况下计算量过大,试着去解构它们也许是可行的。若是一个过滤器此前从未见过"xxxporn"这样的
token,其垃圾概率是 0.4,而"xxx"和"porn"的垃圾概率(在我的集子里)分别是 0.9889 和
0.99,总体概率 0.8.
缘于垃圾散发者正逐渐停止在邮件文本中使用可疑词汇,域名的解构在我想来会变得更加重要.(当然除了系统管理员的邮件之外,一个链接紧接着一个IP地址是最可疑的标志.)
要是能大家合作弄一个垃圾散发者推销的网站清单应该不错。我们得有一个象拉夫.里维恩研究过的那种信任系统,以防止恶意或无用的举报。不过要是有了这样的东西,它就会对任何的过滤器软件起到推动,对联合抵制垃圾邮件行动也可以提供一个方便的基础.
对付可疑链接还有一个办法,就是在用户看到提到它的邮件之前先放出一个爬虫去看一眼。跟给邮件打分相似,贝叶斯过滤器可以给站点打分,并且用所有在那网站上找到的东西综合计算这个邮件的垃圾概率。一个指向转向站点的链接自然会显得特别可疑.
一个我认为很不错的合作项目是,把垃圾邮件收集成一个庞大的集子。让贝叶斯过滤器运作良好的关键,就是一个大而干净的集子。贝叶斯过滤器实际上会把这个集子当作输入。不过,这样一个集子对其他种类的过滤器也会有用,因为它可以用来进行测试.
制造这样一个集子给技术上带来一些难题。当然,我们需要信任系统以防止恶意或无用的举报。我们还需要从集子里邮件中删除个人信息的方法(不光是"To:"和"Cc:"地址,还有好比说,取消订阅的说明部分经常编入有发送地址.) 如果谁想尝试进行这个项目,这对全世界都会是件好事.
![]()
对于什么是垃圾邮件这问题,我想是有一个大致的一致意见的。不过有个明确定义总会不错。如果我们想建立一个垃圾邮件的集中营,或者想有成效地比较各种垃圾过滤器,我们就需要先把这事弄清楚.
首先,垃圾邮件不是指不请自来的商业邮件。如果我邻居中有人听说我在找一台状态良好的二手拉雷三速,然后给我发邮件要卖我一台,我会很高兴。但这个邮件将既是商业性的又是不请自来的。垃圾邮件的定义性特征并非其不请自来性,而是其自动生成性.
垃圾邮件经常是商业性这点,其实不过是一个巧合。好比说,如果有人开始发送支持某政治态度的大量邮件,这跟推销黄色站点的邮件一样是垃圾邮件.
我建议大家把垃圾邮件定义成"不请自来的,自动生成的邮件"。于是这个定义包含来很多在官方垃圾邮件定义不包括的邮件。官方垃圾邮件的定义,倾向被彩票发行者所影响,把那些跟接收者"有过往来"的公司发出的大量邮件排除在外。不过,从某公司买过东西可不代表说指望从他们那收到更多邮件。如果我从网络商店买样东西,然后他们发给我一连串垃圾邮件,这还是垃圾邮件.
那些发垃圾邮件的公司经常给你提供一个方法去"取消订阅",或者如果你不想再收垃圾邮件的话,让你去他们的站点修改你的"帐号状态"。这不足以改变这些邮件是垃圾邮件的事实。不选择不加入,跟选择加入不是一码事。除非接收者明确点击了一个清楚标明的选择框(缺省状态应为否),要求收到邮件,不然这就是垃圾邮件.
在一些商业关系中,你确实不言明地欢迎一些邮件。好比你在线购买时,我想你会不言明地希望一个收据,以及货物发送时得通知。我不介意 Verisign 发给我邮件警告我域名快过期了(如果他们是这个域名的真正注册人)。不过当 Verisign 发给我邮件说提供给我创建在线商站的免费向导,那就成垃圾邮件了.
![]()
[1]不管你信不信,本文所引的实例一概翻译成普通的LISP语言,是为了达到更好的沟通.这里所描述的实际应用,是我们用以测试一种叫做ARC的尚未推出的新LISP语言而用的.
[2]看来直到目前为止,要发出一百万个垃圾邮件所需的最低成本约为200美元.这够便宜了,平均每个才五十分之一美分.不过,好比说过滤掉95%的垃圾邮件,那会使垃圾散发者想要向某个特定用户传达垃圾的成分增加20倍.几乎没人能有余力,承受如此成本.
[3]根据拇指原理,一个国名前面的限制用词越多,这个国家的元首就越腐败.一个叫做"某某社会主义民主共和国"的国家,大概就是你在这地球上最不想居住的地方.
感谢Sarah Harlin阅读本文手稿;感谢Daniel Giffiin(他也在做ARC解读器)提供关于过滤法的一些好主意,以及建立我们的邮件系统;感谢Robert
Morris,Trevor Blackwell,Erann Gat的很多关于垃圾邮件的讨论;感谢Chip
Coldwell,Sam Steingold提供关于统计学的建议.
![]()
译者注:点击这里阅读此文英文原稿