Rails中的垃圾邮件预防

时间:2011-08-13 14:16:35

标签: ruby spam-prevention spam categorization

我有一个Rails应用程序,用户可以将消息发送给其他用户。问题是,这是一种吸引许多发送虚假消息的垃圾邮件发送者的网站类型。

我已经知道一些垃圾邮件服务,如Akismet(通过rakismet)和Defensio(通过defender)。这些问题是看起来他们没有考虑用户已经发送的消息。我在我的网站上看到的垃圾邮件类型是用户向许多其他用户发送相同(或非常相似)邮件的地方。因此,我希望能够与至少一些过去的消息进行比较,以确保它们不同,不会被视为垃圾邮件。

到目前为止,我遇到的最好的事情是Text::Levenshtein distance实现,它计算两个字符串之间的差异数。我想我可以计算差异的数量除以字符串长度,如果它高于某个阈值,那么它不会被视为垃圾邮件。

我遇到的另一件事是Classifier::Bayes,它可以最好地猜测某些类别。还在思考这一点。

我觉得我可能只是在寻找错误的地方,也许已经有了更好的解决方案。也许我正在寻找错误的词语以找到更有用的东西。

1 个答案:

答案 0 :(得分:3)

不要试图为此推出自己的解决方案,它比您预期的要复杂得多。它实际上就是加密这样的事情之一,在这个事情上将它培养给真正擅长的人/事物是一个更好的主意。以下是一些背景信息。

Levenshtein距离当然是一件值得注意的好事(你永远不知道相似性度量何时会派上用场),但是对于这个特定问题来说,这不是正确的选择。

贝叶斯分类器与您所追求的更接近。事实上,垃圾邮件检测几乎就是一个天真的贝叶斯分类器可以完成大量工作的典型例子。说过你必须找到大量的数据(消息),这些数据被分类为垃圾邮件和非垃圾邮件,这类似于你在网站上获得的邮件类型。然后,您需要训练分类器并测量其性能。你需要调整它并确保你不要过度使用它等。虽然Classifier :: Bayes是一个不错的基本实现,它不会给你很多支持。事实上Ruby确实缺乏良好的自然语言处理库。 Ruby中没有任何东西可以与python的NLTK进行比较。

说完所有这些之后,像akismet这样的服务肯定会有一个贝叶斯分类器作为他们用来确定你发送的内容是否是垃圾邮件的工具之一。如果没有其他原因,他们也可以访问这么多数据,那么这个分类器可能会比你自己构建的更复杂。他们可能还会使用其他类型的分类器/算法,毕竟这是他们的核心业务。

长话短说,如果我是你,我会给Akismet另外一些东西。如果您在您的站点中构建一个设施,您或您的用户可以将邮件标记为垃圾邮件(例如通过rakismet的spam!方法),您将能够将此数据发送到akismet,并且该服务应该很快学会一种特殊的信息是垃圾邮件。因此,如果您的用户发送了许多类似的垃圾邮件,即使akismet没有立即提取这些邮件,在您标记其中几个后,其他所有内容都应自动获取。如果我是你,我会集中精力进行这方面的试验,而不是试图推出自己的解决方案。