2013-05-12 12 views
12

Soruyu içeriğe koymak için birkaç (yapay) dil modelini eğitmek ve test etmek/karşılaştırmak istiyorum. Veri hazırlama yerine modellere odaklanmak için, nltk'den Brown corpus'u kullanmayı ve nltk ile sağlanan Ngrams modelini bir temel olarak (diğer LM'yi karşılaştırmak için) eğitmeyi seçtim.NLTK'da Ngram modeli ve şaşkınlık

Bu yüzden benim ilk sorum, şüpheli bulduğum Nltk Ngram modelinin davranışı hakkındadır. kod Burayı yapıştırılan oldukça kısa olduğu için: Ngram modelleme çok olan 4.6'lık bir şaşkınlıkla ile

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

görünüyor:

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) 

Ne çok şüpheli buluyorum ben şu sonuçları elde ediyoruz Bu corpus üzerinde iyi. Benim yorumum doğruysa, model, ortalama olarak yaklaşık 5 denemede doğru kelimeyi tahmin edebilmelidir (13817 olasılık olsa da ...). Deneyiminizi bu şaşkınlığın değeri üzerine paylaşabilirseniz (gerçekten buna inanmıyorum)? Net üzerinde nltk ngram modeli hakkında herhangi bir şikayet bulamadım (ama belki yanlış yaptım). Ngram modelleri ve bilgisayar şaşkınlığı için NLTK için iyi bir alternatif biliyor musunuz?

Teşekkürler!

+3

NLTK'de ngramların uygulanmasının yanlış olduğu görülmektedir. SRILM (http://www.speech.sri.com/projects/srilm/) ~ 150 (çok daha güvenilir) bir şaşkınlık verir. Yine de, NLTK'nın popülaritesi göz önüne alındığında, hiç kimsenin bunu daha önce deneyimlemediğine şaşıyorum ... – zermelozf

cevap

3

Bir pentagram modeli kullandığınız için düşük bir karışıklığa maruz kalıyorsunuz. Bir bigram modeli kullanırsanız, sonuçlarınız yaklaşık 50-1000 (veya yaklaşık 5 ila 10 bit) daha düzenli aralıklarda olacaktır.

Yorumlarınız için NLTK-3.0alpha kullanıyor musunuz? En az değil dil modelleme için, olmamalı: Sorunlarınız çözülene kadar Nitekim olarak

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

, tüm model modül NLTK-3.0a4 ön sürümden bırakıldı.

+0

Yine de, 5 gramlık kahverengi cisimdeki 4'lük bir şaşırtıcılık hiç de gerçekçi değildir. Bu sonucu yeniden üretebilen var mı? Bana öyle geliyor ki, n-gram uygulaması kusurlu ya da almadığım bir şey var. – zermelozf

+0

hmm, NLTK2.0 veya 3.0 kullanıyor musunuz? Yukarıdaki "ekstra" cevabımı görün. – fnl

İlgili konular