2013-05-12 13 views
12

Aby umieścić moje pytanie w kontekście, chciałbym szkolić i testować/porównywać kilka (neuronowych) modeli językowych. Aby skupić się raczej na modelach niż na przygotowywaniu danych, zdecydowałem się użyć korpusu Browna z nltk i wyszkolić model Ngrams dostarczony z nltk jako linię podstawową (aby porównać inne LM z).Model i zakłopotanie Ngrama w NLTK

Moje pierwsze pytanie dotyczy zachowania modelu Nltk, który uważam za podejrzany. Ponieważ kod jest dość krótka ja wklejony tutaj:

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) 

Co znajdę bardzo podejrzane jest to, że otrzymujemy następujące wyniki:

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

Z zakłopotaniem 4,6 wydaje modelowanie Ngram jest bardzo dobrze na tym korpusie. Jeśli moja interpretacja jest prawidłowa, model powinien być w stanie odgadnąć poprawne słowo średnio w przybliżeniu 5 prób (chociaż istnieje 13817 możliwości ...). Gdybyś mógł podzielić się swoim doświadczeniem na temat wartości tego zakłopotania (naprawdę w to nie wierzę)? Nie znalazłem żadnych skarg na ngram modelu nltk w sieci (ale może robię to źle). Czy znasz dobre alternatywy dla NLTK dla modeli Ngram i kłopot komputerowy?

Dzięki!

+3

Wygląda na to, że implementacja ngrams w NLTK jest zła. SRILM (http://www.speech.sri.com/projects/srilm/) wywołuje zdumienie ~ 150 (o wiele bardziej wiarygodne). Mimo to, biorąc pod uwagę popularność NLTK, jestem zaskoczony, że nikt tego wcześniej nie doświadczył ... – zermelozf

Odpowiedz

3

Otrzymujesz niski zakłopotanie, ponieważ używasz modelu pentagramu. Jeśli użyjesz modelu bigramu, twoje wyniki będą w bardziej regularnych zakresach około 50-1000 (lub około 5 do 10 bitów).

Biorąc pod uwagę twoje komentarze, czy używasz NLTK-3.0alpha? Nie powinna, przynajmniej nie do modelowania języka:

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

W rzeczywistości, cały moduł model został usunięty z NLTK-3.0a4 przedpremierowych aż kwestie są ustalone.

+0

Mimo to, zakłopotanie 4 na brązowym korpusie przy użyciu 5 gramów nie jest w ogóle realistyczne. Czy ktokolwiek jest w stanie odtworzyć ten wynik? Wydaje mi się, że n-gramowa implementacja jest wadliwa lub jest coś, czego nie dostaję. – zermelozf

+0

hmm, używasz NLTK2.0 lub 3.0? Zobacz moją "ekstra" odpowiedź powyżej. – fnl