Algorithm 从文本中检测短语和关键字的算法

Algorithm 从文本中检测短语和关键字的算法,algorithm,nlp,text-processing,Algorithm,Nlp,Text Processing,我有大约100兆字节的文本,没有任何标记,分成大约10000个条目。我想自动生成一个“标签”列表。问题是,有些词组(即短语)只有在组合在一起时才有意义 如果我只是数一数单词,就会得到大量非常常见的单词(is、the、for、in、am等)。我已经计算了单词数以及前后的其他单词数,但是现在我真的不知道下一步该怎么做。与2个和3个单词短语相关的信息已经存在,但是我如何提取这些数据呢?做一个单词矩阵。如果有两个连续的单词,则在相应的单元格中添加一个 For example you have this

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


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

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

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']++;

我将从奥莱利书中的精彩章节开始。他提供了您需要的ngram数据,以及漂亮的Python代码(可以按原样解决您的问题,或者进行一些修改)。

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

在不使用外部数据(输入文本除外)的情况下,通过对文本的二元图和三元图(由2个和3个连续单词组成的序列)进行统计,您可以相对成功地实现这一点。然后,[大多数]具有大量(*)实例的序列可能是“表达式/短语”类型您正在寻找。
这种有点粗糙的方法会产生一些假阳性,但总的来说是可行的正如第一段中所暗示的,这可能会有很大帮助,因为在自然语言中,句子结尾和句子开头往往来自消息空间的有限子集,因此会产生标记组合,这些标记组合似乎在统计上表现得很好,但在语义上通常不相关

更好的方法(可能更昂贵,处理方面和设计/投资方面)将利用与输入文本的领域和/或国家语言相关的额外“优先权”

  • 非常有用,在几个方面(提供额外的、更客观的表达式边界,以及“噪波”单词类,例如,所有文章,即使在实体上下文中使用,在标记云中通常很少,因此OP希望生成
  • 字典、词典等也非常有用。尤其是识别“实体”(即术语中的实例)及其替代形式的词典。实体对于标记云非常重要(尽管它们不是在标记云中发现的唯一一类词),通过识别它们,也可以将它们规范化(许多不同的表达,可以用来表示“Senator T.Kennedy”),从而消除重复,但也可以增加基础实体的频率
  • 如果语料库的结构是文档集合,那么使用与TF(术语频率)和IDF(逆文档频率)相关的各种技巧可能会很有用
[对不起,我得走了,现在(加上我想从你的具体目标中获得更多细节等)。稍后我会尝试提供更多细节和要点]


[顺便说一句,我想在这里插入这篇文章中的乔纳森·范伯格和德文·图恩的回答,因为他们为手头的任务提供了极好的方法和工具。特别是,NTLK总体上的Python为实验提供了极好的框架]一种方法是为自己构建一个自动机。很可能是一个不确定的有限自动机(NFA)。


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

听起来像是在查找.devo这是一个主题,解释和评估我链接到的维基百科文章中提到的“建议公式”

我不能把整个章节都放在这个回答中;希望其中一些能有所帮助。(听起来特别贴切。)nltk也有一个问题,曼宁和舒茨没有提到,因为他们的书比它更早


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

您可能希望首先通过删除常见的“噪音”词和停止词列表来清理输入数据。@teabot,是的,处理噪音词很重要,但在这些词出现之前不应进行处理I’我还有其他用途。例如,如果你打算对输入文本进行词性标注,则需要使用干扰词。即使没有词性标注,也更简单