С вашей функцией print_top_words()
(как минимум) четыре проблемы.
Первая проблема, которая вызывает вашу текущую проблему, заключается в том, что если model.components_
пусто, тело цикла for не будет выполняться, и ваша функция затем (неявно) вернет None
.
Второе немного более тонкое: если model.components_
НЕ пусто, функция вернет только первое сообщение, затем вернет его и выйдет - что само определение оператора return
: вернуть значение ( или None
, если значение не указано) и выйдите из функции.
Третья проблема заключается в том, что (когда model.components_
не пусто), функция возвращает строку, где вызывающий код, очевидно, ожидает список. Это небольшая ошибка, поскольку строки имеют длину, поэтому цикл for в range(len(topics))
кажется работающим, но len(topics)
, безусловно, не то значение, которое вы ожидаете.
И, наконец, функция имеет очень плохое имя, поскольку она ничего не «печатает» - это может показаться тривиальным по сравнению с первыми тремя проблемами, и это не помешает работе кода (если предположить, что первые три проблемы исправлено), но рассуждение о коде само по себе достаточно сложно, поэтому правильное именование важно , поскольку оно значительно снижает когнитивную нагрузку и облегчает обслуживание / отладку.
Короче говоря, подумайте о том, что вы действительно хотите, чтобы эта функция выполняла, и исправьте ее соответствующим образом. Я не буду публиковать здесь «исправленную» версию, поскольку не знаю наверняка, что вы пытаетесь сделать, но приведенные выше примечания должны помочь.
NB: также вы дважды вызываете doc_distr = lda.fit_transform(tf)
и print_top_words(lda, tf_feature_names, n_top_words)
с одинаковыми аргументами, что является либо абсолютно бесполезным, и пустой тратой циклов процессора (в лучшем случае), или запахом еще одной ошибки если вы получите другие результаты от второго звонка.