Тематические модели: скрытое размещение Дирихле

В обработке естественного языка тематические модели являются важными статистическими инструментами для обнаружения скрытых структур в коллекции документов. В этом руководстве мы обсудим тематические модели и LDA (скрытое распределение Дирихле), которое является одной из самых известных и полезных тематических моделей.

Тематические модели -

Начнем с определения некоторых терминов.

Документы: мы будем рассматривать документы как мешки со словами. Например, документ, соответствующий следующему тексту - В вычислительной биологии мы анализируем структуры ДНК и РНК, используя сложные инструменты моделирования. будет [вычислительный, биология, анализировать , ДНК, РНК, структуры, комплекс, моделирование, инструменты]. Обратите внимание, что мы удалили такие стоп-слова, как in, we, using и т. Д.

Тема: тема - это набор слов, которые "семантически" похожи. Например, в приведенном выше тексте есть две темы -

  • Тема 0: [«биология», «ДНК», «РНК», «структуры»]
  • Тема 1: [«вычисления», «анализ», «моделирование», «инструменты»]

Интуитивное значение тем. Учитывая, что документ посвящен определенной теме, мы предполагаем, что некоторые конкретные слова будут появляться в документе чаще. Например - в документах, относящихся к «биологии», такие слова, как «биология», «ДНК», «РНК» будут встречаться чаще, а в документах, относящихся к «вычислениям», такие слова, как «вычислительные», «анализировать», «Симуляция» появлялась бы чаще. Такие слова, как «a», «an», «the» могут встречаться в обоих типах документов.

Условия. Термины могут соответствовать как отдельным словам, так и фразам (н-граммы). В этом уроке мы будем рассматривать их как слова.

Например, пусть наш документ будет… [«вычисление», «биология», «анализ», «ДНК», «РНК», «структуры», «комплекс», «моделирование», «инструменты»]. Если мы рассматриваем слова как термины, то наши термины будут - «вычислительный», «биология» и т. Д., А если мы рассмотрим биграммы как наши термины, то наши термины будут - «вычислительная биология», «анализ биологии», так далее…

Что такое тематические модели. Тематические модели используются для вывода основной тематической структуры в коллекции документов.

Скрытое размещение Дирихле -

LDA - это генеративная вероятностная модель. В LDA мы пытаемся оценить два типа вероятностных распределений.

Первая - это матрица документ-тема (мы визуализируем распределение в виде матрицы). Это описывает распределение по темам данного конкретного документа. Обратите внимание, что в сумме строк этой матрицы получается 1.

Второй - это матрица тема-термин. Это описывает распределение терминов по определенной теме. Строки этой матрицы тоже дают в сумме 1.

Процесс генерации LDA: LDA предполагает, что документы создаются следующим образом:

  1. Выберите уникальный набор терминов. Это словарный запас. Пусть его размер будет V.
  2. Выберите количество документов, D.
  3. Для каждого документа выберите количество терминов для этого документа путем выборки из распределения Пуассона.
  4. Выберите количество тем, K.
  5. Для каждого документа d от 1 до D,
--- Draw a sample of dimension K from a Dirichlet distribution. 
--- The Dirichlet distribution takes in a parameter α (a positive valued vector) and returns a simplex, which is a positive valued vector and sums to 1. [More about Dirichlet distribution in the next section]
--- Assign this sample as the topic-proportion for the document d.

По сути, мы построили матрицу «Документ-Тема» на основе описанного выше процесса.

7. Для каждой темы k от 1 до K,

--- Draw a sample of dimension V from a Dirichlet distribution.
--- Assign this sample as the distribution-over-terms for the topic k.

По сути, мы построили нашу матрицу тема-термин на основе описанного выше процесса.

8. Теперь мы попытаемся сгенерировать документы D из двух вышеупомянутых распределений (матрица документ-тема и матрица тема-термин). Для каждого документа d от 1 до D ,

--- Look at the row corresponding to document d in the Document-Topic matrix. The row corresponds to the topic-proportion of the document d.
--- Sample a topic from this topic-proportion. 
--- Look at the row corresponding to the sampled topic in the Topic-Term matrix. The row corresponds to the distribution-over-terms for the sampled topic.
--- Sample a term from this distribution-over-terms.
--- Repeat until the document d has number of terms which it was set to have (sampled using the Poisson distribution). 

