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



我正在尝试找出如何从文本中提取特定单词的拼贴。如:与整个文本语料库中的"霍比特人"一词进行统计上显着的搭配的单词是什么?我期待一个类似于单词列表(拼贴(或元组(我的单词+它的拼贴(的结果。

我知道如何使用 nltk 制作双元语法和三元语法,以及如何仅选择包含我感兴趣的单词的双元语法或三元语法。我正在使用以下代码(改编自这个堆栈溢出问题(。

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 单词具有与我感兴趣的单词配对的统计相关频率。我想为此获取对数似然值。

我的想法是:

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

2(计算组成我的N元语法的每个单词的对数似然值,并以某种方式将其与它们出现的n元语法的频率进行比较(?(。这就是我有点迷路的地方...我在这方面没有经验,我不知道如何思考这一步。

有人对我应该怎么做提出建议吗? 假设我现在使用 nltk 提供的三元组池:有没有人知道如何从那里继续获取我的搜索词附近最相关的单词列表?

谢谢

有趣的问题...

相关 1( 看看这个线程...制作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(计算两个以上变量的对数似然有点棘手,因为您应该计算所有排列。看看这篇论文,哪个家伙提出了一个解决方案(第26页包含一个很好的解释(。

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

最新更新