python - 使用预先确定的先验初始化 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”不同。
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)]
解决方案
推荐阅读
- java - Java 函数式接口的优点是什么?
- stata - 按年将个人留在同一家公司(Stata)
- php - 图像未保存在文件夹 PHP 中
- excel - 更改日期格式excel
- statistics - Linear_model.LinearRegression() 系数与 Statsmodels model.summary 不同
- kentico - 内容登台 - 缺少文档参考
- tensorflow - Tensorflow 2.0:tf.feature_columns 正在触发 tf.function 回溯警告
- python - 如何在 Flask 和 PyMongo 中迭代集合或列表?
- reactjs - 为什么默认导出的组件在 React JS 中给出 no-undef 错误?
- django - 带有内部连接的 Django 查询