Gensim - LDA创建文档主题矩阵

时间:2016-03-24 02:14:39

标签: python lda gensim topic-modeling

我正在开发一个项目,我需要将主题建模应用于一组文档,我需要创建一个矩阵:

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)|

2 个答案:

答案 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。