私の質問をコンテキストに入れるために、いくつかの (ニューラル) 言語モデルをトレーニングし、テスト/比較したいと思います。データの準備ではなくモデルに集中するために、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
perplexity が 4.6 の場合、Ngram モデリングはそのコーパスで非常に優れているようです。私の解釈が正しければ、モデルは平均して約 5 回の試行で正しい単語を推測できるはずです (ただし、13817 の可能性があります...)。この当惑の価値について、あなたの経験を共有していただけませんか (私は本当に信じていません)? ネット上で nltk の ngram モデルに関する苦情は見つかりませんでした (しかし、私のやり方が間違っているのかもしれません)。Ngram モデルとコンピューティングの困惑のための NLTK の優れた代替手段を知っていますか?
ありがとう!