Python NLTK';s NgramModel总是为一个词提供相同的概率,无论其上下文如何

Python NLTK';s NgramModel总是为一个词提供相同的概率,无论其上下文如何,python,nlp,nltk,n-gram,Python,Nlp,Nltk,N Gram,我使用nltk中的NgramModel来计算在句子中找到某个单词的概率。我的问题是,无论上下文如何,每个单词每次都给出完全相同的概率!下面是一些示例代码,演示了我的问题 from nltk.corpus import brown from nltk.probability import LidstoneProbDist, WittenBellProbDist from nltk.model import NgramModel estimator = lambda fdist, bins: Li

我使用nltk中的NgramModel来计算在句子中找到某个单词的概率。我的问题是,无论上下文如何,每个单词每次都给出完全相同的概率!下面是一些示例代码,演示了我的问题

from nltk.corpus import brown
from nltk.probability import LidstoneProbDist, WittenBellProbDist
from nltk.model import NgramModel

estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)

lm = NgramModel(3, brown.words(categories='news'), estimator=estimator)
>>> print lm.prob("word", ["This is a context which generates a word"])
0.00493261081006
>>> print lm.prob("word", ["This is a context of a word"])
0.00493261081006
>>> print lm.prob("word", ["This word"])
0.00493261081006
>>> print lm.prob("word", ["word"])
0.00493261081006
>>> print lm.prob("word", ["adnga"])
0.00493261081006

单词的上下文不应该包含单词本身,除非你有一个重复的单词。布朗语料库很小,所以除非你找到数据中实际观察到的三元图,否则你会得到相同的答案。在我的示例中,我使用了bigrams,这样我就不会经常使用平滑模型。在您的示例中,您每次都使用平滑模型。第三,在实践中,LidstoneProbDist非常糟糕,它是平滑时可能工作的最简单的东西,而不是您希望在实践中使用的东西。SimpleGoodTuringProbDist要好得多

from nltk.corpus import brown
from nltk.probability import LidstoneProbDist
from nltk.model import NgramModel

estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)

lm = NgramModel(2, brown.words(categories='news'), estimator=estimator)

lm.prob("good", ["very"])          # 0.0024521936223426436
lm.prob("good", ["not"])           # 0.0019510849023145812
lm.prob("good", ["unknown_term"])  # 0.017437821314436573

单词的上下文不应该包含单词本身,除非你有一个重复的单词。布朗语料库很小,所以除非你找到数据中实际观察到的三元图,否则你会得到相同的答案。在我的示例中,我使用了bigrams,这样我就不会经常使用平滑模型。在您的示例中,您每次都使用平滑模型。第三,在实践中,LidstoneProbDist非常糟糕,它是平滑时可能工作的最简单的东西,而不是您希望在实践中使用的东西。SimpleGoodTuringProbDist要好得多

from nltk.corpus import brown
from nltk.probability import LidstoneProbDist
from nltk.model import NgramModel

estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)

lm = NgramModel(2, brown.words(categories='news'), estimator=estimator)

lm.prob("good", ["very"])          # 0.0024521936223426436
lm.prob("good", ["not"])           # 0.0019510849023145812
lm.prob("good", ["unknown_term"])  # 0.017437821314436573

我今天尝试运行您的代码,但遇到了
NgramModel
的导入错误。当前包管理器中似乎不存在
NgramModel
/
ngram
(在运行
nltk.download()时出现)。ngram模型的文档似乎仍然存在于此,尽管:。你知道发生了什么吗?也许他们在更新中移动了代码?也许值得问你自己的问题。我浏览了新的代码库,但没有看到它。我得到了与nGramModel不存在相同的错误。任何解决方案我今天尝试运行您的代码,但遇到了
NgramModel
的导入错误。当前包管理器中似乎不存在
NgramModel
/
ngram
(在运行
nltk.download()时出现)。ngram模型的文档似乎仍然存在于此,尽管:。你知道发生了什么吗?也许他们在更新中移动了代码?也许值得问你自己的问题。我浏览了新的代码库,但没有看到它。我得到了与nGramModel不存在相同的错误。任何解决方案