17

我使用玩具语料库导出了 LDA 主题模型,如下所示:

documents = ['Human machine interface for lab abc computer applications',
             'A survey of user opinion of computer system response time',
             'The EPS user interface management system',
             'System and human system engineering testing of EPS',
             'Relation of user perceived response time to error measurement',
             'The generation of random binary unordered trees',
             'The intersection graph of paths in trees',
             'Graph minors IV Widths of trees and well quasi ordering',
             'Graph minors A survey']

texts = [[word for word in document.lower().split()] for document in documents]
dictionary = corpora.Dictionary(texts)

id2word = {}
for word in dictionary.token2id:    
    id2word[dictionary.token2id[word]] = word

我发现当我使用少量主题来推导模型时,Gensim 会生成一份完整的测试文档所有潜在主题的主题分布报告。例如:

test_lda = LdaModel(corpus,num_topics=5, id2word=id2word)
test_lda[dictionary.doc2bow('human system')]

Out[314]: [(0, 0.59751626959781134),
(1, 0.10001902477790173),
(2, 0.10001375856907335),
(3, 0.10005453508763221),
(4, 0.10239641196758137)]

但是当我使用大量主题时,报告不再完整:

test_lda = LdaModel(corpus,num_topics=100, id2word=id2word)

test_lda[dictionary.doc2bow('human system')]
Out[315]: [(73, 0.50499999999997613)]

在我看来,概率小于某个阈值的主题(我观察到 0.01 更具体)在输出中被省略了。

我想知道这种行为是否是出于某种审美考虑?我怎样才能得到概率质量残差在所有其他主题上的分布?

谢谢你的好意回答!

4

2 回答 2

8

阅读源代码,发现概率小于阈值的主题会被忽略。此阈值的默认值为 0.01。

于 2013-10-23T00:26:22.150 回答
8

我意识到这是一个老问题,但万一有人偶然发现它,这里有一个解决方案(这个问题实际上已经在当前的开发分支中修复了一个minimum_probability参数,LdaModel但也许你正在运行旧版本的 gensim)。

定义一个新函数(这只是从源代码中复制的)

def get_doc_topics(lda, bow):
    gamma, _ = lda.inference([bow])
    topic_dist = gamma[0] / sum(gamma[0])  # normalize distribution
    return [(topicid, topicvalue) for topicid, topicvalue in enumerate(topic_dist)]

上述函数不会根据概率过滤输出主题,而是会输出所有主题。如果您不需要(topic_id, value)元组而只需要值,则只需返回topic_dist而不是列表理解(它也会快得多)。

于 2015-09-18T12:22:05.347 回答