Это процесс генерации, который LDA предполагает для сбора документов. С точки зрения непрофессионала, поскольку мы наблюдали «настоящие» документы, LDA пытается реконструировать и найти набор тем, матрицу «тема-термин» и матрица «документ-тема», которые с наибольшей вероятностью сгенерируют документы, которые у нас есть.

Вышеупомянутый генеративный процесс можно объяснить следующей пластинчатой ​​структурой.

Здесь θ представляет матрицу документ-тема, а ϕ представляет матрицу тема-термин. Z представляет собой тему, выбранную нами из тематических пропорций документа d.

Распределение Дирихле -

Распределение Дирихле - это экспоненциальное семейное распределение по симплексу. Симплекс - это векторы с положительными значениями, сумма которых равна 1. Распределение Дирихле можно математически описать как -

  1. Параметр α управляет средним значением, формой и разреженностью θ.
  2. Пропорции тем для каждого документа - это K размерный Дирихле. Учитывая, что у нас есть K тем.
  3. Распределение терминов по каждой теме - это V -мерный Дирихле. Учитывая, что в нашем словаре есть V терминов.

Чтобы визуализировать эффект α в трехмерном распределении Дирихле, вы можете перейти по следующей ссылке - http://blog.bogatron.net/blog/2014/02/02/visualizing-dirichlet -распространения /

Обучение по свернутой выборке Гиббса -

Неплохо было бы прочитать по этой ссылке стартер о семплировании Гиббса. Теперь предположим, что у нас есть документы D, и мы хотим найти в них скрытую структуру тем. Во-первых, мы выбираем фиксированное количество тем для изучения, K.

У нас есть следующий алгоритм -

  1. Для каждого документа d от 1 до D,
--- Randomly assign each word in the document to one of the K topics.

2. У нас есть исходные (случайные) матрицы документ-тема и тема-термин. Теперь мы хотим их улучшить.

3. Для каждого документа d от 1 до D,

For each word w in the document d, compute - 
    1. P(topic = t | document = d) = (number of words in d that are assigned to topic t + α)/(total number of words in d + number of topics * α)
    
    2. P(word = w | topic = t) = (number of times word w is assigned to topic t across all documents + β)/(total number of words assigned to topic t across all documents + vocabulary size * β)
    3. Here, 0 < α < 1 and 0 < β < 1 are hyper-parameters. Using them can be thought of as similar to L1 regularization. 
    4. Now, we reassign a topic to w, we choose t from the probability distribution = P(topic = t | document = d) x P(word = w | topic = t). This is as per the generative process assumption by LDA.
    5. We repeat the above steps for some number of iterations, after which our topic assignments become steady.

В следующем руководстве мы увидим, как реализовать LDA с нуля на Python. А пока мы просто посмотрим, как использовать очень популярный пакет Python для LDA.

LDA в Python

Вы можете использовать пакет lda из lda-project в Python для выполнения LDA. Это LDA с использованием свернутой выборки Гиббса. Интерфейс этого пакета следует соглашениям, найденным в scikit-learn.

Пример (источник - https://github.com/lda-project/lda), демонстрирующий использование этого пакета -

Установка:

pip install lda

Использование:

>>> import numpy as np
>>> import lda
>>> import lda.datasets
>>> X = lda.datasets.load_reuters()    # X is a Document-Term matrix
>>> vocab = lda.datasets.load_reuters_vocab()    # tuple of all words in the vocabulary
>>> model = lda.LDA(n_topics = 10, n_iter = 1000, random_state = 7)
>>> model.fit(X)    # scikit-learn style
>>> topic_term = model.topic_word_    # Topic-Term matrix
>>> n_top_words = 5    # print 5 words from each topic
>>> for i, topic_dist in enumerate(topic_word):
...     topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1]
...     print('Topic {}: {}'.format(i, ' '.join(topic_words)))

Вывод:

Topic 0: police miami versace cunanan wright
Topic 1: elvis film music fans show
Topic 2: yeltsin president political russian russia
Topic 3: city million art century exhibition
Topic 4: charles prince king royal diana
Topic 5: germany against french war rights
Topic 6: church people years year told
Topic 7: pope mother teresa vatican order
Topic 8: harriman clinton u.s churchill ambassador
Topic 9: died church bernardin life president

Это оно! Если вам понравилась эта статья, дайте мне знать в ответах! В следующий раз я вернусь к реализации LDA на Python с нуля.