gpt4 book ai didi

python - NLTK 中的 Ngram 模型和困惑

转载 作者:太空狗 更新时间:2023-10-29 17:34:33 26 4
gpt4 key购买 nike

为了说明我的问题,我想训练和测试/比较几种(神经)语言模型。为了专注于模型而不是数据准备,我选择使用 nltk 的 Brown 语料库并训练 nltk 提供的 Ngrams 模型作为基线(与其他 LM 进行比较)。

所以我的第一个问题实际上是关于我发现可疑的 nltk Ngram 模型的行为。由于代码很短,我将其粘贴在这里:

import nltk

print "... build"
brown = nltk.corpus.brown
corpus = [word.lower() for word in brown.words()]

# Train on 95% f the corpus and test on the rest
spl = 95*len(corpus)/100
train = corpus[:spl]
test = corpus[spl:]

# Remove rare words from the corpus
fdist = nltk.FreqDist(w for w in train)
vocabulary = set(map(lambda x: x[0], filter(lambda x: x[1] >= 5, fdist.iteritems())))

train = map(lambda x: x if x in vocabulary else "*unknown*", train)
test = map(lambda x: x if x in vocabulary else "*unknown*", test)

print "... train"
from nltk.model import NgramModel
from nltk.probability import LidstoneProbDist

estimator = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)
lm = NgramModel(5, train, estimator=estimator)

print "len(corpus) = %s, len(vocabulary) = %s, len(train) = %s, len(test) = %s" % ( len(corpus), len(vocabulary), len(train), len(test) )
print "perplexity(test) =", lm.perplexity(test)

我发现非常可疑的是我得到了以下结果:

... build
... train
len(corpus) = 1161192, len(vocabulary) = 13817, len(train) = 1103132, len(test) = 58060
perplexity(test) = 4.60298447026

困惑度为 4.6,似乎 Ngram 建模在该语料库上非常好。如果我的解释是正确的,那么模型应该能够在平均大约 5 次尝试中猜出正确的单词(尽管有 13817 种可能性......)。如果你能分享你对这种困惑的值(value)的经验(我不太相信)?我在网上没有发现任何关于 nltk 的 ngram 模型的投诉(但也许我做错了)。对于 Ngram 模型和计算困惑,您知道 NLTK 的一个很好的替代品吗?

谢谢!

最佳答案

您的困惑度较低,因为您使用的是五角星模型。如果您使用二元模型,您的结果将在更规则的范围内,大约 50-1000(或大约 5 到 10 位)。

根据您的意见,您是否在使用 NLTK-3.0alpha?你不应该,至少不应该用于语言建模:

https://github.com/nltk/nltk/issues?labels=model

事实上,整个 model 模块已经从 NLTK-3.0a4 预发布版中删除,直到问题得到解决。

关于python - NLTK 中的 Ngram 模型和困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com