gensim/models/ldaseqmodel.py:217: предупреждение о времени выполнения: деление на ноль встречается в double_scalars

#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 не из-за какого-либо пустого документа. Хотя, если вы не удалите пустые документы из своего корпуса, вы получите другое предупреждение. Поэтому я предлагаю, если в вашем корпусе есть какие-либо пустые документы, удалить их и просто игнорировать приведенное выше предупреждение о делении на ноль.