【问题标题】:Detect and remove noise text [closed]检测并去除噪音文本[关闭]
【发布时间】:2011-02-19 02:28:36
【问题描述】:

给一个包含大量数据的数据库表,删除噪声文本的最佳做法是什么,例如:

  • fghfghfghfg
  • qsdqsdqsd
  • rtyrtyrty

噪声存储在“名称”字段中。

我正在处理具有 Java 标准结构的数据。

【问题讨论】:

  • 允许拥有 3k 代表的 stackoverflow.com 用户删除他们吗?

标签: noise java text


【解决方案1】:

删除这样的东西并不像看起来那么容易。

对于我们人类来说,很容易看出“djkhfkjh”没有任何意义。但是计算机如何检测到这种噪音呢?它怎么会知道“Eyjafjallajökull”只是一个砸键盘的人,还是最近几年最热闹的一座山?

如果没有很多误报,你就无法可靠地做到这一点,所以毕竟它是再次手动过滤误报和真阳性。

【讨论】:

    【解决方案2】:

    好吧,您可以使用 NLP 方法构建分类器,并根据噪声和非噪声示例对其进行训练。您可以采用的一种情况是 Apache Tika 的语言检测器。如果语言检测器说“击败我”,那可能就足够了。

    【讨论】:

      【解决方案3】:

      获取包含尽可能多的名称的字典,然后过滤数据以显示字典中没有的名称。然后您必须将它们一一删除,以确保您不删除有效数据。 按名称对列表进行排序可以帮助您一次删除更多行。

      【讨论】:

        【解决方案4】:

        如果文本的其余部分是英文,您可以使用单词列表。如果文本中超过给定百分比(例如 50%)的单词不在单词列表中,则可能是噪声。

        您可能希望设置一个阈值,例如 5 个字,以防止删除诸如“LOL”之类的帖子。

        在大多数 Linux 安装中,您可以像这样从拼写检查器 aspell 中提取单词列表:

        aspell --lang en dump master
        

        【讨论】:

        • “乔治·布什讨厌巴拉克·奥巴马。” 80% 是非文字,但它是有意义的。
        • 'Bush' 是一个词,所以 60%
        • 你可以得到一个名字列表并添加它,备份到100%
        • NLP 算法从来都不是完美的,我举了一个例子。通过一些调整,我认为这可以工作。
        【解决方案5】:

        您需要从更有效地定义“噪声文本”开始。定义问题是这里的难点。你不能编写会说“摆脱有点像_____的字符串”的代码。看起来您确定的模式是“连续三个字符的一致集合,并且该集合至少重复一次,但可能不会完全终止(它可能终止于集合中间的一个字符)。”

        现在编写一个匹配该模式的正则表达式,并对其进行测试。

        但我敢打赌,您正在寻找其他模式......

        【讨论】:

          【解决方案6】:

          检查每个单词,看看有多少冗余。如果有超过三个连续重复的字母组,则它是噪声的良好候选者。此外,寻找通常不属于一起的字母组以及在键盘上也是连续的连续字母组。如果一个完整的单词是由键盘相邻的这些字母组成的,它也会在噪音列表中占有一席之地。

          【讨论】:

          • 另一个有用的启发式方法是元音与辅音的比例。
          • @Justin:但允许值的范围因语言而异。例如,克罗地亚有一个漂亮的岛屿,叫做Krk
          【解决方案7】:

          训练 NLP 分类器可能是最好的方法。然而,更简单的方法可能是简单地检查每个单词是否存在于所有已知“有效”单词的列表中。大多数 Unix 系统都有一个名为 /usr/share/dict/words 的文件,您可以将其用于此目的。此外,Ubuntu 通过 /usr/share/dict/american-english、/usr/share/dict/american-huge 和 /usr/share/dict/american-insane 对此进行了扩展,每个列表都比上一个列表更全面。这些列表还包括许多常见的拼写错误,因此您不会过滤掉从技术上讲不是单词但可以清楚地识别为单词的文本。

          如果您真的有野心,可以结合这些方法,并使用这些单词列表来训练贝叶斯或最大熵分类器。

          【讨论】:

          • 贝叶斯+1,非常适合这种是/否分类。
          【解决方案8】:

          这里有很多很好的答案。哪一个对你有用很大程度上取决于你的问题的具体情况——例如,输入应该是英文单词、用户名、人们的姓氏等。

          一种方法:编写一个程序来分析您认为“有效”的输入。跟踪每个可能的三字母序列在合法文本中出现的频率。然后,当您有输入要检查时,查看输入的每个三字母序列并查找其预期频率。像“xzt”这样的东西的频率可能接近于零。如果您有太多这样的子序列,请将其标记为垃圾。

          这个问题:

          1. 您可能会将错误的拼写视为垃圾,例如,如果有人忘记在单词中的“q”后面加上“u”。
          2. 您不会捕捉到“thethethethe”之类的输入。

          【讨论】:

            【解决方案9】:

            示例 #1 和 #2 可以被解析器删除,该解析器试图找出文本的发音方式。无论使用何种语言,它们都是无法言说的,因此也不是语言。

            【讨论】:

              猜你喜欢
              • 2012-03-01
              • 2017-07-07
              • 1970-01-01
              • 2015-07-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-18
              • 2011-12-28
              相关资源
              最近更新 更多