Обзор

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

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

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

Темы моделирования

Чтобы сгруппировать статьи по темам, мы используем алгоритм моделирования темы BERTopic, который представляет собой отличный пакет от Мартена Грутендорста:

BERTopic — это метод моделирования тем, который использует преобразователи 🤗 и c-TF-IDF для создания плотных кластеров, позволяющих легко интерпретировать темы, сохраняя при этом важные слова в описаниях тем.

… и продолжить с того места, где заканчивается его пример, резюмируя код ниже:

from bertopic import BERTopic
from sklearn.datasets import fetch_20_newsgroups

# download dataset of 20,000 news articles
docs = fetch_20newsgroups(subset='all',  remove=('headers', 'footers', 'quotes'))['data']

# fit the topic model to the data, assigning a topic to each article
topic_model = BERTopic()
topic_model.fit_transform(docs)

Здесь алгоритм BERTopic разделил весь набор данных из более чем 18 000 статей на темы с размерами тем от нескольких тысяч до нескольких десятков статей.

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

Такое представление ключевых слов полезно, и человек может довольно точно догадаться о том, о чем идет речь. Например:

  • Тема 13 = «Солнечная система»
  • Тема 56 = «Католицизм»

… но нам нужно просмотреть статьи, чтобы убедиться в точности.

Давайте воспользуемся дополнительными инструментами НЛП, чтобы увидеть, можем ли мы автоматически маркировать эти темы без вмешательства человека!

Обобщение текста

Сжатие документа в один ярлык – это то, что журналисты делают каждый день при создании заголовков. Используя эти обучающие данные с текстовыми метками, ученые смогли обучить большие текстовые модели (такие как модель преобразования Google «T5) конкретной задаче создания однострочного заголовка для данной статьи. Мы будем использовать популярную модель генерации заголовков Мишо.

Однако есть одна серьезная проблема: большинство текстовых моделей обучаются на последовательностях с максимальной длиной 512 токенов!

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

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

Стратегия

К счастью, вышеупомянутая T5-модель уже обучена задаче суммирования (еще одно распространенное использование моделей преобразования текста в текст), поэтому мы предлагаем следующий метод:

  1. Выбирать статьи случайно из темы
  2. Обобщите статьи и объедините их резюме (убедитесь, что длина объединенных резюме меньше, чем ограничение на токены)
  3. Создать заголовок из комбинации резюме

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

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

… мы скоро вернемся к этому предположению.

Генерация этикеток

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

Что дает следующий результат:

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

Итеративная маркировка

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

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

Очевидно, что между сгенерированными метками существует много различий. В то время как тема 56 кажется довольно четко определенной, тема 13 встречается повсюду (хотя некоторые ярлыки вызывают некоторые хорошие вопросы).

Солнечная система — Солнечная система?

Единообразие темы

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

Мы выбираем верхнюю метку на основе того, что имеет больше всего общего с другими (то есть строку/столбец в матрице подобия с наибольшей суммой). В результате выбранные метки часто бывают короткими и общими, а не длинными и иногда странно конкретными.

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

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

Объединение ключевых слов, лучшей метки темы, оценки сходства и индикатора достоверности на одном графике:

… мы сразу получаем представление о наших двух темах, и вот, они имеют большой смысл!

Обобщить…

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

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