Понимание реализации LDA с использованием gensim

Я пытаюсь понять, как пакет gensim в Python реализует скрытое распределение Дирихле. Я делаю следующее:

определить набор данных

documents = ["Apple is releasing a new product", 
             "Amazon sells many things",
             "Microsoft announces Nokia acquisition"]             

после удаления стоп-слов, я создаю словарь и корпус:

texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

затем я определяю модель LDA.

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, update_every=1, chunksize=10000, passes=1)

затем я печатаю темы:

>>> lda.print_topics(5)
['0.181*things + 0.181*amazon + 0.181*many + 0.181*sells + 0.031*nokia + 0.031*microsoft + 0.031*apple + 0.031*announces + 0.031*acquisition + 0.031*product', '0.077*nokia + 0.077*announces + 0.077*acquisition + 0.077*apple + 0.077*many + 0.077*amazon + 0.077*sells + 0.077*microsoft + 0.077*things + 0.077*new', '0.181*microsoft + 0.181*announces + 0.181*acquisition + 0.181*nokia + 0.031*many + 0.031*sells + 0.031*amazon + 0.031*apple + 0.031*new + 0.031*is', '0.077*acquisition + 0.077*announces + 0.077*sells + 0.077*amazon + 0.077*many + 0.077*nokia + 0.077*microsoft + 0.077*releasing + 0.077*apple + 0.077*new', '0.158*releasing + 0.158*is + 0.158*product + 0.158*new + 0.157*apple + 0.027*sells + 0.027*nokia + 0.027*announces + 0.027*acquisition + 0.027*microsoft']
2013-12-03 13:26:21,878 : INFO : topic #0: 0.181*things + 0.181*amazon + 0.181*many + 0.181*sells + 0.031*nokia + 0.031*microsoft + 0.031*apple + 0.031*announces + 0.031*acquisition + 0.031*product
2013-12-03 13:26:21,880 : INFO : topic #1: 0.077*nokia + 0.077*announces + 0.077*acquisition + 0.077*apple + 0.077*many + 0.077*amazon + 0.077*sells + 0.077*microsoft + 0.077*things + 0.077*new
2013-12-03 13:26:21,880 : INFO : topic #2: 0.181*microsoft + 0.181*announces + 0.181*acquisition + 0.181*nokia + 0.031*many + 0.031*sells + 0.031*amazon + 0.031*apple + 0.031*new + 0.031*is
2013-12-03 13:26:21,881 : INFO : topic #3: 0.077*acquisition + 0.077*announces + 0.077*sells + 0.077*amazon + 0.077*many + 0.077*nokia + 0.077*microsoft + 0.077*releasing + 0.077*apple + 0.077*new
2013-12-03 13:26:21,881 : INFO : topic #4: 0.158*releasing + 0.158*is + 0.158*product + 0.158*new + 0.157*apple + 0.027*sells + 0.027*nokia + 0.027*announces + 0.027*acquisition + 0.027*microsoft
>>> 

Я не в состоянии понять многое из этого результата. Это обеспечение с вероятностью появление каждого слова? Кроме того, что означает тема № 1, Тема № 2 и т. д.? Я ожидал чего-то более или менее похожего на самые важные ключевые слова.

Я уже проверил gensim учебник но это не очень помогло.

спасибо.

4 ответов


ответ, который вы ищете в gensim учебник. lda.printTopics(k) принты самым способствуя слов k произвольно выбранные темы. Можно предположить, что это (частично) распределение слов по каждой из заданных тем, что означает вероятность появления этих слов в теме слева.

обычно один будет запускать LDA на большом корпусе. Запуск LDA на смехотворно маленькой выборке не даст лучших результатов.


Я думаю, что этот учебник поможет вам понять все очень ясно -https://www.youtube.com/watch?v=DDq3OVp9dNA

Я тоже столкнулся с множеством проблем, понимая это сначала. Я постараюсь изложить несколько моментов, в двух словах.

В Скрытом Распределении Дирихле,

  • порядок слов не важен в модели документа-мешка слов.
  • A документ распределение по темы
  • каждого темы, в свою очередь, это распределение по слова принадлежность к словарю
  • LDA является вероятностная генеративная модель. Он используется для вывода скрытых переменных с использованием заднего распределения.

представьте себе процесс создания документа, чтобы быть чем-то вроде этого -

  1. выберите распределение по темам
  2. создать тему - и выберите слово из темы. Повторите это для каждой из тем

LDA как бы отступает по этой линии-учитывая, что у вас есть мешок слов, представляющих документ, какие темы он представляет ?

Итак, в вашем случае первая тема (0)

INFO : topic #0: 0.181*things + 0.181*amazon + 0.181*many + 0.181*sells + 0.031*nokia + 0.031*microsoft + 0.031*apple + 0.031*announces + 0.031*acquisition + 0.031*product

больше things , amazon и many как они имеют более высокую долю и не так много о microsoft или apple который значительно ниже значение.

Я бы предложил прочитать этот блог для лучшего понимания ( Эдвин Чен-гений! ) - http://blog.echen.me/2011/08/22/introduction-to-latent-dirichlet-allocation/


поскольку вышеуказанные ответы были опубликованы, теперь есть некоторые очень хорошие инструменты визуализации для получения интуиции LDA с помощью gensim.

взгляните на пакет pyLDAvis. Вот великий ноутбук обзор. И вот очень полезно видео-описание ориентирован на конечного пользователя (9 мин учебник).

надеюсь, что это помогает!


для понимания использования реализации gensim LDA я недавно написал блог-сообщения, реализующие моделирование темы с нуля на 70 000 простых Вики-статей в Python.

здесь есть подробное объяснение того, как LDA gensim может использоваться для моделирования темы. Можно найти использование

ElementTree library for extraction of article text from XML dumped file.
Regex filters to clean the articles.
NLTK stop words removal & Lemmatization
LDA from gensim library

надеюсь, что это поможет понять реализацию LDA пакета gensim.

часть 1

Тема Моделирование (Часть 1): создание корпуса статей из простого дампа Википедии

часть 2

тема моделирования (Часть 2): обнаружение тем из статей со скрытым распределением Дирихле

облако слов (10 слов) из нескольких тем, которые я получил в результате. enter image description here