首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止垃圾邮件的最新技术

防止垃圾邮件的最新技术
EN

Stack Overflow用户
提问于 2012-04-09 15:02:39
回答 4查看 2.9K关注 0票数 3

垃圾邮件防范技术的最新进展是什么?

我已经读过Paul Graham关于贝叶斯过滤的文章了。(A Plan for Spam Better Bayesian Filtering)

并想知道是否有更多的最新文章可用?(最好是与AI相关的)

EN

回答 4

Stack Overflow用户

发布于 2012-04-11 04:05:23

在您试图防止垃圾单词、句子的情况下,您可以始终拥有一个单词及其同义词的数据库。然后,您可以检查输入在数据库中的已知单词是否少于50%,您可以引发一个标志。你可以创建一个离线数据库,我不推荐这样做,或者你也可以使用一些在线数据库。对于单词列表,我建议

http://thesaurus.com/

对于这些单词的同义词列表,我建议

http://www.synonyms.net/

我认为对于上述目的,这两个可能是最好的,因为它们都有一个可以使用的API (用于this页面上的synonyms.net its ),所以它不需要解析返回的页面中的单词。

然后,您可以将其与其他方法相结合,如前所述,例如贝叶斯过滤。

虽然这并不真正适合你的AI需求,但它确实阻止了一系列消息。

为了满足你的“人工智能”需求,你可以调整ALICE's Spam.aiml。它是AIML格式的,但包含大量4符号垃圾信息的排列。这样做的问题是它速度很慢。

Spam.aiml的一个可能的替代方案是使用英语语言的规则来检测垃圾邮件,并对其进行过滤。可以使用以下规则:

每个单词必须至少有一个元音。为此,字母‘Y’被认为是元音。

没有一个单词一行中的辅音超过3个。为此,“TH”被认为是一个字母(这样就不会把“streNGTH”之类的单词搞混了)。

没有一个单词的长度超过34个字母。例外的是列出的单词 .

某些字母组合不能出现。例如,在常规的非俚语对话中,字母“R”和“C”永远不会直接并排出现。

你可以有一个不可能的组合的数据库。我通过对包含6578个单词的数据库运行每个2个字母的排列来做一个小测试,并得出以下结果:

代码语言:javascript
复制
df bf kf gf jk kj sj fj gj hj lj sl

这些都是不可能的组合。当然,诸如'zz‘之类的组合也会被省略。它们是:

代码语言:javascript
复制
aa bb cc dd ee ff gg hh ii jj kk ll mm nn pp qq rr ss tt uu vv ww xx yy zz

“‘oo”被省略了,因为它出现在许多单词中,比如“look”。

长度超过2个字符且连续重复的字符串的段将被标记为垃圾邮件。在字符串'lololololol‘中,重复的片段是'lo',并被标记为垃圾邮件。

同一单词中超过3个相同的元音将被标记为垃圾邮件。例如:'oooouuuu‘将被标记为垃圾邮件,因为'o’和'u‘是重复超过3次的元音。

任何大于1个字符的单词都不能仅由元音组成。在这种情况下,'Y‘不会被认为是元音,以免’you‘被误认为是元音。

任何不遵守这些规则15%或更多(拼写错误的边际)的输入都将被重定向到垃圾邮件。

如果你决定修改爱丽丝的文件,你可以得到很多here。更新的版本可以在ALICE's Google Code page上找到。

您还可以使用拼写检查器来帮助检测垃圾邮件。您可以在拼写检查器上运行输入,比如PyEnchant (用于Python),并阅读建议。如果输入没有建议,那么在大多数情况下,可以安全地假定它是垃圾邮件。

它并不完美,但它应该在有限的范围内做到。我做了一个小程序来演示像这样的垃圾邮件过滤会产生什么结果。这是输出:

代码语言:javascript
复制
>>> fdsahjfsd
'fdsahjfsd' is spam since more than 3 consonants appear in a row
>>> fhsdjhfksd
'fhsdjhfksd' is spam since it has no vowel
>>> jfsdkjl
'jfsdkjl' is spam since it has no vowel
>>> dk
'dk' is spam since it has no vowel
>>> ddds
'ddds' is spam since it has no vowel
>>> uxxs
'uxxs' is not spam
>>> kd
'kd' is spam since it has no vowel
>>> ukd
'ukd' is not spam
>>> asdjaskljlaskjldkasjkljdklas
'asdjaskljlaskjldkasjkljdklas' is spam since it is too long
>>> hdjaskj
'hdjaskj' is spam since invalid sequences detected

正如我之前所说的,它并不完美,因为它返回了误报(例如'uxxs'),但这可以通过拼写检查实现来修复。

使用拼写检查实现的不足之处在于,您的垃圾邮件检测将基于字典中的单词数量。大多数拼写检查器只有前10,000个单词,因此一些不常见的单词可能会被阻止为垃圾邮件。但是,检查输入是否超过15%是无效的可以解决这个问题。

如果你认为它可能对你有帮助,你可以得到我在here上做的小程序。它是用Python编写的。

此外,正如这里的其他答案所说,“最先进的”垃圾邮件过滤器将需要多种方法的混合。

您可以使用SpamAssasinPyZorReverendOrange,但最好的做法可能是尝试将所有这些组合在一起。

如果你想使用Lisp来实现这一点,可以在here上找到一篇关于Lisp中的贝叶斯过滤的文章。

如果你想通过神经网络来做到这一点,那么this Codeproject文章可能会很有用。它利用了一个简单易用的动态链接库,并且示例代码几乎可以直接用于垃圾邮件过滤任务。

票数 4
EN

Stack Overflow用户

发布于 2012-04-11 02:10:00

我找到了这些文章:

  • Adaptive Spam Detection Inspired by a Cross-Regulation Model of Immune Dynamics: A Study of Concept Drift
  • Spam Detection Using Character N-Grams
  • Developing New Continuous Learning Approach for Spam Detection using Artificial Neural Network

(CLA_ANN)

  • A Learning Approach to Spam Detection based on Social Networks

  • Adaptive Spam Detection Inspired by a Cross-Regulation Model of Immune Dynamics: A Study of Concept Drift

  • Why Bayesian filtering is the most effective anti-spam technology

也许对其他人有用。

票数 3
EN

Stack Overflow用户

发布于 2012-04-13 23:14:43

与其说最先进的算法是在输入数据的质量和数量上,不如说是任何一种有规律的算法。要达到最先进的水平,你需要成千上万的活跃用户,每天数百万条消息。换句话说,是Gmail、Yahoo或Hotmail,或者有办法获得类似的海量实时数据。

将您的结论保存到最后可能的时刻;准备好在用户请求邮件列表之前从用户的收件箱中取出一封邮件。找出哪些用户值得信任,并将他们的结论应用于所有其他用户的消息。收集尽可能多的外部输入(用户裁决、发送者信誉、URL目的地分析等),并将它们输入到您的机器学习机器中。

试图仅根据消息内容过滤垃圾邮件是一场失败的游戏;垃圾邮件发送者知道如何将其消息变异到贝叶斯分类器除了噪声之外几乎看不到任何东西。但你可以用这个来对付他们。SpamAssassin有很多证据可以证明这一点,但同样,您需要对实时数据进行动态分析才能真正做到这一点。我甚至可以说,一旦你有了足够的相关输入,你用来制定裁决的准确方法是次要的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10070024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档