5

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

  • fghfghfghfg
  • qsdqsdqsd
  • 呸呸呸

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

我正在使用 Java 标准结构处理数据。

4

9 回答 9

8

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

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

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

于 2010-05-13T13:33:25.270 回答
7

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

于 2010-05-13T13:29:02.147 回答
3

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

于 2010-05-13T13:28:15.360 回答
2

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

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

在大多数 Linux 安装中,您可以从拼写检查器中提取单词列表,aspell如下所示:

aspell --lang en dump master
于 2010-05-13T13:30:57.803 回答
2

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

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

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

于 2010-05-13T13:31:07.903 回答
2

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

于 2010-05-13T13:35:40.057 回答
1

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

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

于 2010-05-13T13:47:11.067 回答
1

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

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

这方面的问题:

  1. 您可能会将错误的拼写视为垃圾,例如,如果有人忘记在单词中的“q”后面加上“u”。
  2. 你不会捕捉到像“thethethe”这样的输入。
于 2010-05-13T13:51:09.530 回答
0

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

于 2010-05-13T23:46:35.043 回答