1

我试图找出如何从文本中提取特定单词的搭配。如:在整个文本语料库中,哪些词与“hobbit”一词具有统计学意义的搭配?我期待一个类似于单词列表(搭配)或元组(我的单词+它的搭配)的结果。

我知道如何使用 nltk 制作二元组和三元组,以及如何只选择包含我感兴趣的单词的二元组或三元组。我正在使用以下代码(改编自这个 StackOverflow 问题)。

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,除非它允许计算大于trigrams的单位,但我没有找到那个选项),

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

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

谢谢

4

1 回答 1

0

有趣的问题...

与 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 很容易理解和计算出你可以为每对单词使用它。

于 2017-11-28T15:56:16.973 回答