Извлечение темы распределения из модели LDA Gensim - PullRequest
0 голосов
/ 29 августа 2018

Я создал модель LDA для некоторых текстовых файлов, используя пакет gensim в python. Я хочу получить распределение тем для изученной модели. Есть ли какой-либо метод в классе gensim ldamodel или решение, позволяющее получить распределение тем из модели? Например, я использую модель когерентности, чтобы найти модель с наилучшим значением когерентности в зависимости от количества тем в диапазоне от 1 до 5. После получения лучшей модели я использую метод get_document_topics (спасибо kenhbs ), чтобы получить Распределение тем в документе, который использовался для создания модели.

id2word = corpora.Dictionary(doc_terms)

bow = id2word.doc2bow(doc_terms)

max_coherence = -1
best_lda_model = None

for num_topics in range(1, 6):

    lda_model = gensim.models.ldamodel.LdaModel(corpus=bow, num_topics=num_topics)

    coherence_model = gensim.models.CoherenceModel(model=lda_model, texts=doc_terms,dictionary=id2word)

    coherence_value = coherence_model.get_coherence()

    if coherence_value > max_coherence:
        max_coherence = coherence_value
        best_lda_model = lda_model

У лучшего есть 4 темы

print(best_lda_model.num_topics)

4

Но когда я использую get_document_topics, я получаю менее 4 значений для распространения документов.

topic_ditrs = best_lda_model.get_document_topics(bow)

print(len(topic_ditrs))

3

Мой вопрос: для лучшей модели lda с 4 темами (с использованием модели когерентности) для документа, почему get_document_topics возвращает меньше тем для одного и того же документа? почему некоторые темы имеют очень небольшое распространение (менее 1-e8)?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы можете поиграть с параметром минимальной_проблемости и установить для него очень маленькое значение, например, 0,000001.

topic_vector = [ x[1] for x in ldamodel.get_document_topics(new_doc_bow , minimum_probability= 0.0, per_word_topics=False)]
0 голосов
/ 31 августа 2018

Из документации , вы можете использовать два метода для этого.

Если вы хотите получить основные термины в определенной теме, используйте get_topic_terms:

from gensim.model.ldamodel import LdaModel

K = 10
lda = LdaModel(some_corpus, num_topics=K)

lda.get_topic_terms(5, topn=10)
# Or for all topics
for i in range(K):
    lda.get_topic_terms(i, topn=10)

Вы также можете распечатать весь базовый np.ndarray (называемый либо бета, либо фи в стандартных бумагах LDA, размеры (K, V) или (V, K)).

phi = lda.get_topics()

редактировать : По ссылке, которую я включил в исходный ответ: если вы ищете распространение документа по теме, используйте

res = lda.get_document_topics(bow)

Как видно из документации, результирующий объект содержит три следующих списка:

  • list (int, float) - Распределение тем для всего документа. Каждый элемент в списке представляет собой пару идентификатора темы и назначенной ему вероятности.

  • список (int, список (int, float), необязательный - наиболее вероятные темы для каждого слова. Каждый элемент в списке представляет собой пару идентификаторов слова и список тем, отсортированных по их релевантности это слово. Возвращается, только если для per_word_topics было задано значение True.

  • список (int, список с плавающей точкой), необязательный - значения релевантности Phi, умноженные на длину объекта, для каждой комбинации слово-тема. Каждый элемент в списке представляет собой пару идентификатора слова и список значений фи между этим словом и каждой темой. Возвращается, только если для per_word_topics было установлено значение True.

Сейчас

tops, probs = zip(*res[0])

probs будет содержать K (для вас 4) вероятностей. Некоторые могут быть нулевыми, но они должны составлять до 1

...