2

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

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

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

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

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

4

1 回答 1

3

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

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

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

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

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

于 2011-08-13T15:19:58.523 回答