从文本中检测短语和关键字的algorithm
我有大约100兆字节的文本,没有任何标记,分为大约10,000条目。 我想自动生成一个“标签”列表。 问题是,有一些词组(即短语)在分组在一起时才有意义。
如果我只是把这些单词计算在内,我会得到大量真正常见的单词(是,在,在,等等)。 我已经统计了之前和之后的单词和其他单词的数量,但现在我真的不知道下一步该怎么做了。关于2和3个单词短语的信息是存在的,但是如何提取这些数据呢?
在此之前, 尽量保留input文本中的“边界”信息。
(如果这样的信息不容易丢失,那么你的问题意味着可能已经完成了标记化)
在标记(在这种情况下是字parsing)过程中,寻找可能定义expression式边界 (例如标点符号,特别是句点,也可能是多个LF / CR分隔符)的模式,也可以使用这些。用作边界,这种expression式边界通常是“负面的”,从某种意义上说,它们将两个不能包含在同一个expression式中的标记实例分开,less数正面的边界是引号,特别是双引号。可以用来过滤一些n-gram(参见下一段),也可以使用诸如“例如”或“代替”或“需要”的单词顺序作为expression式边界(但是使用这样的信息正在磨合使用“先验”,我将在后面讨论)。
如果不使用外部数据 (input文本除外),则可以通过运行文本的二进制和三元组 (2个和3个连续单词的序列)的统计信息来取得相对成功。 然后[大多数]具有显着(*)数量的实例的序列将可能是您正在寻找的“expression/短语”的types。
这种粗略的方法会产生一些误报,但总的来说可能是可行的。 在第一段中已经过滤了已知跨越“边界”的n-gram,可能会有很大的帮助,因为在自然语言中,句子结尾和句子开始倾向于从有限的消息空间子集中提取,从而产生可能似乎在统计学上performance良好,但通常不是语义上相关的。
更好的方法 (可能更昂贵,处理明智,devise/投资明智)将使用与input文本的领域和/或国家语言相关的额外“先验”。
- POS(词性标注)标签在多个方面是非常有用的(提供额外的,更客观的expression边界,并且还包括“噪音”词类,例如所有文章,即使当用于实体的情况下通常是很less的在标签云中,使得OP想要产生。
- 字典,词典等也可能非常有用。 特别是,这些标识“实体”(也就是WordNet语言中的实例)及其替代forms。 实体对于标签云是非常重要的(尽pipe它们不是在它们中find的唯一类别的单词),并且通过识别它们,也可以对它们进行规范化(可以使用许多不同的expression方式,“参议员T.肯尼迪“),从而消除重复,但也增加了底层实体的频率。
- 如果语料库被构build为文档集合,则使用与TF(术语频率)和IDF(逆文档频率)有关的各种技巧可能是有用的,
[对不起,现在要走了(加上想从你的具体目标等更多的细节)。 我会尽量提供更多的细节和后续点]
[顺便说一句,我想在这里插入Jonathan Feinberg和Dervin Thunk的回应 ,因为他们提供了很好的指针,就手头任务的方法和工具而言。 特别是, NTLK和Python- based为实验提供了一个很好的框架]
在O'Reilly的书“ 美丽的数据”中 ,我将从Peter Norvig的一篇精彩篇章开始。 他提供了您需要的ngram数据,以及美丽的Python代码(可以解决您的问题,或者经过一些修改) 在他的个人网站上 。
这听起来像你正在寻找搭配提取 。 Manning和Schütze用了一章来解释和评估我所链接到的维基百科文章中提到的“提议的公式”。
我不能把整个章节放在这个回答中。 希望他们的一些链接将有所帮助。 ( NSP听起来特别合适。)nltk也有一个搭配模块 ,Manning和Schütze没有提到,因为他们的书早于它。
到目前为止发布的其他答复更一般地涉及统计语言处理和n-gram; 搭配是一个特定的子标题。
做一个词的matrix。 然后,如果有两个连续的单词,然后添加一个适当的单元格。
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']++;
一种方法是build立一个自动机。 最有可能是非确定性有限自动机(NFA)。 NFA
另一个更简单的方法是创build一个文件,其中包含您要忽略,查找,比较等的单词和/或单词组,并在程序启动时将它们存储在内存中,然后您可以比较文件使用包含在文件中的单词/单词组parsing。