44

我有大约 100 兆字节的文本,没有任何标记,分为大约 10,000 个条目。我想自动生成一个“标签”列表。问题是有些词组(即短语)只有在组合在一起时才有意义。

如果我只计算单词,我会得到大量非常常见的单词(is、the、for、in、am 等)。我已经计算了它之前和之后的单词和其他单词的数量,但现在我真的不知道下一步该怎么做 存在与 2 和 3 单词短语相关的信息,但我如何提取这些数据?

4

5 回答 5

34

在任何事情之前,请尝试保留输入文本中有关“边界”的信息。
(如果此类信息不容易丢失,则您的问题暗示可能已经很容易完成标记化)
在标记化(在本例中为单词解析)过程中,寻找可能定义表达式边界的模式(例如标点符号,特别是句点, 以及多个 LF/CR 分离, 使用这些. 像 "the" 这样的词也经常被用作边界. 这样的表达式边界通常是 "负的", 从某种意义上说, 它们分隔了两个肯定不会的标记实例包含在同一个表达式中。一些正边界是引号,尤其是双引号。这种类型的信息可能有助于过滤掉一些 n-gram(见下一段)。诸如“例如”或“代替”或“需要”之类的词序列也可以用作表达式边界(但使用此类信息正在使用我稍后讨论的“先验”)。

在不使用外部数据(输入文本除外)的情况下,您可以通过对文本的 digrams 和 trigrams(2 个和 3 个连续单词的序列)进行统计来获得相对成功。然后 [大多数] 具有大量 (*) 实例的序列可能是您正在寻找的“表达/短语”类型。
这种有点粗略的方法会产生一些误报,但总的来说可能是可行的。如第一段所述,过滤已知跨越“边界”的 n-gram 可能会有很大帮助,因为在自然语言中,句子结尾和句子开头倾向于从消息空间的有限子集中提取,因此产生的标记组合可能似乎在统计上很好地表示,但通常在语义上不相关。

更好的方法(可能更昂贵、处理方式和设计/投资方式)将使用与输入文本的域和/或国家语言相关的额外“先验”。

  • POS(词性)标记非常有用,在几个方面(提供额外的、更客观的表达边界,以及“噪音”词类,例如所有文章,即使在实体的上下文中使用时通常很少在标签云中,以便 OP 想要生成。
  • 字典、词典等也非常有用。特别是,这些标识“实体”(在WordNet术语中也称为实例)及其替代形式。实体对于标签云非常重要(尽管它们不是在其中发现的唯一一类词),并且通过识别它们,也可以对它们进行规范化(可以使用许多不同的表达方式,例如,“Senator T. Kennedy"),因此消除了重复,但也增加了基础实体的频率。
  • 如果语料库被构造为文档集合,则使用与 TF(词频)和 IDF(逆文档频率)相关的各种技巧可能会很有用

[抱歉,我得走了,现在(加上想从你的具体目标等中获得更多细节)。我稍后会尝试提供更多细节和要点]

[顺便说一句,我想在这里插入Jonathan Feinberg 和 Dervin Thunk 对这篇文章的回复,因为他们提供了出色的指针,就手头任务的方法和工具而言。特别是,NTLKPython-at-large提供了一个极好的实验框架]

于 2009-10-29T13:25:29.880 回答
11

我将从Peter Norvig在 O'Reilly 的《美丽数据》一书中的精彩章节开始。他在他的个人网站上提供了您需要的 ngram 数据,以及漂亮的 Python 代码(可以按原样解决您的问题,或进行一些修改)。

于 2009-10-29T13:20:29.640 回答
8

听起来您正在寻找搭配提取Manning 和 Schütze用一来讨论这个主题,解释和评估我链接到的 Wikipedia 文章中提到的“提议的公式”。

我无法将整章都放入这个回复中;希望他们的一些链接会有所帮助。(NSP听起来特别合适。) nltk 也有一个搭配模块,Manning 和 Schütze 没有提到,因为他们的书早于它。

到目前为止发布的其他回复更广泛地涉及统计语言处理和 n-gram;搭配是一个特定的子主题。

于 2009-10-29T17:46:38.567 回答
0

为单词做一个矩阵。然后,如果有两个连续的单词,则在相应的单元格中添加一个。

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

这将为您提供两个连续单词的值。你也可以做这个词三个词。请注意,这需要 O(n^3) 内存。

您还可以使用堆来存储数据,例如:

heap['for example']++;
heap['example you']++;
于 2009-10-29T13:19:48.730 回答
0

一种方法是为自己构建一个自动机。很可能是非确定性有限自动机(NFA)。 NFA

另一种更简单的方法是创建一个包含您要忽略、查找、比较等的单词和/或单词组的文件,并在程序启动时将它们存储在内存中,然后您可以比较您的文件使用文件中包含的单词/单词组进行解析。

于 2009-10-29T15:56:03.320 回答