Весь ваш код верен, но я думаю, что ваши ожидания от моделирования LDA могут быть немного неверными. То, что вы получили, является правильным!
Во-первых, вы использовали фразу "topi c name"; темы, которые генерирует LDA, не имеют имен, и у них нет простого сопоставления с метками данных, используемых для обучения модели. Это неконтролируемая модель, и часто вы обучаете LDA данным, на которых нет меток. Если ваш корпус содержит документы, принадлежащие классам A, B, C, D, и вы обучаете модель LDA выводить четыре темы L, M, N, O, из этого НЕ следует, что существует какое-то отображение, подобное:
A -> M
B -> L
C -> O
D -> N
Во-вторых, будьте осторожны с разницей между токенами и темами в выводе. Вывод LDA выглядит примерно так:
Topi c 1: 0,5 - 0,005 * "token_13" + 0,003 * "token_204" + ...
Topi c 2: 0,07 - 0.01 * "token_24" + 0.001 * "token_3" + ...
Другими словами, каждому документу дается вероятность принадлежности к каждой из тем. И каждый топи c состоит из суммы каждого жетона корпуса, взвешенного каким-либо образом для однозначного определения топи c.
Существует соблазн взглянуть на самые тяжело взвешенные жетоны в каждой топи c и интерпретировать темы как класс. Например:
# If you have:
topic_1 = 0.1*"dog" + 0.08*"cat" + 0.04*"snake"
# It's tempting to name topic_1 = pets
Но это очень сложно проверить и сильно зависит от интуиции человека. Более распространенное использование LDA - когда у вас нет меток, и вы хотите определить, какие документы семантически похожи друг на друга, без необходимости определения правильной метки класса для документов.