Модель Ngram и недоумение в NLTK

Чтобы поставить мой вопрос в контекст, я хотел бы обучить и протестировать/сравнить несколько (нейронных) языковых моделей. Чтобы сосредоточиться на моделях, а не на подготовке данных, я решил использовать корпус Брауна из 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 и вычислительной сложности?

Спасибо!


person zermelozf    schedule 12.05.2013    source источник
comment
Кажется, что реализация ngrams в NLTK неверна. SRILM (speech.sri.com/projects/srilm) дает недоумение ~ 150 (гораздо более достоверно). Тем не менее, учитывая популярность NLTK, я удивлен, что никто не сталкивался с этим раньше...   -  person zermelozf    schedule 22.06.2013


Ответы (1)


Вы получаете низкое недоумение, потому что используете модель пентаграммы. Если вы будете использовать модель биграммы, ваши результаты будут в более регулярных диапазонах около 50-1000 (или от 5 до 10 бит).

Учитывая ваши комментарии, вы используете NLTK-3.0alpha? Вы не должны, по крайней мере, не для языкового моделирования:

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

Фактически, весь модуль model был исключен из предварительной версии NLTK-3.0a4 до тех пор, пока проблемы не будут устранены.

person fnl    schedule 28.06.2014
comment
Тем не менее недоумение 4 на коричневом корпусе с использованием 5-граммов вообще нереально. Кто-нибудь может воспроизвести этот результат? Мне кажется, что реализация n-gram ошибочна или я чего-то не понимаю. - person zermelozf; 28.06.2014
comment
хм, вы используете NLTK2.0 или 3.0? Смотрите мой дополнительный ответ выше. - person fnl; 30.06.2014