首页 > 解决方案 > 使用预先确定的先验初始化 Gensim LDA 模型

问题描述

我想创建一个返回预先确定的主题词分布的 LDA 模型(即 gensim.models.LdaModel 的实例)。这样做的原因是我想利用 Gensim、pyLDAvis 等来显示我从其他算法获得的一些主题词分布的结果。

那可能吗?下面我展示了一些不完整的代码(因为我发现 ML 社区令人生畏):

import gensim
texts=[['a','a','b'], ['a','b','c'],['b','c','c']]
d = gensim.corpora.Dictionary(texts)
bow = [d.doc2bow(doc) for doc in texts]

my_topics=[[2/3, 1/3, 0],[0, 2/3, 1/3]]
model = gensim.models.LdaModel(corpus=bow, id2word=d, num_topics=2, 
        eta=..., alpha..., passes=0, iterations=0, random_state=1)
model.show_topics(num_words=3)
# Hopefully return my_topics above
#[(0, '0.666*"a" + 0.333*"b"'),
# (1, '0.666*"b" + 0.333*"c"')]

我希望通过在 LDA 模型中初始化 eta 并将迭代设置为 0 来实现这一点。在我的尝试中(未显示),结果主题与“my_topics”不同。

Gensim 文档

eta ({float, np.array, str}, 可选) –</p>

单词概率的先验信念,这可以是:

    scalar for a symmetric prior over topic/word probability,
    vector of length num_words to denote an asymmetric user defined probability for each word,
    matrix of shape (num_topics, num_words) to assign a probability for each word-topic combination,
    the string ‘auto’ to learn the asymmetric prior from the data.

编辑:这(在模型状态上调用重置)似乎有效,但我不确定它在理论上是否有意义

model = gensim.models.LdaModel(corpus=bow, id2word=d, num_topics=2, 
    eta=my_topics, alpha=1, passes=0, iterations=0, random_state=1)
model.state.reset()
model.show_topics(num_words=3)
#array([[0.6666667 , 0.33333334, 0.        ],
#   [0.        , 0.6666667 , 0.33333334]], dtype=float32)

但是,给定文档的主题分布没有经过训练,我认为它不能保持主题不变:

model.get_document_topics(bow[2])
model[bow[2]]
#[(0, 0.55569696), (1, 0.44430298)]

标签: pythongensimlda

解决方案


推荐阅读