从文本语料库中提取给定单词的collocates - Python

时间:2017-08-17 12:05:55

标签: python nltk n-gram collocation log-likelihood

我试图找出如何从文本中提取特定单词的搭配。如:在与...有关的统计上显着的搭配的单词是什么单词" hobbit"在整个文本语料库?我期待一个类似于单词列表(collocates)或者可能是元组(我的单词+它的搭配)的结果。

我知道如何使用nltk制作双重和三重音,以及如何仅选择包含我感兴趣的单词的双音或三元音。我使用以下代码(改编自this StackOverflow question)。

import nltk
from nltk.collocations import *
corpus  = nltk.Text(text) # "text" is a list of tokens
trigram_measures = nltk.collocations.TrigramAssocMeasures()
tri_finder = TrigramCollocationFinder.from_words(corpus)
# Only trigrams that appear 3+ times
tri_finder.apply_freq_filter(3)
# Only the ones containing my word
my_filter = lambda *w: 'Hobbit' not in w
tri_finder.apply_ngram_filter(my_filter)

print tri_finder.nbest(trigram_measures.likelihood_ratio, 20)

这很好用,并给我一个三元组列表(其中一个元素是我的单词),每个元组都有对数似然值。但我真的不想只从三卦列表中选择单词。我想在我选择的一个窗口中制作所有可能的N-Gram组合(例如,在我的单词左边3和右3的窗口中的所有单词 - 这意味着7-Gram),然后检查哪一个那些N-gram单词的统计相关频率与我感兴趣的单词配对。我想采用Log-Likelihood值。

我的想法是:

1)计算包含我的单词的不同大小的所有N-Gram组合(不一定使用nltk,除非它允许计算大于三元组的单位,但我还没有找到该选项),

2)计算构成我的N-gram的每个单词的对数似然值,并以某种方式将它与它们出现的n-gram的频率进行比较(?)。这是我迷失了一点......我没有经验,我不知道如何思考这一步。

有没有人有我应该怎么做的建议? 假设我现在使用nltk提供的三卦池:有没有人有想法如何从那里开始获取我的搜索词附近最相关的单词列表?

谢谢

1 个答案:

答案 0 :(得分:0)

有趣的问题......

与1相关)看看这个thread ......制作ngrams的不同解决方案..基本上我好了

from nltk import ngrams
sentence = 'this is a foo bar sentences and i want to ngramize it'
n = 6
sixgrams = ngrams(sentence.split(), n)
for grams in sixgrams:
    print (grams)

另一种方式可能是:

   phrases = Phrases(doc,min_count=2)
   bigram = models.phrases.Phraser(phrases)
   phrases = Phrases(bigram[doc],min_count=2)
   trigram = models.phrases.Phraser(phrases)
   phrases = Phrases(trigram[doc],min_count=2)
   Quadgram = models.phrases.Phraser(phrases)
   ... (you could continue infinitely) 

min_count控制语料库中每个单词的频率。

与2相关)因为你应该计算所有的排列,因此计算两个以上变量的loglikelihood的方法有点棘手。看看这个thesis哪个人提出了解决方案(第26页包含了一个很好的解释)。

然而,除了对数似然函数之外,还存在PMI(逐点互信息)度量,其计算在文本中除以它们各自频率的单词对的共现。 PMI易于理解和计算,您可以将它用于每对单词。