Spambayes 项目简介
Spambayes 项目是受 Paul Graham 的 “垃圾邮件计划” (www.paulgraham.com/spam.html) 启发的众多项目之一。这篇著名的文章讨论了使用一种称为贝叶斯分析的统计技术来识别电子邮件消息是否为垃圾邮件。有关 Spambayes 背后的数学原理及其演变的完整故事,请参阅 Gary Robinson 在第 58 页的配套文章。
简而言之,该系统通过一组已知的垃圾邮件消息和一组已知的非垃圾邮件或“火腿”消息进行训练。它将消息分解为标记(大致来说是单词),并根据每个标记在每种类型的消息中出现的频率为每个标记评分。这些分数存储在数据库中。新消息被标记化,并将标记与分数数据库中的标记进行比较,以便对消息进行分类。这些标记共同给出一个总体分数——消息是垃圾邮件的概率。
您通过使用自己的消息来训练 Spambayes 这一事实是它的优势之一。它了解您收到的消息类型,包括火腿邮件和垃圾邮件。其他使用黑名单、通用垃圾邮件识别规则或已知垃圾邮件数据库的垃圾邮件过滤工具不具备此优势。
Spambayes 软件通过向每条消息添加 X-Spambayes-Classification 标头来对电子邮件进行分类。此标头的值为 spam、ham 或 unsure。然后,您可以使用现有的电子邮件软件根据该标头的值进行过滤。我们使用从 0(火腿邮件)到 1(垃圾邮件)的垃圾邮件度标尺。默认情况下,< 0.2 表示火腿邮件,> 0.9 表示垃圾邮件。介于这些数字之间的任何电子邮件都标记为不确定。您可以自己调整这些阈值;请参阅下文,了解如何配置软件。
Spambayes 与其他垃圾邮件分类器在三个方面有所不同:其基于测试的设计理念、其标记器和其分类器。
我们都可以想到识别垃圾邮件的明显方法:它有大喊大叫的主题行;它告诉你如何快速赚钱!!!;它声称来自尼日利亚副总统或他的妻子。根据明显的规则调整任何垃圾邮件分类软件是很诱人的。例如,它显然应该是区分大小写的,因为 FREE 比 free 更好地提示垃圾邮件。但是 Spambayes 团队从一开始就拒绝接受任何表面价值。该软件最早的组件之一是一个可靠的测试框架,该框架会将新想法与以前的版本进行比较。任何没有改进结果的想法都会被抛弃。结果通常令人惊讶;例如,区分大小写没有显着差异。这种不证明就失败的方法有助于开发出令人难以置信的准确系统,而几乎没有浪费精力。
标记器负责将消息拆分为标记。它已经从简单的按空格拆分演变为了解消息结构的工具,例如,标记主题行中的单词,以便将它们与正文中的单词分开识别。它还了解它们的内容,例如,将嵌入式 URL 与纯文本进行不同的标记化。标记器中的所有特殊规则都经过严格的测试,并被证明可以提高准确性。这包括故意隐藏某些标记——例如,默认情况下,我们剥离 HTML 装饰并忽略大多数标头。令人惊讶的决定,但它们得到了测试的支持。
分类器是 Spambayes 的统计核心,是数字处理者。自 Paul Graham 的文章问世以来,它已经发生了很大的变化,同样是通过基于测试的开发。“Gary 的文章“解决垃圾邮件问题的统计方法”(第 58 页)详细介绍了分类器。
Spambayes 软件可从 sf.net/projects/spambayes 下载。它需要 Python 2.2 或更高版本以及 Python 电子邮件包的 2.4.3 或更高版本。如果您运行的是 Python 2.2.2 或更高版本,您应该已经拥有它。如果不是,您可以从 mimelib.sf.net 下载并安装它:解压缩存档,cd 到 email-2.4.3 目录并键入 setup.py install。这会将其安装在您的 Python site-packages 目录中。您还需要将标准电子邮件库移到一边;转到您的 Python Lib 目录,并将文件 email 重命名为 email_old。
由于该项目正在不断开发中,因此在我撰写本文和杂志登上报摊之间,肯定会发生变化。我将在 www.entrian.com/spambayes 的更新页面上发布任何重大更改的摘要。
在我撰写本文时,我们正在研究的一些内容包括更灵活的命令行训练;启用与更多电子邮件客户端(如 Mutt)的集成;基于 Web 的配置;Web 界面的安全功能;以及更轻松的安装。我将在更新页面上提供有关这些项目的完整详细信息。
Spambayes 软件中有三个分类器程序:procmail 过滤器、POP3 代理和 Microsoft Outlook 2000 插件。我在本文中介绍了 procmail 过滤器和 POP3 代理。Web 界面(如下所述)和各种命令行实用程序、测试工具等也是 Spambayes 的一部分;有关完整详细信息,请参阅软件附带的文档。
如果您使用基于 procmail 的电子邮件系统,这就是 Spambayes procmail 系统的工作方式
您所有现有的邮件都有一个新的 X-Spambayes-Trained 标头。该软件使用它来跟踪它已经学习过的消息。
该软件会查看您的所有传入邮件。它认为的垃圾邮件会放入“垃圾邮件”邮件文件夹中。其他所有邮件都正常传送。
每天早上,它都会浏览您的邮件文件夹,并根据任何新消息进行自我训练。它还会提取已重新归档的邮件——它认为它是火腿邮件但实际上是垃圾邮件,反之亦然。请务必将垃圾邮件保存在垃圾邮件文件夹中至少一两天,然后再删除它。我们建议保留数百条消息,以防您需要重新训练软件。
您需要一个正常运行的 crond 来设置每日训练作业。或者,您可以拥有一个垃圾邮件邮箱和一个火腿邮件邮箱来进行一些初始训练。
要在您的 procmail 系统上设置 Spambayes,首先要安装该软件。我假设您已将其放入 $HOME/src/spambayes。然后,创建一个新数据库
$HOME/src/spambayes/hammiefilter.py -n
如果您选择在现有邮件上训练 Spambayes,请键入
$HOME/src/spambayes/mboxtrain.py \ -d $HOME/.hammiedb -g $HOME/Mail/inbox \ -s $HOME/Mail/spam如果您愿意,可以添加其他文件夹名称,-g 用于良好邮件文件夹,-s 用于垃圾邮件文件夹。接下来,您需要将以下两个配方添加到您的 .procmailrc 文件的顶部
:0fw | $HOME/src/spambayes/hammiefilter.py :0 * ^X-Spambayes-Classification: spam $HOME/Maildir/.spam/之前的配方适用于 Maildir 消息格式。如果您需要 mbox(许多系统上的默认格式)或 MH,则第二个配方应如下所示
:0: * ^X-Spambayes-Classification: spam $HOME/Mail/spam如果您不确定应该使用哪种格式,请咨询您的系统管理员。如果您是系统管理员,请查看您的邮件程序的文档。大多数现代邮件程序都可以处理 Maildir 和 mbox。
使用 crontab -e,添加以下 cron 作业以在每天早上 2:21 训练 Spambayes 以处理新的或重新归档的消息 AM
21 2 * * * $HOME/src/spambayes/mboxtrain.py -d $HOME/.hammiedb -g $HOME/Mail/inbox -s $HOME/Mail/spam
您也可以在此处添加其他文件夹名称。如果您经常将邮件归档到不同的文件夹中,则这样做很重要;否则 Spambayes 永远不会了解有关这些消息的任何信息。
Spambayes 现在应该过滤您的所有邮件并在您的邮箱上进行自我训练。但偶尔会发生邮件归档错误的情况。只需将该邮件移动到正确的文件夹,Spambayes 就会在第二天早上从其错误中学习。
非常感谢 Neale Pickett 在本节中提供的信息。
如果您不使用 Procmail 或不想摆弄它,或者如果您想在非 UNIX 机器上设置软件,则可以使用 POP3 代理。这是一个位于您的 POP3 服务器和您的电子邮件程序之间的中间人,它会在您检索电子邮件时向电子邮件添加 X-Spambayes-Classification 标头。您还可以将 POP3 代理与 Fetchmail 一起使用;只需重新配置 Fetchmail 以与 POP 代理而不是您的真实 POP3 服务器对话。
Web 界面允许您通过 Web 浏览器预先训练系统、对消息进行分类以及训练通过 POP3 代理接收的消息。该软件通过名为 bayescustomize.ini 的文件进行配置。Procmail 过滤器也是如此。无需更改任何默认设置即可开箱即用,但 POP3 代理需要使用您的 POP3 服务器的详细信息进行设置。所有可用选项及其默认值都位于名为 Options.py 的文件中,但只有当您非常好奇或想要进行高级调整时,才需要查看该文件。您需要做的最少的事情是创建一个如下所示的 bayescustomize.ini 文件
[pop3proxy]
pop3proxy_servers: pop3.example.com
其中 pop3.example.com 是您当前配置电子邮件客户端以收集邮件的位置。代理默认在端口 110 上运行。这在非 UNIX 平台上很好,但在 UNIX 上,您需要使用不同的端口,方法是添加以下行
pop3proxy_ports: 1110到 bayescustomize.ini 的 [pop3proxy] 部分。如果您从多个 POP3 服务器收集邮件,则可以在 pop3proxy_servers 中提供以逗号分隔的地址列表,并在 pop3proxy_ports 中提供相应的以逗号分隔的端口号列表。每个端口代理到相应的 POP3 服务器。
您现在可以运行 pop3proxy.py。这将打印一些状态消息,其中应包括类似以下内容
Listener on port 1110 is proxying pop3.example.com:110 User interface url is https://:8880
这意味着代理已准备好供您的电子邮件客户端在端口 1110 上连接,并且 Web 界面已准备好供您将浏览器指向给定的 URL。要从另一台计算机访问 Web 界面,请将 localhost 替换为运行 pop3proxy.py 的计算机的名称。
您现在需要配置您的电子邮件客户端以从代理而不是从您的 POP3 服务器收集邮件。在您当前设置 pop3.example.com,端口 110 作为您的 POP3 服务器的位置,您需要将其设置为 localhost,端口 1110。如果您在与您的电子邮件客户端不同的计算机上运行代理,请使用 计算机名,端口 1110。
现在,对您的邮件进行分类就像单击“获取新邮件”一样简单。代理向每条消息添加 X-Spambayes-Classification 标头,您可以在邮件程序中设置过滤器,将可疑的垃圾邮件归档到其自己的文件夹中。但是,在您进行一些训练之前,您的所有消息都将被分类为不确定。
一旦您启动并运行,您应该定期检查您的可疑垃圾邮件文件夹,看看是否有任何真实消息溜进来,即所谓的误报。随着您训练系统,这种情况会越来越少发生。
初始训练不是绝对必要的,但如果您这样做,您将从一开始就获得更好的结果。您可以使用上传消息或 mbox 文件表单通过 Web 界面进行训练,可以针对单个消息或 UNIX mbox 文件。
一旦您启动并运行,您可以使用 Web 界面来训练系统处理 POP3 代理已看到的消息。“查看消息”页面列出了您的消息,根据软件认为它们是垃圾邮件、火腿邮件还是不确定邮件进行分类。您可以通过选中复选框,然后单击“训练”来纠正任何错误。几天后(取决于您收到的电子邮件数量),错误会非常少。
Spambayes 在对您的邮件进行分类方面做得非常出色,但它只与您用于训练它的数据一样好。以下是一些帮助您获得最佳结果的技巧
不要在旧邮件上进行训练。您的电子邮件的特征会随着时间的推移而变化——有时是细微的变化,有时是剧烈的变化——因此最好使用最近的邮件。
训练时要小心。如果您错误地将垃圾邮件训练为火腿邮件,反之亦然,则会使分类器失效。
尽量在大致相同数量的垃圾邮件和火腿邮件上进行训练。这不是关键,但您将在公平的平衡中获得更好的结果。
Spambayes 软件正在不断开发中。许多人参与其中,我们对下一步要做什么有很多想法。以下是该项目可能走向的一些方向
随着新的研究揭示更准确的垃圾邮件分类方法,改进标记器和分类器。
智能自动训练:一旦系统启动并运行,它应该能够通过自我训练来保持最新状态,用户只需纠正偶尔的错误即可。我们已经在 Procmail 系统中做了一些类似的事情,但我们正在寻找使其更自动化并与所有平台兼容的方法。
SMTP 代理:要从任何平台上的任何电子邮件客户端训练系统,您可以将消息发送到特殊的火腿邮件或垃圾邮件地址。这可能是一种纠正分类错误的简单方法,并且可以与智能自动训练技术很好地结合使用。
数据库缩减:您训练系统越多,其数据库就越大。我们正在寻找缩小数据库大小的方法。
与垃圾邮件报告工具集成:Web 界面和电子邮件插件可以让您向 Vipul's Razor 和 Pyzor 等系统报告垃圾邮件。
更多电子邮件客户端集成:我们已经有了 Outlook 插件,我们希望与更多电子邮件客户端集成。POP3 代理和 Web 界面可以与任何电子邮件客户端良好地配合使用,但是电子邮件客户端中直接有一个“删除为垃圾邮件”按钮比切换到 Web 浏览器方便得多。
更好的文档:我们的目标是发布有关如何在所有流行的平台和电子邮件客户端上设置 Spambayes 的文档。
到本文印刷时,其中一些事情可能已经在发生;有关详细信息,请参阅我在 www.entrian.com/spambayes 的更新页面。
电子邮件:richie@entrian.com
Richie Hindle 是英国的一名专业软件工程师。他全职从事商业智能软件的编写工作,并在业余时间在 www.entrian.com 上从事 Spambayes 和他自己的 Python 项目。他只是偶尔戴一顶傻帽子。