Machine Learning, Text mining

Использование LDA для тематического моделирования

Время прочтения: 3 мин.

Тематическое моделирование — методы машинного обучения по обработке естественного языка (NLP). Они позволяют понять состав данных, смысл большой коллекции текстовых документов. Один из самых популярных методов тематического моделирования – Латентное размещение Дирихле (LDA).

Метод LDA позволяет определить скрытые (латентные) тематики в тексте, предполагая, что эти темы сформированы на основании вероятности вхождения слова из заданного текста. LDA можно рассматривать как метод «мягкой» кластеризации – текст может относится к той или иной тематике с определённой вероятностью.

Метод LDA применялся нами для анализа проблем с оборудованием и программным обеспечением из большого объема выборки обращений (порядка 400 тысяч) внутренних и внешних клиентов. Реализация алгоритма LDA через модуль Python Gensim заключалась в следующем:

  • Выгрузка обращений из базы данных автоматизированной системы регистрации обращений внешних и внутренних клиентов за период с помощью SQL-запросов, сохранение промежуточных результатов в файлы и последующей загрузкой в dataframe с содержимым вида:
IDВремя регистрОписание
45687412301.02.2020
09:37
Адрес:
Подробное описание проблемы: не работает камера, мутное изображение
45687404510.05.2020
11:04
Адрес:
Подробное описание проблемы: нет возможности произвести снимок, не запускается приложение
  • Предобработка текста поля «Описание» – ключевой этап подготовки к обучению модели. Этап состоит из следующих шагов:

— удаление знаков препинаний, цифр, спецзнаков через регулярные выражения:

patterns = r'[0-9!#№$%&'()*+,\./:;<=>?@\[\]^_`{|}~—\"-]+'
doc = re.sub(patterns, ' ', doc.lower())

— лемматизация через pymorphy2– приведение слов к начальной форме (именительный падеж для существительных, неопределённая форма глаголов):

for token in doc.split():
token = token.strip()
      token = morph.normal_forms(token)[0]

— удаление стоп-слов – предлоги, слова приветствий, наречия, наименования полей запросов – всё то, что не несет для нас ценности при выделении тематик проблем:

if token and token not in stopwords:
            tokens.append(token)
  • Двумя основными входными данными для тематической модели LDA являются словарь слов:
dictionary = Dictionary(text_clean)

и корпус – id слова и частота его встречаемости:

corpus = [dictionary.doc2bow(doc) for doc in text_clean]
  • Обучение модели с разными значениями topics количества скрытых тем num_topics для выявления качественной модели, с расчетом основной метрики качества — когерентности (согласованности) — каждой модели. Чем выше значение согласованности, тем более выраженные темы модель выделяет в тексте описаний:
model=LdaMulticore(corpus=corpus, id2word=dictionary, num_topics=topics, 
random_state=200, workers=4)
coherence_model = CoherenceModel(model=model, texts=text_clean, 
dictionary=dictionary, coherence='c_v')
  • По завершении обучения 18 моделей с различным значением гиперпараметра количества тем (от 2 до 19) модель с 5 темами имела самую большую метрику согласованности 0,68. Для интерпретации полученных результатов используется модуль pyLDAvis:
vis = pyLDAvis.gensim.prepare(model, corpus, dictionary)

Результатом работы pyLDAvis является интерактивная карта набора тем. На карте в правой части располагается топ слов, входящих в тему, а в левой части расположены темы в виде кругов. Темы могут быть как независимыми друг от друга, так и пересекаться, за счет вхождения слов в несколько тематик.

Выделяя один из кругов тем слева, справа видим слова, входящие в эту тему, по которым можем определить, о чем данная тематика. Пример ниже указывает на тему 5, связанную с проблемами в оборудовании – нет изображения с камеры.

Чтобы определить к какой теме относится то или иное обращение из dataframe для последующего анализа, загружаем обученную модель и корпус, подаем на вход текст поля «Описание»:

model=LdaMulticore.load("model_IM_atm.lda")
corp = corpora.BleiCorpus("corpus_IM_atm.lda-c")

df_topic_sents_keywords = format_topics_sentences(ldamodel=model, 
corpus=corp, texts= df['clean_txt'].tolist())

 В итоге, методом тематического моделирования LDA выявлены 5 глобальных тематик жалоб по текстам обращений внутренних и внешних клиентов.

Советуем почитать