Gensim Тема Моделирование с недоразумением Маллет - PullRequest
1 голос
/ 21 марта 2019

Я занимаюсь моделированием названий и тем книги Гарвардской библиотеки.

Я использую Gensim Mallet Wrapper для моделирования с LDA Маллета. Когда я пытаюсь получить значения Coherence и Perplexity, чтобы увидеть, насколько хороша модель, растерянность не рассчитывается, за исключением следующих случаев. Я не получаю ту же ошибку, если я использую встроенную модель LDA от Gensim вместо Mallet. В моем корпусе хранится более 7 миллионов документов длиной до 50 слов, что в среднем составляет 20. Таким образом, документы короткие.

Ниже приведена соответствующая часть моего кода:

# TOPIC MODELING

from gensim.models import CoherenceModel
num_topics = 50

# Build Gensim's LDA model
lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,
                                       id2word=id2word,
                                       num_topics=num_topics,
                                       random_state=100,
                                       update_every=1,
                                       chunksize=100,
                                       passes=10,
                                       alpha='auto',
                                       per_word_topics=True)

# Compute Perplexity
print('\nPerplexity: ', lda_model.log_perplexity(corpus))  
# a measure of how good the model is. lower the better.

Недоумение: -47,91929228302663

# Compute Coherence Score
coherence_model_lda = CoherenceModel(model=lda_model, 
texts=data_words_trigrams, dictionary=id2word, coherence='c_v')
coherence_lda = coherence_model_lda.get_coherence()
print('\nCoherence Score: ', coherence_lda)

Оценка когерентности: 0,28852857563541856

LDA давало оценки без проблем. Теперь я моделирую ту же сумку слов с MALLET

# Building LDA Mallet Model
mallet_path = '~/mallet-2.0.8/bin/mallet' # update this path
ldamallet = gensim.models.wrappers.LdaMallet(mallet_path, 
corpus=corpus, num_topics=num_topics, id2word=id2word)

# Convert mallet to gensim type
mallet_model = 
gensim.models.wrappers.ldamallet.malletmodel2ldamodel(ldamallet)

# Compute Coherence Score
coherence_model_ldamallet = CoherenceModel(model=mallet_model, 
texts=data_words_trigrams, dictionary=id2word, coherence='c_v')
coherence_ldamallet = coherence_model_ldamallet.get_coherence()
print('\nCoherence Score: ', coherence_ldamallet)

Оценка когерентности: 0,5994123896865993

Затем я запрашиваю значения недоумения и получаю предупреждения ниже и значение NaN.

# Compute Perplexity
print('\nPerplexity: ', mallet_model.log_perplexity(corpus))

/ приложение / приложение-PY3 / Библиотека / python3.5 / сайт-пакеты / gensim / модели / ldamodel.py: 1108: RuntimeWarning: недопустимое значение в кратном счете + = np.sum ((self.eta - _lambda) * Elogbeta)

недоумение: nan

/ приложение / приложение-PY3 / Библиотека / python3.5 / сайт-пакеты / gensim / модели / ldamodel.py: 1109: RuntimeWarning: недопустимое значение в баллах вычитания + = np.sum (gammaln (_lambda) - gammaln (self.eta))

Я понимаю, что это очень специфический вопрос Генсима и требует более глубокого знания этой функции: gensim.models.wrappers.ldamallet.malletmodel2ldamodel (ldamallet)

Следовательно, я был бы признателен за любые комментарии по поводу предупреждений и домена Gensim.

1 Ответ

0 голосов
/ 02 июля 2019

Я не думаю, что функция недоумения реализована для оболочки Маллета. Как упоминалось в Radims answer , недоумение отображается на стандартный вывод:

AFAIR, Маллет показывает растерянность - вам этого будет достаточно? Захват этих значений программным способом также возможен, но я не рассматривал это. Надеюсь, у Маллета есть некоторый API-вызов для недоумения, но он, конечно, не включен в оболочку.

Я только что запустил его на выборочном корпусе, и LL / токен действительно печатался каждые столько итераций:

LL / токен: -9.45493

недоумение = 2 ^ (- LL / токен) = 701,81

...