【问题标题】:Spam prevention in RailsRails 中的垃圾邮件预防
【发布时间】:2011-08-13 14:16:34
【问题描述】:

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

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

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

我遇到的另一件事是Classifier::Bayes,它可以很好地猜测某物属于什么类别。还在琢磨这个。

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

【问题讨论】:

标签: ruby spam-prevention spam categorization


【解决方案1】:

不要尝试为此推出您自己的解决方案,它比您预期的要复杂得多。事实上,它就是其中之一,比如加密,将其外包给真正擅长它的某人/某事是一个更好的主意。这里有一些背景知识。

Levenshtein 距离当然是一件需要注意的好事情(您永远不知道相似性度量何时会派上用场),但对于这个特定问题使用它并不是正确的事情。

贝叶斯分类器更接近您所追求的。事实上垃圾邮件检测几乎是朴素贝叶斯分类器可以完成巨大工作的典型例子。话虽如此,您必须找到已分类为垃圾邮件和非垃圾邮件的大量数据(消息),并且与您在网站上收到的消息类型相似。然后,您需要训练分类器并测量其性能。您需要对其进行调整并确保不会过度拟合等。虽然 Classifier::Bayes 是一个不错的基本实现,但它不会为您提供很多支持。事实上,Ruby 确实缺乏良好的自然语言处理库。 Ruby 中没有任何东西可以与 python 的 NLTK 相比。

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

长话短说,如果我是你,我会再看一下 Akismet 之类的东西。如果您在您的站点中构建一个设施,您或您的用户可以将消息标记为垃圾邮件(例如通过 rakismet 的 spam! 方法),您将能够将此数据发送到 akismet,并且该服务应该很快了解到特定的类型的消息是垃圾邮件。因此,如果您的用户正在发送许多类似的垃圾邮件,即使 akismet 没有立即接收到这些垃圾邮件,在您标记其中的几个之后,其余的都应该自动接收。如果我是你,我会集中精力在这个方向上进行试验,而不是尝试推出自己的解决方案。

【讨论】:

  • 感谢您的冗长回复!我错过了 rakismet 包括一种通过您引用的 spam! 方法将某些内容表示为垃圾邮件的方法。不过,我担心的一件事是,假设用户向很多人发送了一条非常简单的消息,例如:“你好”。如果这被标记为垃圾邮件,这会阻止人们进一步发送简单的问候消息吗?我宁愿让一些垃圾邮件通过,也不愿让一堆误报阻止某人发送合法邮件。
  • 事实上,任何类型的垃圾邮件分类(或一般分类)在内容较长时效果更好。然而,akismet 多年来一直在做他们所做的事情,正如我所说,他们拥有大量数据,可能需要付出很多努力才能获得永久标记为垃圾邮件的消息。我的建议是,使用 akismet,您会惊讶于他们所做的事情有多好。如果你真的很担心,在 akismet 前面放一个门面,这样你就可以很容易地用其他东西替换它,而不会对你的代码产生太大影响。
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 2011-03-03
  • 2014-04-20
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多