Paul Graham Essays

返回

对抗垃圾邮件的计划

发布于 2016-08-02

原文:https://www.paulgraham.com/spam.html

如果你喜欢构建东西,可以尝试Hacker News

2002 年 8 月

(本文描述了我们构建的用于测试Arc的反垃圾邮件网络邮件阅读器中使用的反垃圾邮件过滤技术。在更好的贝叶斯过滤中描述了一种改进的算法。)

我认为可以阻止垃圾邮件,而基于内容的过滤器是解决问题的途径。垃圾邮件发送者的软肋在于他们的消息。他们可以规避你设置的任何其他障碍。至少目前为止是这样。但是他们必须传递他们的消息,无论消息是什么。如果我们能够编写软件识别他们的消息,那么他们就无法绕过这一点。

对于接收者来说,垃圾邮件很容易识别。如果你雇用某人来阅读你的邮件并丢弃垃圾邮件,他们不会有太大的麻烦。除了人工智能之外,我们需要做多少工作才能自动化这个过程?

我认为我们将能够用相当简单的算法解决这个问题。事实上,我发现你可以使用不超过单词的垃圾邮件概率的贝叶斯组合来相当好地过滤当今的垃圾邮件。使用略微调整的(如下所述)贝叶斯过滤器,我们现在每 1000 封垃圾邮件只错过不到 5 封,没有假阳性。

统计方法通常不是人们在编写垃圾邮件过滤器时尝试的第一种方法。大多数黑客的第一直觉是尝试编写识别垃圾邮件的个别属性的软件。你看着垃圾邮件,你会想,这些家伙竟然试图给我发邮件,开头是 “亲爱的朋友”,或者主题行全是大写并以八个感叹号结尾。我可以用大约一行代码过滤掉这些东西。

于是你这样做了,一开始是有效的。一些简单的规则将大大减少你收到的垃圾邮件。仅仅查找 “点击” 这个词将捕捉到我垃圾邮件语料库中 79.7% 的邮件,仅有 1.2% 的假阳性。

在尝试统计方法之前,我花了大约六个月的时间编写软件,寻找个别垃圾邮件特征。我发现识别最后几个百分点的垃圾邮件变得非常困难,随着过滤器变得更严格,我收到的假阳性也越来越多。

假阳性是被错误地识别为垃圾邮件的无辜邮件。对于大多数用户来说,错过合法邮件比收到垃圾邮件更糟糕一个数量级,因此产生假阳性的过滤器就像一种痤疮治疗方法,对患者造成死亡风险。

更多垃圾邮件用户收到的垃圾邮件越多,他们就越不太可能注意到他的垃圾邮件文件夹中的一封无辜邮件。而且很奇怪的是,您的垃圾邮件过滤器越好,假阳性就越危险,因为当过滤器真的很好时,用户更有可能忽略它们捕获的一切。

我不知道为什么我一直避免尝试统计方法。我认为这是因为我上瘾于尝试自己识别垃圾邮件特征,就好像我在与垃圾邮件发送者玩一种竞争游戏一样。 (非黑客很少意识到这一点,但大多数黑客非常有竞争性。)当我尝试统计分析时,我立即发现它比我想象的要聪明得多。当然,它发现了像 “virtumundo” 和 “teens” 这样的术语是垃圾邮件的良好指标。但它还发现 “per”、“FL” 和 “ff0000” 是垃圾邮件的良好指标。实际上,“ff0000”(表示鲜红色的 html)的效果与任何色情术语一样好。

这是我进行统计过滤的简要概述。我从一个垃圾邮件语料库和一个非垃圾邮件语料库开始。目前每个语料库中大约有 4000 封邮件。我扫描每个语料库中每封邮件的整个文本,包括标题和嵌入的 html 和 javascript。我目前认为字母数字字符、短横线、撇号和美元符号是标记的一部分,其他所有字符都是标记分隔符。 (这里可能还有改进的空间。)我忽略所有的全是数字的标记,我还忽略 html 注释,甚至不将其考虑为标记分隔符。

我计算每个标记(目前忽略大小写)在每个语料库中出现的次数。在这个阶段,我得到了两个大的哈希表,一个用于每个语料库,将标记映射到出现次数。

接下来,我创建第三个哈希表,这次将每个标记映射到包含它的邮件是垃圾邮件的概率,我计算如下1:(让((g(* 2(或(gethash word good)0))(b(或(gethash word bad)0)))(除非(<(+ g b)5)(max .01(min .99(float(/(min 1(/b nbad))(+(min 1(/g ngood))(min 1(/b nbad)))))))))其中 word 是我们正在计算概率的标记,好和坏是我在第一步中创建的哈希表,ngood 和 nbad 分别是非垃圾和垃圾邮件的数量。

我以代码形式解释这一点是为了显示一些重要细节。我想略微偏向概率以避免假阳性,通过试错,我发现将所有好的数字加倍是一个好方法。这有助于区分那些偶尔出现在合法电子邮件中的单词和几乎从不出现的单词。我只考虑总共出现超过五次的单词(实际上,由于加倍,在非垃圾邮件中出现三次就足够了)。然后还有一个问题,即为在一个语料库中出现但在另一个语料库中没有出现的单词分配什么概率。再次通过试错,我选择了 0.01 和 0.99。这里可能有调整的余地,但随着语料库的增长,这种调整将自动发生。

特别留心的人会注意到,虽然在计算出现次数时,我认为每个语料库是用于计算出现次数的单个长文本流,但在计算垃圾邮件概率的除

最后编辑于 2024-04-15