如何解释Python NLTK双字母似然比?

时间:2018-02-09 23:26:07

标签: nlp nltk n-gram

我正在试图找出如何正确解释nltk的“似然比”,给出以下代码(取自question)。

import nltk.collocations
import nltk.corpus
import collections

bgm = nltk.collocations.BigramAssocMeasures()
finder = nltk.collocations.BigramCollocationFinder.from_words(nltk.corpus.brown.words())
scored = finder.score_ngrams(bgm.likelihood_ratio)

# Group bigrams by first word in bigram.                                        
prefix_keys = collections.defaultdict(list)
for key, scores in scored:
    prefix_keys[key[0]].append((key[1], scores))

for key in prefix_keys:
    prefix_keys[key].sort(key = lambda x: -x[1])

prefix_keys['baseball']

使用以下输出:

[('game', 32.11075451975229),
 ('cap', 27.81891372457088),
 ('park', 23.509042621473505),
 ('games', 23.10503351305401),
 ("player's", 16.22787286342467),
 ('rightfully', 16.22787286342467),
[...]

查看docs,看起来每个二元组旁边打印的似然比来自

  

“使用似然比评分ngrams,如Manning和Schutze   5.3.4“。

参考this article,其中有关于pg的说明。 22:

  

似然比的一个优点是它们具有清晰的直观性   解释。例如,bigram强大的计算机是   在假设下,e ^(。5 * 82.96)= 1.3 * 10 ^ 18倍   计算机更有可能遵循强大的基本速率   事件会暗示。这个数字比   我们必须在a中查找t测试或2测试的分数   表

我感到困惑的是,如果我使用上面提到的nltk代码和我自己的数据,会出现“基本出现率”。例如,当前数据集中“棒球”旁边的“游戏”出现的可能性是标准英语的平均使用率的32倍,这是否安全?或者“游戏”是否更有可能出现在“棒球”旁边而不是相同数据集中出现在“棒球”旁边的其他单词?

非常感谢任何有关更清晰的解释或示例的帮助/指导!

1 个答案:

答案 0 :(得分:2)

nltk没有通用的英语语料库,可用于模拟“棒球”之后“游戏”的概率。

可能性分数反映了在语料库中每个结果克前面有“棒球”一词的可能性。

基本发生率将描述在整个语料库中棒球之后发生的单词游戏的频率,而不考虑整个语料库中棒球或游戏的频率。

nltk.corpus.brown 

是一个内置的语料库或一组观察,任何基于概率的模型的预测能力完全由用于构建或训练它的观察所定义。

更新以回应OP评论:

因为32%的'游戏'事件前面都是'棒球'。这有点误导,而且似然得分并不能直接模拟二元游戏的频率分布。

nltk.collocations.BigramAssocMeasures().raw_freq

使用t检验对原始频率进行建模,不太适合bigrams等稀疏数据,因此提供似然比。

Manning和Schutze计算的似然比不等于频率。

https://nlp.stanford.edu/fsnlp/promo/colloc.pdf

第5.3.4节详细描述了他们如何进行计算的计算。

它们考虑了文档中第一个字的频率,文档中第二个字的频率,以及文档中二元组的频率,这种方式非常适合像语料库这样的稀疏矩阵。

如果你熟悉TF-IDF矢量化方法,这个比例的目的就是规范噪声特征。

得分可以无限大。分数之间的相对差异反映了我刚刚描述的那些输入(单词1,单词2和单词1的语料库频率)。

除非您是统计学家,否则此图表是他们解释中最直观的部分:

bigram likelihood scores by Manning and Schutze

可能性得分计算为最左列。