Я попытался воспроизвести вашу проблему, но в моем случае (с использованием очень маленького корпуса) я не мог найти разницы между тремя суммами.
я до сих пор разделяют пути я пытался в случае кто-либо хочет повторить эту проблему ;-)
я использую некоторые небольшой пример с веб-сайта gensim и обучить три различные модели LDA:
from gensim import corpora, models
texts = [['human', 'interface', 'computer'],
['survey', 'user', 'computer', 'system', 'response', 'time'],
['eps', 'user', 'interface', 'system'],
['system', 'human', 'system', 'eps'],
['user', 'response', 'time'],
['trees'],
['graph', 'trees'],
['graph', 'minors', 'trees'],
['graph', 'minors', 'survey']]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
lda_sym = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1,
chunksize =100000, passes=1, alpha='symmetric')
lda_asym = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1,
chunksize =100000, passes=1, alpha='asymmetric')
lda_auto = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1,
chunksize =100000, passes=1, alpha='auto')
Сейчас сумма по теме вероятности для всех документов (9 документов в общей сложности)
counts = {}
for model in [lda_sym, lda_asym, lda_auto]:
s = 0
for doc_n in range(len(corpus)):
s += pd.DataFrame(lda_sym[corpus[doc_n]])[1].sum()
if s < 1:
print('Sum smaller than 1 for')
print(model, doc_n)
counts[model] = s
И действительно суммы всегда являются 9:
counts = {<gensim.models.ldamodel.LdaModel at 0x7ff3cd1f3908>: 9.0,
<gensim.models.ldamodel.LdaModel at 0x7ff3cd1f3048>: 9.0,
<gensim.models.ldamodel.LdaModel at 0x7ff3cd1f3b70>: 9.0}
Конечно, это не типичный пример, так как он настолько мал. Поэтому, если бы вы могли, возможно, предоставили более подробную информацию о вашем корпусе.
В целом я бы предположил, что это всегда должно быть так. Моя первая интуиция, что, возможно, пустые документы изменят сумму, но это тоже не так, так как пустые документы просто дают распределение темы идентичного альфа (который имеет смысл):
pd.DataFrame(lda_asym[[]])[1]
возвращает
0 0.203498
1 0.154607
2 0.124657
3 0.104428
4 0.089848
5 0.078840
6 0.070235
7 0.063324
8 0.057651
9 0.052911
который идентичен
lda_asym.alpha
array([ 0.20349777, 0.1546068 , 0.12465746, 0.10442834, 0.08984802,
0.0788403 , 0.07023542, 0.06332404, 0.057651 , 0.05291085])
который также подводит к 1.
С теоретической точки зрения выбор разных альфов приведет к совершенно другим LDA-моделям.
Альфа - это гиперпараметр для Дирихле. Дирихле - это распределение, из которого мы рисуем тета. И тета становится параметром, определяющим, какова форма распределения тем. Таким образом, альфа влияет на то, как мы рисуем распределение тем.Именно поэтому, выбирая различные альфы также дадут вам немного разные результаты для
lda.show_topics()
Но я не понимаю, почему сумма по вероятности документа должна отличаться от 1 для любой модели LDA или любого вида документа.