首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

垃圾邮件过滤技术-过滤软件一瞥(2)

垃圾邮件过滤技术-过滤软件一瞥(2)

4. 基于规则的评定在基于规则的垃圾邮件过滤技术方面,        SpamAssassin是最受大家喜爱的工具,它处于遥遥领先的地位。还有其它一些工具,但它们要么没有得到广泛地使用,要么没有得到积极的维护。对要识别的消息,SpamAssassin(及其它类似工具)评估了大量的模式 — 大多数是正则表达式。如果有匹配的模式,则增加消息分数,否则,则减少消息分数。如果消息分数超过某一特定的阈值,则将其视为垃圾邮件而过滤它;否则认为是合法。      
一些评定规则基本上稳定不变 — 例如,伪造的头和自动执行的 JavaScript,几乎总是垃圾邮件的标志。因为垃圾邮件发送者所开发出的产品和诡计在不断变化,所以需要更新其它一些规则。今天的垃圾消息中,伟哥和非洲独裁者的后继者们也许还风行一时,但明天一些新品种的蛇油药品或色情作品可能会将挤占它们的位置。随着垃圾邮件的发展,SpamAssassin 也必须发展,以跟上它们的步伐。
SpamAssassin 的自述文件中有下列非常有力的声明:
在最近的测试中,SpamAssassin 区分垃圾邮件和非垃圾邮件的正确率达到了99.94%。以后,SpamAssassin 一直会做得越来越好!
我的测试显示,它没有达到这个水平。根据我的语言资料库,SpamAssassin 大约会发生 0.3%“误承认”和 19%“误否认”的情况(这一比率非常高)。公平而论,这只是评估基于规则的过滤器,而没有针对分布式黑名单做选择性的检查。此外,我的垃圾邮件语言资料库中不都是纯的垃圾邮件 — 它还包括大量可能是病毒的附件(我没有打开这些附件做确认,但我知道它们不是我认可的消息)。SpamAssassin的 FAQ 对查找病毒作了免责声明;而另一方面,在查找病毒方面,以下技术做得更好,所以,这份免责声明并不是那么引人注目。
在速度方面,SpamAssassin 比分布式黑名单运行得更快,因为分布式黑名单需要查询网络服务器。但它的速度还是远低于下面统计模型(使用本机数据结构,用解释型的Python 编写的)的非优化版本。有关 SpamAssassin 的优缺点,请阅读“ ”(        developerWorks,2002 年 9 月)。      
5. 贝叶斯(Bayesian)单词分布过滤器Paul Graham 于 2002 年 8 月写了一篇极具争议的文章。在“A Plan forSpam”(请参阅本文后面的 )中,Graham提议建立垃圾邮件和非垃圾邮件单词的贝叶斯概率模型。Graham的文章或者其它任何有关统计和概率的一般性文章都详细讲述了数学方面的背景知识,比我在这里讲得更透彻。      
其大体思想是,在已知的垃圾邮件中,一些单词出现的频率较高,而在合法消息中,另一些单词出现的频率较高。运用一些众所周知的数学知识,对于每个单词,可以生成一个“垃圾邮件指示性概率”。根据消息中所包含的一组词,可以用另一个简单的数学公式来确定文本消息的整体“垃圾邮件概率”。
Graham 的想法有以下几个值得注意的好处:
  • 可以从已分类消息的语言资料库中自动生成过滤器,而不需要人花费精力来制订规则。
  • 可以根据个别用户特有的垃圾邮件和合法消息来进行定制。
  • 可以通过少数几行代码来实现这个想法。
  • 运行情况出奇得好。
乍一看,似乎这样的猜想合乎情理:即,象 SpamAssassin 这样用手工调整和耗费大量人力开发的规则要比漫无目的的自动方法更能准确地的预测出垃圾邮件。事实说明这种猜想完全错误。基本上,统计模型仅比基于规则的方法要好。附带的好处是,Graham样式的贝叶斯过滤器还是比 SpamAssassin 更快和更简单。
在 Graham 的文章发表的这些天里 — 也许就在数小时里,许多人同时开始实现这个系统。我出于测试目的,使用了由我的通信者 John Barham 所创建的 Python 实现。我感谢他给我提供了这个实现。不过,由于数学原理是如此之简单,以至于每个其它的实现大都相同。
有一些数据结构和存储技术的问题会影响到各种工具的运行速度。但事实上预测的精确性取决于很少几个因素 — 最关键因素可能是所使用的词法技术,这些因素大都用来消除虚假的随机字符串。Barham的实现仅在一个小的集合中(字母数字加一些其它字符)查看相对较短和不相交(disjoint)的字符序列。
6. 贝叶斯三元模型(trigram)过滤器贝叶斯技术建立在单词模型上,其工作良好。这种单词模型的缺点之一是,电子邮件中采用的“单词”的数量实际上是无限制的。这个事实可能与我们的直觉相反 — 认为一旦全部包括了几乎所有的英文单词,您就可以一劳永逸,这似乎很合乎情理。从我以前对全文本索引的研究了解到,这完全是不现实的;“与单词类似的”字符序列的数量可能是接近无限,新的文本会不断地产生新的序列。对电子邮件来说,尤其是这样,电子邮件包括消息标识、内容分隔符、UU和 base64 编码等等任意的字符串。从模型中丢弃单词有多种方式(最简单的方式是只丢弃出现频率非常稀少的单词)。
我决定研究一下,对于贝叶斯垃圾邮件过滤器,一个绝对有限的模型空间究竟工作得有多好。我明确地决定,我的概率模型使用三元模型,而不是“单词”。当然,这个想法不是凭空而来的;对于语言识别/区分、英语的密码唯一长度、模式频率和相关领域所进行的大量研究极力推荐将三元模型作为一个良好的单元。
沿着这条思路,我做了几个决定。其中最重要的选择是确定三元模型是什么。虽然这比识别一个“单词”要稍微简单些,但这完全是一种幼稚的方法 — 查找三字节的每个(重叠)序列的方法不是最优化的。尤其考虑到高位字符 — 虽然在多字节字符集(换句话说,CJK)出现的频率相对较高 — 会使三元模型的空间比只在ASCII 范围中查找要大得多。进一步将三元模型空间限制在低位字符会产生较小的空间,但整体结果不是很好。
对于我的三元模型分析,我只利用了高差分三元模型作为消息分类器。但我只是用试错法(trial and error)才达到了“垃圾邮件”和“合法”三元模型所选定的数目。对垃圾邮件,我还用了临界概率,而不是任意概率:我发现了一个有趣的现象,“合法”语言资料库中没有一条消息的垃圾邮件概率是超过 .0071 的,而在 .99 概率范围内,只有两个“误承认”的情况。然而,将临界概率从最初的 0.9 降到0.1,可以使我在“垃圾邮件”语言资料库中捕获更多的消息。出于速度方面的考虑,从每个候选消息中挑出不多于 100 个“令人感兴趣”的三元模型 — 改变这个数目,结果可能略微会有所变化(但不是很明显)。
返回列表