От предварительно обученных вложений к иерархической кластеризации

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

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

Сильные стороны этого подхода в том, что каждая тема определяется отдельными словами или токенами в корпусе. Таким образом, этот подход позволяет нам назначить более одной темы для данного документа, если в документе присутствует достаточно токенов для каждой темы, чтобы получить достаточно высокую вероятность. Например, предположим, что наша тематическая модель узнала, что такие токены, как «пароль, логин и доступ», тесно связаны с темой, которую мы помечаем как «Проблемы со входом», тогда как такие токены, как «клиент, сервис и представитель», тесно связаны со второй темой. тему мы называем «Жалобы на обслуживание клиентов».

Теперь давайте предположим, что мы рассматриваем следующий комментарий клиента:

«У меня были проблемы со входом в систему и доступом к [моей] учетной записи, поэтому [я] позвонил в службу поддержки, и мне пришлось долго ждать, чтобы решить проблему».

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

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

Например, предположим, что вы управляете детским садом, где вы собираете отзывы родителей о концепциях, которые они хотят, чтобы их дети изучали в своей повседневной деятельности. Возможно, вы обнаружите, что некоторые родители говорят о важности «развития социальных навыков», тогда как другие родители говорят о «социализации».

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

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

В оставшейся части этой статьи я исследую один из способов преодоления двух основных ограничений применения LDA в тематическом анализе. А именно, потребность в большом количестве данных и невозможность учета контекста. В следующих разделах я представлю решение, в котором используются преимущества предварительно обученных вложений слов и иерархической кластеризации, чтобы охватить больше контекстно-зависимых тем, которые можно осмысленно изучить из небольших наборов данных. Вперед и вверх!

Проблема

Недавно я столкнулся с этой проблемой, когда хотел сгруппировать новостные статьи в значимые группы, но у меня было менее 200 текстов для работы. Кроме того, тексты включали семантически похожие термины, такие как «данные, наука, машина и обучение», и я искал решение темы, которое могло бы по-прежнему идентифицировать темы в рамках семантически схожих терминов, а не объединять «науку о данных» в один термин. тему и «машинное обучение» в другую.

Другими словами, мне нужна была более семантическая модель для группировки текстов, чем позволяла бы традиционная LDA. Я исследовал более контекстно-зависимые подходы к использованию LDA, такие как lda2vec, подробно описанные здесь.

Подход lda2vec действительно представляет собой сложную реализацию LDA, которая объединяет векторы слов с векторами документов для обучения более контекстно-зависимой тематической модели. Однако недостатком является то, что, поскольку модель использует векторные представления и объединяет архитектуры нейронных сетей, количество обучаемых параметров значительно увеличивается по сравнению с более традиционным подходом LDA. В конечном счете, это приводит к потребности в еще большем количестве данных и значительном увеличении вычислительных ресурсов для обучения модели.

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

Решение

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

1. Предварительно обработайте текст и сгенерируйте токены

2. Получите векторы слов для каждого токена, используя 100-мерную предварительно обученную модель word2vec GloVe.

3. Усредните векторы слов для каждого документа, чтобы создать средние векторы документов.

4. Выполните иерархическую кластеризацию по методу Уорда.

5. Получите вектор центроида для каждого кластера

6. Определите наиболее репрезентативный документ для каждого кластера, сравнив векторы документов с центроидным вектором его кластера, используя косинусное сходство.

Для этой реализации я использую оповещения Google за неделю для новостных статей, связанных с концепциями «науки о данных, искусственного интеллекта и машинного обучения».

Почему только 1 неделя новостей? Я провожу этот анализ еженедельно, чтобы информировать о шоу на Youtube, которое у меня есть через мой канал FastdatascienceAi под названием This Week in Ai. Таким образом, мне нужен способ получать новые темы еженедельно с ограниченными данными. Но я отвлекся.

1. Предварительная обработка текста и создание токенов

В этом примере мы начинаем с набора данных, который был создан путем извлечения электронных писем с новостями Google с моего адреса Gmail. Подробнее о том, как это сделать в Python, читайте в этом посте.

CSV-файл с результатами новостей загружается во фрейм данных Pandas. Вот как выглядит фрейм данных:

Оттуда я использую инструменты, предоставленные NLTK, для очистки и токенизации текста. Очистка и токенизация — довольно стандартная процедура для задач обработки естественного языка и включает в себя удаление лишних пробелов, небуквенных символов, стоп-слов, а также токенизацию и лемматизацию. Вот некоторый код для загрузки моего пользовательского модуля очистки Python и использования функции «pre_process_lda» для очистки текстового столбца фрейма данных:

2 и 3. Получение векторов слов…

В следующем разделе кода мы передаем каждый токен предварительно обученной модели Word2Vec (то есть модели GloVe), чтобы вернуть 100-мерное представление каждого слова в векторном пространстве. Затем мы усредняем эти векторы слов для каждого документа, чтобы получить 100-мерное представление каждого документа. Обратите внимание, что приведенный ниже код предполагает, что вы уже загрузили предварительно обученные векторы GloVe 6B.

4. Выполнить иерархическую кластеризацию…

Теперь, когда у нас есть вектор документа, основанный на среднем значении каждого токена в документе (в данном случае каждый документ является заголовком новостной статьи), следующая задача — определить способ организации документов в группы.

Поскольку мы ожидаем, что каждый документ уже будет охватывать схожие векторные пространства (все они связаны с наукой о данных, машинным обучением или искусственным интеллектом), без каких-либо представлений о количестве подгрупп (например, тем) внутри них и потому, что у нас есть только небольшой объем данных. , я решил использовать иерархическую кластеризацию.

Иерархическая кластеризация вместе с использованием дендрограмм позволяет быстро анализировать группировки данных на разных уровнях комбинаций. На самом высоком уровне все данные находятся в одном кластере, но на самом низком уровне каждый документ представляет собой свой собственный уникальный «кластер». Иерархическая кластеризация дает нам инструменты для изучения того, как организовать данные в группы между этими двумя крайностями.

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

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

В приведенных выше результатах мы видим из нашей дендрограммы, что наше лучшее решение — это решение по 4 темам.

5. Получите центр тяжести для каждого кластера

Теперь, когда мы определили, что наше лучшее решение — это решение по 4 темам, наш следующий шаг — получить вектор центроида для каждого кластера. В конечном счете, наша цель здесь состоит в том, чтобы иметь возможность использовать эти векторы центроидов для определения документа, который лучше всего представляет центроид.

6. Определите наиболее репрезентативный документ для каждого кластера

Последним шагом после нахождения наших векторов центроидов является сравнение каждого документа в каждом кластере с центроидом его кластера. Прежде чем сделать это, мы соединяем наш фрейм данных с прогнозируемым кластером для каждого документа, созданного на последнем шаге («y_hc»), и векторами для каждого документа.

Поскольку мы сравниваем числовые векторы, это хороший пример косинусного сходства. Косинусное сходство — это математическая формула для определения сходства между двумя последовательностями чисел. В этом случае у нас есть две последовательности из 100 чисел (то есть наши размерные векторы), которые мы сравниваем.

Таким образом, мы используем косинусное сходство для вычисления сходства между каждым документом и центроидом кластера. Затем для каждого кластера выбирается документ с косинусным сходством, ближайшим к 1.

Вот список названий, связанных с каждым кластером:

Просто основываясь на этом списке, мы можем определить возможную метку для каждого кластера следующим образом:

Заключение

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

Хотите узнать о науке о данных, карьерном росте, жизни или неправильных бизнес-решениях? "Присоединяйся ко мне".