标签的LDA(gensim)

时间:2016-03-03 16:46:19

标签: python lda gensim

我使用Gensim包进行主题建模。我们的想法是了解flickr标签中的主题。 直到现在我正在使用此代码(文档是标签):

    texts = [[word for word in document.split(";") if word not in stoplist] for document in documents]
    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]
    lda = ldamodel.LdaModel(corpus, id2word=dictionary, alpha = 0.1, num_topics=10)
    topic = []
    for f in lda.print_topics(num_topics=4, num_words=10):
        topic_number = f[0]
        keywords = f[1]
        keywords = keywords.split(" + ")
        keywords_update = {}
        for ii in keywords:
            ii = str(ii)
            keyword = ii[6:]
            probab = ii[0:5]
            probab = float(probab)
            if probab > 0.02:
                keywords_update.update({keyword:probab})
        topic.append(keywords_update)
    print topic

所以基本上我在所有文档上训练LDA,然后为每个主题打印10个最可能的单词。这是对的吗?或者我是否必须在文档的某些部分训练数据,然后使用corpus_lda = lda [corpus]以便将训练好的模型应用于看不见的文档? 如果每次运行模型时结果都不同,是否意味着主题的数量不正确?评估结果的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

每次查询模型时,看不见的文档的概率分布都会发生变化,因为模型中的分类器使用贝叶斯定理的变体statistical inference。 Gensim为您提供了大部分关于从每个主题获取topn单词的工作。

这将返回topic_id的词典:{word:probability},其中包含模型中每个主题的前10个单词。

topn_words = {i: {word: prob for word, prob in lda.show_topic(i, topn=10)} for i in range(0, lda.num_topics)}

当您使用lda[unseen_document]时,它返回一个概率分布向量,该向量是模型中主题数量的大小,其中每个值是文档适合主题对应于主题索引的概率。向量。

一旦你有一组看不见的文件的概率分布向量,你就可以计算它们之间的相似性。 Gensim具有内置的余弦相似性。

bow = dictionary.doc2bow(tokenize(text))
vec_1 = lda[bow]
bow = dictionary.doc2bow(tokenize(text))
vec_2 = lda[bow]
gensim.matutils.cossim(vec_1, vec_2)

在这个例子中,tokenize是一个组合函数,你可以使用内置的Gensim simple_preprocess()方法,或者以其他方式修剪和标记文本。 dictionary.doc2bow()方法需要一个单词列表并输出一包单词或元组列表(word_id,frequency)。