如何使用gensim LDA获取文档的完整主题分布?

15
当我这样训练我的lda模型时:
dictionary = corpora.Dictionary(data)
corpus = [dictionary.doc2bow(doc) for doc in data]
num_cores = multiprocessing.cpu_count()
num_topics = 50
lda = LdaMulticore(corpus, num_topics=num_topics, id2word=dictionary, 
workers=num_cores, alpha=1e-5, eta=5e-1)

我希望能够获得每个文档在所有num_topics下的完整主题分布。也就是说,在这种情况下,我希望每个文档都有50个主题对分布做出贡献,而且我想要能够访问所有50个主题的贡献。如果严格遵循LDA的数学原理,这就是LDA应该做的输出。但是,gensim只会输出超过一定阈值的主题,如这里所示。例如,如果我尝试
lda[corpus[89]]
>>> [(2, 0.38951721864890398), (9, 0.15438596408262636), (37, 0.45607443684895665)]

这个问题是关于只显示对文档89有最大贡献的3个主题。我已经尝试了上面链接中提供的解决方案,但对我没有用。我仍然得到相同的输出:

theta, _ = lda.inference(corpus)
theta /= theta.sum(axis=1)[:, None]

生成相同的输出,即每个文档仅有2、3个主题。

我的问题是如何更改此阈值,以便我可以访问每个文档的完整主题分布?我如何访问完整的主题分布,无论主题对文档的贡献多么微不足道?我想要完整的分布的原因是为了能够在文档之间的KL相似度搜索中执行操作。

提前致谢


您只能看到文档89的三个主题,因为没有其他主题与文档89相关联。请注意,在您的示例中,主题的概率总和为1。 - Harshit Mehta
2个回答

13

似乎还没有人回复,所以我会尽我最大的努力来回答这个问题,根据gensim 文档 提供的信息。

看起来你需要在训练模型时设置一个参数minimum_probability为0.0才能获得所需的结果:

lda = LdaMulticore(corpus=corpus, num_topics=num_topics, id2word=dictionary, workers=num_cores, alpha=1e-5, eta=5e-1,
              minimum_probability=0.0)

lda[corpus[233]]
>>> [(0, 5.8821799358842424e-07),
 (1, 5.8821799358842424e-07),
 (2, 5.8821799358842424e-07),
 (3, 5.8821799358842424e-07),
 (4, 5.8821799358842424e-07),
 (5, 5.8821799358842424e-07),
 (6, 5.8821799358842424e-07),
 (7, 5.8821799358842424e-07),
 (8, 5.8821799358842424e-07),
 (9, 5.8821799358842424e-07),
 (10, 5.8821799358842424e-07),
 (11, 5.8821799358842424e-07),
 (12, 5.8821799358842424e-07),
 (13, 5.8821799358842424e-07),
 (14, 5.8821799358842424e-07),
 (15, 5.8821799358842424e-07),
 (16, 5.8821799358842424e-07),
 (17, 5.8821799358842424e-07),
 (18, 5.8821799358842424e-07),
 (19, 5.8821799358842424e-07),
 (20, 5.8821799358842424e-07),
 (21, 5.8821799358842424e-07),
 (22, 5.8821799358842424e-07),
 (23, 5.8821799358842424e-07),
 (24, 5.8821799358842424e-07),
 (25, 5.8821799358842424e-07),
 (26, 5.8821799358842424e-07),
 (27, 0.99997117731831464),
 (28, 5.8821799358842424e-07),
 (29, 5.8821799358842424e-07),
 (30, 5.8821799358842424e-07),
 (31, 5.8821799358842424e-07),
 (32, 5.8821799358842424e-07),
 (33, 5.8821799358842424e-07),
 (34, 5.8821799358842424e-07),
 (35, 5.8821799358842424e-07),
 (36, 5.8821799358842424e-07),
 (37, 5.8821799358842424e-07),
 (38, 5.8821799358842424e-07),
 (39, 5.8821799358842424e-07),
 (40, 5.8821799358842424e-07),
 (41, 5.8821799358842424e-07),
 (42, 5.8821799358842424e-07),
 (43, 5.8821799358842424e-07),
 (44, 5.8821799358842424e-07),
 (45, 5.8821799358842424e-07),
 (46, 5.8821799358842424e-07),
 (47, 5.8821799358842424e-07),
 (48, 5.8821799358842424e-07),
 (49, 5.8821799358842424e-07)]

将 eval_every 设置为 None 会有什么后果?不进行困惑度估计会影响模型训练或参数估计吗? - PleaseHelp
@PleaseHelp 当你激活 logging.setLevel('DEBUG') 时,将 eval_every 设置为1是有用的,因为它会提供有关算法收敛状态的信息。请参见 https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/lda_training_tips.ipynb 了解更多信息。 - Malik Koné

5

如果有人需要帮助:

在训练完LDA模型后,如果你想获取一个文档的所有主题,而不限制下限阈值,你应该在调用get_document_topics方法时将minimum_probability设置为0。

ldaModel.get_document_topics(bagOfWordOfADocument, minimum_probability=0.0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接