Понимание реализации 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 tutorial, но это не очень помогло.

Спасибо.

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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/

Ответ 3

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

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

Надеюсь, это поможет!

Ответ 4

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

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

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): Создание Article Corpus из простого дампа Wikipedia

Часть 2

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

Слово облако (10 слов) из нескольких тем, которые я получил в качестве результата. введите описание изображения здесь