Чтобы поставить мой вопрос в контексте, я хотел бы обучить и проверить/сравнить несколько (нейронных) языковых моделей. Чтобы сосредоточиться на моделях, а не на подготовке данных, я решил использовать корпус Brown из nltk и подготовить модель Ngrams, снабженную nltk, в качестве базовой линии (для сравнения другого LM).
Итак, мой первый вопрос - это фактически поведение модели Ngram nltk, которую я считаю подозрительной. Поскольку код довольно короткий, я вставил его здесь:
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 возможностей...). Если бы вы могли поделиться своим опытом с ценностью этого недоумения (я действительно не верю этому)? Я не нашел никаких претензий на ngram модель nltk в сети (но, возможно, я делаю это неправильно). Знаете ли вы хорошие альтернативы NLTK для моделей Ngram и недоумение в работе?
Спасибо!