Чтобы увидеть полную статью с сопровождающим кодом, перейдите по ссылке: https://blog.quant-quest.com/using-topic-modelling-to-analyse-10-k-filings/

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

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

Файл Google Colab со всем кодом можно найти здесь. Рекомендуем открыть его, чтобы увидеть все подробности: https://blog.quant-quest.com/using-topic-modelling-to-analyse-10-k-filings-notebook/

Что такое тематическое моделирование?

Тематическое моделирование является подзадачей обработки естественного языка и извлечения информации из текста. Цель состоит в том, чтобы для данного корпуса текста смоделировать скрытые (скрытые основные) темы, которые присутствуют в тексте. Как только вы узнаете темы, которые обсуждаются в тексте, можно выполнять различные дальнейшие аналитические работы. Например, используя темы в качестве функций, можно выполнять задачи классификации, анализа тенденций или визуализации. Это делает тематическое моделирование полезным инструментом в наборе инструментов специалиста по данным.

Скрытое распределение Дирихле (LDA) обычно используется для тематического моделирования из-за простоты реализации и скорости вычислений. Если мы немного разберем этот термин, мы заметим слово «латентный», что означает «незаметный»; Дирихле назван в честь немецкого математика и «распределения» из-за характера проблемы распределения скрытых тем по фрагментам текста.

Интуитивно понятный способ понять, как работает тематическое моделирование, состоит в том, что модель представляет, что каждый документ содержит фиксированное количество тем. Для каждой темы есть определенные слова, связанные с этой темой. Затем документ можно смоделировать как некоторые темы, которые генерируют некоторые слова, связанные с темами. Например, документ, обсуждающий Covid-19 и влияние безработицы, может быть смоделирован как содержащий темы: «Covid-19», «экономика», «здоровье» и «безработица». С каждой из этих тем связан определенный словарь, который появляется в документе. Модель знает, что в документе не обсуждается тема «торговля», потому что в документе нет слов, связанных с «торговлей».

Математика, лежащая в основе LDA, выходит за рамки этой статьи, но рассмотрим вариационную байесовскую выборку. Мы также коснемся модели MALLET, которая похожа на LDA, но имеет некоторые преимущества перед оригиналом.

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

Настраивать

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

Для загрузки данных мы используем пакет Python под названием sec-edgar-downloader, который можно легко установить по протоколу https://pypi.org/project/sec-edgar-downloader/. В этой статье мы рассмотрим некоторые крупные технологические компании: Alphabet, Microsoft, Amazon, IBM и Nvidia.

После загрузки данных мы можем создать простую визуализацию, чтобы получить лучшее представление о содержании этих 10 000 заявок. Мы определяем функцию для создания облака слов с учетом объекта Pandas Series.

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

Мы также можем сравнить облака слов между компаниями. Например, вот облако слов для алфавита:

И для Майкрософт:

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

Как и для всех текстов NLP, текстовые данные должны быть очищены и предварительно обработаны, чтобы сделать их полезными. Мы можем применить регулярные выражения, чтобы отфильтровать много мусора, а также удалить стоп-слова. Стоп-слова — это простые слова, которые не добавляют никакого значения документу и, следовательно, просто создают шум.

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

Это просто список Python из 179 слов. Если есть какие-либо идиосинкразические стоп-слова, связанные с вашим приложением, вы можете просто добавить их в этот список, прежде чем отфильтровывать их.

Мешок слов

Оттуда мы размечаем текст, используя модель Bag of Words, чтобы поместить текстовые данные так, как их понимает компьютер. Модель BoW состоит из двух компонентов: словарный запас и частота (или ее мера). Наконец, мы можем отфильтровать как чрезвычайно высокочастотные, так и низкочастотные слова. Мы избавляемся от низкочастотных слов, чтобы уменьшить вероятность переобучения, и удаляем высокочастотные слова, потому что они обычно не очень важны и поэтому могут скрыть сигнал.

Есть два основных компонента, которые входят в предварительную обработку текста для модели LDA. Нам нужны биграммы и отображение id2word. Функция bigram служит для автоматического определения (используя метод gensim.models.Phrases), какие слова должны быть сгруппированы как фраза. Например, в нашем контексте «оригинал» и «оборудование» объединяются в «оригинал_оборудование». Это полезно как для уменьшения шума, так и для создания лучших функций. Параметр bi_min гарантирует, что в документе есть как минимум 3 экземпляра объединенной фразы, прежде чем подтвердить ее как допустимую фразу. Выполняем эту операцию со следующей функцией:

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

Теперь для сопоставления id2word мы берем список биграмм, где каждый элемент представляет собой биграммное представление документа, а затем передаем его в метод Dictionary Gensim. Это создает сопоставление между каждым токеном (как он теперь называется после преобразования в биграммы) и идентификатором этого токена. Мы также фильтруем, так что токены должны быть как минимум в документах «no_below» и не более чем в доле документов «no_above». Наконец, мы преобразуем все наши документы в «корпус», где документ представлен списком (идентификатор, частота) кортежей. Значение идентификатора исходит из сопоставления id2word, а частота рассчитывается на основе того, сколько таких идентификаторов содержится в документе.

Например, идентификатор «Microsoft»:

Таким образом, слово Microsoft имеет идентификатор 539, и, поскольку мы передали это слово только один раз, его частота равна 1. Если бы мы передали [Microsoft, Microsoft]], то мы получили бы [(539 , 2)]. В более общем смысле, объединение двух документов является непересекающимся объединением, суммирующим кратности каждого элемента (идентификатор токена). https://en.wikipedia.org/wiki/Bag-of-words_model

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

Также важно отметить, что нам не нужно использовать idf-tf (обратная частота документа — частота терминов), потому что LDA решает проблемы частотности терминов путем построения.

молоток

Mallet (Machine Learning for Language Toolkit) — это пакет тематического моделирования, написанный на Java. В Gensim есть оболочка для взаимодействия с пакетом, которой мы и воспользуемся.

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

Чтобы использовать Mallet в Google Colab, нам нужно выполнить несколько дополнительных шагов. Сначала устанавливаем Java (на которой написан Маллет).

Затем скачиваем Mallet и разархивируем его:

Наконец, мы устанавливаем путь к бинарному файлу Mallet:

Чтобы использовать модель, мы используем для нее обертку Gensim. Нам нужно указать путь к бинарному файлу Mallet в качестве первого аргумента. Другие аргументы включали обучающий корпус, количество тем (гиперпараметр) и сопоставления id2word.

Последнее, что нам нужно сделать, прежде чем мы сможем использовать модель, — это преобразовать ее в формат Gensim, например:

Теперь мы можем использовать модель точно так же, как мы использовали бы исходную модель LDA!

Примечание. Вот отличное руководство по использованию Mallet с Google Colab: https://github.com/polsci/colab-gensim-mallet.

Поиск оптимального количества тем

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

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

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

Мы можем использовать отличный инструмент для построения графиков под названием pyLDAvis. Как следует из названия, это позволяет вам визуализировать выходные данные Тематического моделирования с использованием ряда методов, таких как уменьшение размерности.

Продолжение кода по адресу: https://blog.quant-quest.com/using-topic-modelling-to-analyse-10-k-filings/