Зачем нам нужны тематические модели?

Одна из самых простых проблем обработки естественного языка - это понимание большого количества текстовых данных. Имеет ли смысл смысл? В противном случае представьте себя предпринимателем, который хочет создать следующий большой продукт. После месяцев напряженной работы бета-версия вышла и открыта для клиентов. Вы создали форум, где люди могут рассказать, что им нравится в продукте, а что нет.
В первый день 312 человек написали, что думают о продукте. Итак, вы сели со своей командой и начали анализировать комментарии / обзоры.

Людям понравился продукт. Однако некоторые люди поначалу сочли, что навигация по приложению была немного сложной. Кроме того, некоторые люди считали, что должна быть возможность добавить изображение ко всему, что они пишут о себе. Но люди в основном говорили положительные вещи. Ваше здоровье . Теперь это стало повседневным занятием. Люди будут писать обзоры, а ваша команда будет читать и анализировать области, которые нужно улучшить. Что ж, поскольку этот продукт является следующим большим продуктом, количество пользователей приложения росло в геометрической прогрессии, и вскоре стало невозможно читать обзоры вручную. Именно здесь вы начали искать способ, при котором вам не нужно читать все комментарии, и вы все равно сможете получить то, о чем люди говорят в этих миллионах комментариев.

Что такое тематические модели

Тематические модели - это ветвь машинного обучения, применяемая к НЛП, которая используется для определения абстрактных тем, встречающихся в большом наборе документов. В приведенном выше примере ожидается, что тематическая модель расскажет, какие важные проблемы обсуждаются в миллионах отзывов, которые люди пишут о продукте. Чтобы вы могли иметь общее представление о насущных проблемах, связанных с продуктом, примерно так ...

Алгоритмы для тематических моделей

Одной из первых тематических моделей был вероятностный скрытый семантический анализ (PLSA), созданный Томасом Хофманном в 1999 году. Другие алгоритмы для моделирования темы:

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

Прежде чем пытаться понять, как работает LDA, нам нужно понять важный аспект модели, а именно то, что это генеративная модель. Хорошо, вы, наверное, задаетесь вопросом, что такое генеративные модели.
Есть два типа моделей:

  • Генеративные модели
  • Дискриминационные модели

Дискриминационные модели смотрят на данные и пытаются смоделировать границу между классами, находя функцию, которая сопоставляет данные с соответствующими классами. Эти модели не заботятся о том, почему данные именно такие. Например: деревья решений, логистическая регрессия.

Генеративные модели немного отличаются. Обычно генеративные модели постулируют статистическую структуру, которая, как говорят, сгенерировала данные. В этом случае процесс моделирования - это процесс использования данных для соответствия параметрам этой структуры, так что структура, вероятно, сгенерировала данные, которые мы видим.

Интуитивное понимание

Основное предположение LDA состоит в том, что документы могут быть представлены как распределение тем. Итак, определенные документы d можно представить как {Topic 1: 0.8, Topic 2: 0.0, Topic 3: 0.1, Topic 4: 0.1}. Каждая из этих тем, как мы знаем, представляет собой распределение слов, например {w1: 0.5, w2: 0.25, w3: 0.25}. Теперь, чтобы сгенерировать документ из этого распределения тем, мы сначала выбираем случайную тему в соответствии с этими вероятностями (Вполне понятно, что порядок выбора тем будет Тема 1 ›Тема 3 = Тема 4 ››› Тема 2). После того, как мы выбрали нашу тему, мы выбираем слово из этой темы (Опять же, порядок будет следующим: w1 ›w2 = w3). Это дает нам одно слово в нашем документе. Затем мы повторяем этот процесс снова и снова, пока не получим желаемый объем документа.

Техническое понимание

Предположим, у нас есть набор документов S, и мы хотим изучить темы `K` из них.
Алгоритм просматривает каждый документ и случайным образом * присваивает каждому слову в документе одну из K тем.

Это так называемое случайное назначение уже сгенерировало самые начальные распределения тем для всех документов и распределения слов по всем темам.

Ясно, что это задание не будет оптимальным. Чтобы улучшить его, выполняются следующие шаги

Для каждого документа d в S,

для каждого слова w в документе d мы вычисляем следующее: -

  • p (topic (t) | document (d)) = доля слов в документе d, которые в настоящее время присвоены теме t.
  • p (word (w) | topic (t)) = доля назначений теме t по всем документам, которые происходят от этого слова w. (Одно и то же слово может быть в нескольких документах, следовательно, оно распространяется на все документы)

3. p (тема | документ) * p (слово w | тема t) - вероятность того, что слово 'w' принадлежит теме 't'

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

Построение тематической модели на Python

Теперь, когда мы поняли, что такое тематические модели, давайте посмотрим, как мы можем создать их на Python. Gensim отлично подходит для многих задач НЛП. Он имеет быструю и масштабируемую реализацию LDA.

from nltk.tokenize import RegexpTokenizer
from stop_words import get_stop_words
from nltk.stem.porter import PorterStemmer
from gensim import corpora, models
import gensim

tokenizer = RegexpTokenizer(r'\w+')

#Make a list of stopwords
stopwords= get_stop_words('en')

#Initializing the stemmer
stemmer = PorterStemmer()
    
#create a list of all the documents that you have
doc_set = [doc1, doc2, doc3, doc4]

texts = []
#Now we loop through all the documents and preprocess the docs
for i in doc_set:
    #You can follow your own preprocessing steps
    
    raw = i.lower()
    tokens = tokenizer.tokenize(raw)

    #remove stop words
    tokens_cleaned = [i for i in tokens if not i in stopwords]
    
    # stem tokens
    stemmed_tokens = [stemmer.stem(i) for i in tokens_cleaned]
    
    # add tokens to list
    texts.append(stemmed_tokens)

# Assigns an index to each of the terms
dictionary = corpora.Dictionary(texts)
    
# Creates the document-term matrix
corpus = [dictionary.doc2bow(text) for text in texts]

# build LDA model
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=3, id2word = dictionary, passes=20)

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

Чего ждать ? Разве вся повестка дня не была связана с поиском тем?

OK . В нем есть темы, а нет. Позвольте мне объяснить почему.
Типичный вывод тематической модели при печати тем выглядит следующим образом:

['0.141*w1+ 0.080*w2+ 0.080*w3', 
'0.060*w4+ 0.060*w5 + 0.060*w6',
 '0.059*w7 + 0.059*w8 + 0.059*w9']

Это словесное распределение тем. Теперь человек-агент должен посмотреть на распределение слов и дать теме имя. Всегда помните, что все тематические модели представляют собой группу слов для любой конкретной темы и группу тем для любого конкретного документа.