Подтвердить что ты не робот

Распространение документа в Gensim LDA

Я получил модель темы 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 более конкретный) опускаются из вывода.

Мне интересно, связано ли это поведение с некоторыми эстетическими соображениями? И как я могу получить распределение остатка массы вероятности по всем другим темам?

Спасибо за ваш добрый ответ!

4b9b3361

Ответ 1

Прочитайте источник и выяснится, что темы с вероятностями, меньшими порога, игнорируются. Этот порог имеет значение по умолчанию 0,01.

Ответ 2

Я понимаю, что это старый вопрос, но в случае, если кто-то наткнулся на него, вот решение (проблема на самом деле была исправлена ​​в текущей ветке развития с параметром 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 вместо понимания списка (это будет намного быстрее).