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

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

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

Какую область текстовых данных мы собираемся рассмотреть?

Давайте посмотрим на заголовки финансовых новостей, в частности на заголовки новостей об акциях Apple. Некоторые из основных причин этого:

  1. Данных много, об этом много говорят.
  2. Объем используемого жаргона относительно узок. Существует набор терминов, которые используются для описания того, в каком направлении будут двигаться акции. Это будет полезно с точки зрения обучения модели. Также происходят повторяющиеся события, поэтому, если мы хотим расширить некоторые другие результаты НЛП, такие как распознавание темы, мы можем добавить и это.
  3. Есть числовые значения, которые приходят с акциями, поэтому мы можем измерить, как настроение, которое мы получаем из данных, сравнивается с такими числовыми значениями, как цена акции и объем.

Вот пример того, как выглядят заголовки:

У нас также есть некоторые дополнительные данные о заголовках.

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

Как мы помечаем данные?

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

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

Что касается размера набора данных, у нас есть более 6000 немаркированных заголовков, и мы пометили и извлекли ключевые слова из 200 из этих заголовков. Выполнив этот процесс, мы смогли извлечь набор положительных и отрицательных слов.

У нас есть набор из 253 слов. Ни в малейшей степени не исчерпывающий набор, но это отправная точка.

Теперь, когда у нас есть данные, что дальше?

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

Обучение:

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

Чтобы форматировать, чтобы иметь возможность обучаться, TextBlob требуется список кортежей со значениями кортежа, являющимися функцией, и меткой либо pos, либо neg.

train_set = [('cuts', 'neg'),
 ('cash', 'pos'),
 ('highs', 'pos'),
 ('dropped', 'neg'),
 ('correction', 'neg'),
 ('highs', 'pos'),
 ('launch', 'pos')]
from textblob.classifiers import NaiveBayesClassifier
cl = NaiveBayesClassifier(train_set)

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

Тестирование:

Чтобы создать набор данных для проверки нашего классификатора, я вернулся к нашему набору заголовков из 6000, выбрал 100 заголовков наугад и пометил их. Вот часть того, как это выглядит.

labelled_data_test = [('Monster sues Apple’s Beats over headphone deal', 'neg'),
 ('Apple Pay to help drive multiyear expansion at VeriFone', 'pos'),
 ('Why millennials hate the stock market', 'neg'),
 ('Apple still on top as U.S. corporate cash holdings reach $1.73 trillion',
  'pos'),
 ('Carl Icahn’s tweet worth over $8 billion for Apple investors', 'pos'),
 ('Apple’s stock to blame for more than half Dow’s drop', 'neg'),
 ('Apple confirms iPhone 6 Plus camera glitch', 'neg'),
 ('Dow closes down triple digits as stocks end one of worst first weeks ever',
  'neg'),
 ('7 reasons Apple is a buy-—commentary\n', 'pos'),
 ('Tech giants face child labor storm', 'neg'),
 ('Adoption of Apple Pay slows, survey suggests', 'neg'),
 ('Trump calls for Apple boycott over San Bernardino killer phone encryption',
  'neg'),
 ('Apple unveils 9.7-inch iPad Pro, 4-inch iPhone SE', 'pos')]

Вот как выглядит результат:

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

Вывод:

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

Где это можно сделать?

Что ж, возможности безграничны. Я хотел бы изучить некоторые методы глубокого обучения, но они требуют огромных объемов данных, и мысль о том, чтобы сидеть и маркировать данные часами, ужасает меня. Меня интересует, как это связано с некоторыми числовыми значениями акций. Было бы интересно посмотреть, имеют ли эти классификации отношение к цене акций. Если при публикации положительных или отрицательных новостей есть закономерность с ценой или объемом акций, и может ли это быть ценным для трейдеров и других лиц, принимающих решения. Как только мы приступим к анализу этой взаимосвязи, мы также можем изучить обнаружение темы, чтобы увидеть, есть ли определенные темы новостей с заданным настроением, которые оказывают влияние.

Я покопаюсь в своем коде и вскоре опубликую репозиторий на github.