我正在开发一个项目,我需要将主题建模应用于一组文档,我需要创建一个矩阵:
DT,D×T矩阵,其中D是文档数,T是主题数。 DT(ij)包含文档Di中的单词已被分配给主题Tj的次数。
到目前为止,我已经遵循了这个问题:https://rstudio-pubs-static.s3.amazonaws.com/79360_850b2a69980c4488b1db95987a24867a.html
我是gensim的新手,到目前为止我有 1.创建了一个文档列表 2.对文件进行预处理和标记化。 3.使用corpora.Dictionary()创建id->术语词典(id2word) 4.将标记化文档转换为文档术语矩阵
生成了LDA模型。 所以现在我得到了主题。
我现在如何获得我之前提到的矩阵。 我将使用此矩阵来计算关于主题t的2个文档之间的相似性:
sim(a,b)= 1- | DT(a,t) - DT(b,t)|
答案 0 :(得分:1)
显示您的代码会有所帮助,但是如果我们在您链接的教程中脱离示例,那么模型将通过以下方式识别:
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=2, id2word = dictionary, passes=20)
你可以在脚本中添加如下内容:
model_name = "name_of_my_model"
ldamodel.save(model_name)
然后,当您运行它时,这将在运行脚本的同一目录中创建一个模型。
然后你可以通过以下方式获得主题概率分布:
print(ldamodel[doc_bow])
如果你想获得与这个模型的相似性,那么你也需要为查询文档创建一个模型,然后在两者之间获得余弦相似性:
dictionary = corpora.Dictionary.load('dictionary.dict')
corpus = corpora.MmCorpus("corpus.mm")
lda = models.LdaModel.load("name_of_my_model.lda")
index = similarities.MatrixSimilarity(lda[corpus])
index.save("simIndex.index")
docname = "docs/the_doc.txt"
doc = open(docname, 'r').read()
vec_bow = dictionary.doc2bow(doc.lower().split())
vec_lda = lda[vec_bow]
sims = index[vec_lda]
sims = sorted(enumerate(sims), key=lambda item: -item[1])
print sims
答案 1 :(得分:1)
pyLDAvis源代码中有一个实现,它返回可能有助于构建您感兴趣的矩阵的列表。
来自_extract_data
中的gensim.py
方法的小部件:
def _extract_data(topic_model, corpus, dictionary, doc_topic_dists=None):
...
...
...
return {'topic_term_dists': topic_term_dists, 'doc_topic_dists': doc_topic_dists,
'doc_lengths': doc_lengths, 'vocab': vocab, 'term_frequency': term_freqs}
模型的主题数量将是静态的。也许您有兴趣找到T矩阵的文档主题分布。在这种情况下,DxT矩阵将是doc_lengths x doc_topic_dists。