#gensim
#gensim
Вопрос:
/Users/Barry /anaconda/lib/python2.7/site-packages/gensim/models/ldaseqmodel.py:217: Предупреждение о времени выполнения: деление на ноль встречается в double_scalars convergence = np.fabs((bound — old_bound) / old_bound)
#dynamic topic model
def run_dtm(num_topics=18):
docs, years, titles = preprocessing(datasetType=2)
#resort document by years
Z = zip(years, docs)
Z = sorted(Z, reverse=False)
years_new, docs_new = zip(*Z)
#generate time slice
time_slice = Counter(years_new).values()
for year in Counter(years_new):
print year,' --- ',Counter(years_new)[year]
print '********* data set loaded ********'
dictionary = corpora.Dictionary(docs_new)
corpus = [dictionary.doc2bow(text) for text in docs_new]
print '********* train lda seq model ********'
ldaseq = ldaseqmodel.LdaSeqModel(corpus=corpus, id2word=dictionary, time_slice=time_slice, num_topics=num_topics)
print '********* lda seq model done ********'
ldaseq.print_topics(time=1)
Привет, ребята, я использую динамические тематические модели в пакете gensim для тематического анализа, следуя этому руководству,https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/ldaseqmodel.ipynb, однако я всегда получал одну и ту же неожиданную ошибку. Кто-нибудь может дать мне некоторые рекомендации? Я действительно озадачен, даже думал, что попробовал какой-то другой набор данных для генерации корпуса и словаря.
Ошибка выглядит следующим образом:
/Users/Barry /anaconda/lib/python2.7/site-packages/gensim/models/ldaseqmodel.py:217: Предупреждение о времени выполнения: деление на ноль встречается в double_scalars convergence = np.fabs((bound — old_bound) / old_bound)
Ответ №1:
np.fabs
Ошибка означает, что возникает ошибка с NumPy. Какие версии NumPy и gensim вы используете?
NumPy больше не поддерживает Python 2.7, а Ldaseq был добавлен в Gensim в 2016 году, поэтому у вас может просто не быть совместимой версии. Если вы перекодируете учебное пособие по Python 3 в вариант 2.7, вы, очевидно, немного понимаете различия в версиях — попробуйте запустить его, скажем, в среде 3.6.8 (вам все равно придется когда-нибудь обновляться, 2020 год — это конец поддержки 2.7 от самого Python). Это могло бы уже помочь, я просмотрел руководство и не сталкивался с этим с моими собственными данными.
При этом я уже сталкивался с такой же ошибкой раньше при запуске LdaMulticore
, и она была вызвана пустым корпусом.
Вместо того, чтобы полностью запускать свой код в функции, можете ли вы попробовать просмотреть его построчно (или посмотреть в журнале уровня отладки) и проверить, обладает ли ваш вывод ожидаемыми свойствами: что, например, ваш корпус не пуст (или содержит пустые документы)?
Если это произойдет, исправьте шаги предварительной обработки и повторите попытку — это, по крайней мере, помогло мне и помогло с той же ошибкой ldamodel в списке рассылки.
PS: не комментирую, потому что у меня нет репутации, не стесняйтесь редактировать это.
Ответ №2:
Это проблема с исходным кодом ldaseqmodel.py. Для последнего пакета gensim(версии 3.8.3) я получаю ту же ошибку в строке 293:
ldaseqmodel.py:293: RuntimeWarning: divide by zero encountered in double_scalars
convergence = np.fabs((bound - old_bound) / old_bound)
Теперь, если вы пройдетесь по коду, вы увидите это:
введите описание изображения здесь
Вы можете видеть, что здесь они делят разницу между bound и old_bound на old_bound (что также видно из предупреждения)
Теперь, если вы проанализируете дальше, вы увидите, что в строке 263 old_bound инициализируется нулем, и это основная причина, по которой вы получаете это предупреждение о том, что встречается деление на ноль.
введите описание изображения здесь
Для получения дополнительной информации я поместил инструкцию print в строку 294:
print('bound = {}, old_bound = {}'.format(bound, old_bound))
Полученный мной результат таков: введите описание изображения здесь
Итак, в одной строке вы получаете это предупреждение из-за исходного кода пакетаldaseqmodel.py не из-за какого-либо пустого документа. Хотя, если вы не удалите пустые документы из своего корпуса, вы получите другое предупреждение. Поэтому я предлагаю, если в вашем корпусе есть какие-либо пустые документы, удалить их и просто игнорировать приведенное выше предупреждение о делении на ноль.