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

Обработка естественного языка (NLP) — это приложение Data Science. НЛП, с точки зрения непрофессионала, представляет собой процесс манипулирования текстовыми данными. Это будет иметь большой смысл, когда мы возьмем реальный практический пример. В этой статье мы рассмотрим одно из наиболее часто применяемых приложений НЛП, то есть анализ настроений. Мы будем использовать один из суб-реддитов Reddit и поймем настроение постов, размещенных в нем.

Прежде чем мы пойдем дальше, несколько предварительных условий:

  1. Программирование на Python (начальный или средний уровень)
  2. Установка и базовое понимание пакетов nltk.

Шаг 1: Начнем с базового импорта пакетов

  • Модуль отображения IPython позволяет нам контролировать очистку вывода внутри циклов.
  • Модуль pprint позволяет нам печатать JSON и списки.
  • matplotlib и seaborn позволяют нам визуализировать данные и стилизовать их соответственно.
  • praw — это оболочка Reddit API, которая позволяет нам перебирать суб-реддиты.

Чтобы использовать оболочку API и импортировать данные из сабреддитов, мы должны сначала создать нечто, называемое «учетной записью разработчика».

  • Войдите в свою учетную запись Reddit
  • Перейдите на https://www.reddit.com/prefs/apps/
  • Нажмите на кнопку с надписью «вы разработчик? создать приложение…”

1. Введите имя (имя пользователя работает)

2. Выберите «скрипт»

3. Используйте локальный адрес вашего ноутбука Jupyter в качестве URL-адреса перенаправления.

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

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

Заполните ваш соответствующий client_id и client_secret между запятыми (да, запятые включены).

Мы собираемся инициализировать set(). И причина в том, что set()избегает дубликатов, которые могут запускаться несколько раз. Последний блок кода перебирает «новые» сообщения в выбранном сабреддите (я выбрал /r/politics. Но вы можете выбрать любую другую тему), и, установив ограничение на Нет, мы можем получить до 1000 заголовков. Когда я запускал его, было 974 новых.

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

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

Шаг 2: Маркировка наших данных

Встроенный в NLTK анализатор настроений Vader просто ранжирует фрагмент текста как положительный, отрицательный или нейтральный, используя лексикон положительных и отрицательных слов.

Мы можем использовать этот инструмент, сначала создав анализатор интенсивности тональности (SIA) для классификации заголовков, а затем воспользуемся методом polarity_scores, чтобы получить тональность.

Мы добавим каждый словарь настроений в список результатов, который мы преобразуем в фрейм данных.

Наряду с 'headline' в выводе есть 4 других метки, а именно 'compound', 'neg', 'neu', 'pos'. Составная метка представляет тональность в диапазоне от -1 (крайне отрицательно) до 1 (крайне положительно). Остальные 3 представляют оценку тональности каждой категории в заголовке.

Мы будем рассматривать сообщения с составным значением больше 0,2 как положительные и меньше -0,2 как отрицательные. Выбор этих диапазонов связан с некоторыми испытаниями и экспериментами, и здесь необходимо пойти на компромисс. Если вы выберете более высокое значение, вы можете получить более компактные результаты (меньше ложных положительных и ложных отрицательных результатов), но размер результатов значительно уменьшится.

Шаг 3: Статистика

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

  1. Предположение, которое мы сделали ранее, когда заголовки с составным значением от 0,2 до -0,2 считаются нейтральными. Чем выше маржа, тем больше нейтральных заголовков.
  2. Мы использовали общую лексику для классификации политических новостей. Более правильный способ — использовать политический лексикон, но для этого нам либо нужен человек, который будет вручную маркировать данные, либо нам нужно будет найти уже созданный пользовательский лексикон.

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

Определенно есть места для улучшений, но давайте пока продолжим.

Шаг 4: Токенизаторы и стоп-слова

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

Прежде всего, поговорим о токенизаторах. Токенизация — это процесс разбиения потока текста на значимые элементы, называемые токенами. Вы можете разбить абзац на предложения, предложение на слова и так далее.

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

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

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

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

Вывод

Это было быстрое и легкое погружение в применение НЛП для анализа настроений. Анализ настроений — это огромная вселенная сама по себе. Я призываю вас исследовать домен самостоятельно. Я буду публиковать больше статей по NLP и другим темам Data Science. Полный код этого проекта находится на моем github.