【问题标题】:Algorithm for separating nonsense text from meaningful text将无意义文本与有意义文本分离的算法
【发布时间】:2010-10-04 20:09:10
【问题描述】:

我为我的一些程序提供了反馈功能。不幸的是,我忘了包含某种垃圾邮件保护功能——因此用户可以将他们想要的任何内容发送到我的服务器——每个反馈都存储在一个巨大的数据库中。

一开始,我会定期检查这些反馈 - 我过滤掉了可用的内容并删除了垃圾。问题是:我每天收到 900 条反馈。只有 4-5 条真正有用,其他消息大多是 2 种胡言乱语:

  • 废话:jfvgasdjkfahs kdlfjhasdf(人们在键盘上砸头)
  • 我不懂的语言

到目前为止我做了什么:

  1. 我安装了一个过滤器来删除任何包含“asdf”、“qwer”等的反馈... -> 每天只有 700 个

  2. 我安装了一个单词过滤器来删除任何包含不良语言的内容 -> 每天 600 个(不要问 - 但那里有很多奇怪的人)

  3. 我过滤掉任何包含非我的语言使用的字母的邮件 -> 每天 400 个

但是每天 400 个仍然太多了。所以我想知道是否有人以前处理过这样的问题并且知道某种算法来过滤掉无意义的消息。

任何帮助将不胜感激!

【问题讨论】:

    标签: algorithm filter word nlp spam


    【解决方案1】:

    不如只使用一些现有的贝叶斯垃圾邮件过滤器实现而不是自己实现。我使用 DSpam 取得了不错的成绩

    【讨论】:

      【解决方案2】:

      一种稍微不同的方法是设置一个系统,将反馈消息通过电子邮件发送到一个帐户,并使用标准的垃圾邮件过滤。您可以通过 gmail 发送他们,让他们的过滤对其进行过滤。不完美,但实施起来也没有太多努力。

      【讨论】:

      • 噢,又快又脏,又老套又有点恶心……我喜欢它! :D
      • +1 用于搭载 Gmail——这可能也是我会做的;他们的垃圾邮件过滤非常好,作为一种快速(而且非常简单)的修复方法,它绝对值得一试。不错的实用且简单的建议。
      • 但 Gmail 真的会过滤掉显示“qwerty”的邮件吗?即使是这样,他们也会查看发件人、主题、发送邮件的服务器等,这对于他的应用程序来说都是一样的(它们都从这个表单发送到 Gmail 帐户)。
      • 如果此方案中的“发件人”地址始终相同,则 Gmail 可能会判定该地址是垃圾邮件发送者,因为它会发送大量垃圾邮件。
      【解决方案3】:

      如果您只期待(或关心)英语 cmets,那么为什么不简单地计算上传的反馈中有效单词的数量(相对于某些字典)。如果数量超过某个阈值,请接受反馈。如果没有,那就扔掉它。这种简单的启发式可以通过添加其他语言的字典来扩展到其他语言。

      【讨论】:

        【解决方案4】:

        您可以尝试许多垃圾邮件过滤器使用的贝叶斯算法。

        Better Bayesian Filtering

        Wikipedia explanation

        Some open Source

        【讨论】:

          【解决方案5】:

          不久前,我在一个网站上的留言簿功能中遇到了垃圾邮件问题(很久以前)。我的解决方案是简单地添加一个类似于验证码的问答字段,询问用户“你是垃圾邮件机器人吗?”任何包含“不”一词的答案(也包括“不,我不是”、“不”和“根本不是”,只是为了好玩......)允许用户发布......

          我选择不使用验证码的原因仅仅是因为我的用户希望网站有一种更“舒适”的感觉,而验证码感觉太正式了。这更个人化 =)

          【讨论】:

            【解决方案6】:

            最简单的方法是计算每个字母出现的次数。 E是英文中最常见的字母,所以应该用得最多。您还可以检查单词和有向图的频率。看看here 获取最常用的英文列表

            【讨论】:

            • 这将有利于检测语言并过滤掉不需要的语言。不幸的是,这不会过滤无意义的文本。
            • 它会过滤无意义的文本,因为无意义的文本没有正确的统计数据。如果你随机敲击键盘,那么 E 不会是输入次数最多的字母
            • 从统计上讲,这适用于长字符串,但并不总是适用于短字符串。 (请注意,上一句不包含“E”,但这并不意味着您应该将其标记为垃圾邮件。)
            • 没错,但它包含的 t 和 i 比 q 和 z 多得多。只要您至少有一两句话,它就应该有效。
            【解决方案7】:

            查找 Claude Shannon 和 Markov 模型。这些导致了一种统计技术,用于评估字母组合来自指定语言来源的概率。

            Here 是普林斯顿大学的一些相关课程笔记。

            【讨论】:

              【解决方案8】:

              Fidelis Assis 和我一直在调整垃圾邮件过滤器OSBF-Lua,以便它可以轻松地适应其他应用程序,包括 Web 应用程序。这个垃圾邮件过滤器连续三年赢得了 TREC 垃圾邮件竞赛。 (我不介意吹牛,因为算法是 Fidelis 的,不是我的。)

              如果您想尝试一下,我们有“接近测试版”的代码

              git clone http://www.cs.tufts.edu/~nr/osbf-lua-temp
              

              我们距离发布一个整洁的版本还有很长的路要走,但如果您安装了 automake 1.9,代码应该可以构建。我们中的任何一个都乐意为您提供有关如何使用它来清理数据库并将其集成到您的应用程序中的建议。

              【讨论】:

                【解决方案9】:

                前面关于捆绑一些垃圾邮件过滤器贝叶斯启发的分类器的答案是一个好主意。对于您的应用程序,由于您似乎收到了很多冗长的无意义单词,因此最好在解析器中打开一个选项来训练二元组和三元组;否则,许多无意义的词将被视为“以前从未见过”,这在您的情况下不是最有用的解析。

                【讨论】:

                  【解决方案10】:

                  是的,就像人们指出的那样,您可以查看垃圾邮件过滤器或马尔可夫模型。

                  更简单的方法是计算每个响应中的不同单词并按频率排序。如果像下面这样的词不在顶部,那么它可能不是有效的文本:

                  the, a, in, of, and, 或者,...

                  它们是任何常用英文文本中最常用的词。

                  【讨论】:

                    【解决方案11】:

                    只需将 cmets 存储为待处理状态,通过 Akismet 或 Defensio 传递它们,然后使用响应将它们标记为潜在垃圾邮件或将它们标记为活动。

                    http://akismet.com/

                    http://defensio.com/

                    我个人更喜欢 Defensio 的 API,但它们都运行得非常好。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-01-30
                      • 2023-03-12
                      • 2016-06-24
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-25
                      相关资源
                      最近更新 更多