2017-08-17 123 views
1

我试图找出如何提取特定词的搭配词出来的文字。如:在统计上显着的搭配,例如:整个文本语料库中的“霍比特人”一词?我期待类似于单词列表(搭配)或者可能是元组(我的单词+它的搭配)的结果。从文本语料库一个给定的单词提取搭配词 - 的Python

我知道如何使双边和使用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组合(例如,在我左右三个窗口中的所有单词 - 这意味着一个7克),然后检查哪一个这些N-gram单词与我的兴趣单词具有统计相关的频率。我想为此考虑Log-Likelihood值。

我的想法是:

1)计算不同尺寸的所有的N-gram组合包含我的字(不一定使用NLTK,除非它可以计算比卦更大的单位,但我还没有发现,选项),

2)计算对于每个构成我的n-gram的单词的对数似然值,并以某种方式进行比较针对它们出现在(n-gram中的频率?)。这里是我迷失的地方......我没有经历过这个,我不知道该如何思考这一步。

有没有人有任何建议,我应该怎么办? 假设我现在使用nltk提供的trigrams池:有没有人有想法如何从那里进行获取我的搜索词附近最相关的单词列表?

谢谢

回答

0

有趣的问题......

相关:1)看看这个thread ...不同不错的解决方案,使n元语法..基本上我是劳

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控制FRE语料库中每个单词的完整性。

相关的2)它是两个以上的变量在某种程度上棘手的计算对数似然,因为你要算的所有排列。看这thesis哪个家伙提出了一个解决方案(第26页包含一个很好的解释)。

然而,除了对数似然函数,存在PMI(逐点互信息)度量,其计算对单词可以通过单独的频率在文本划分的的共现。 PMI很容易理解,并计算出每对单词可以使用哪一个。

相关问题