Наука о данных в грубом смысле — это осмысление любых необработанных данных. От цифр к текстам. Сбор данных, предварительная обработка данных и визуализация данных являются одними из основных частей науки о данных. И в этот информационный век, с постоянно растущим потоком информации и данных, стало насущной необходимостью управлять потоком и предоставлять полезные идеи и выводы на основе данных.
Обработка естественного языка (NLP) — это приложение Data Science. НЛП, с точки зрения непрофессионала, представляет собой процесс манипулирования текстовыми данными. Это будет иметь большой смысл, когда мы возьмем реальный практический пример. В этой статье мы рассмотрим одно из наиболее часто применяемых приложений НЛП, то есть анализ настроений. Мы будем использовать один из суб-реддитов Reddit и поймем настроение постов, размещенных в нем.
Прежде чем мы пойдем дальше, несколько предварительных условий:
- Программирование на Python (начальный или средний уровень)
- Установка и базовое понимание пакетов 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: Статистика
Большое количество нейтральных заголовков обусловлено двумя основными причинами:
- Предположение, которое мы сделали ранее, когда заголовки с составным значением от 0,2 до -0,2 считаются нейтральными. Чем выше маржа, тем больше нейтральных заголовков.
- Мы использовали общую лексику для классификации политических новостей. Более правильный способ — использовать политический лексикон, но для этого нам либо нужен человек, который будет вручную маркировать данные, либо нам нужно будет найти уже созданный пользовательский лексикон.
Еще одно интересное наблюдение — количество негативных заголовков, которые можно объяснить поведением СМИ, например, преувеличением заголовков для кликбейта. Другая возможность заключается в том, что наш анализатор выдал много ложноотрицательных результатов.
Определенно есть места для улучшений, но давайте пока продолжим.
Шаг 4: Токенизаторы и стоп-слова
Теперь, когда мы собрали и пометили данные, давайте поговорим о некоторых основах предварительной обработки данных, которые помогут нам получить более четкое представление о нашем наборе данных.
Прежде всего, поговорим о токенизаторах. Токенизация — это процесс разбиения потока текста на значимые элементы, называемые токенами. Вы можете разбить абзац на предложения, предложение на слова и так далее.
В нашем случае у нас есть заголовки, которые можно считать предложениями, поэтому мы будем использовать токенизатор слов:
Это простой список стоп-слов на английском языке, который содержит большинство распространенных слов-заполнителей, которые просто увеличивают объем наших данных без дополнительной информации. В дальнейшем вы, скорее всего, будете использовать более расширенный список стоп-слов, который идеально подходит для вашего случая использования, но NLTK — хорошее начало.
Мы можем взять все заголовки положительных меток из нашего фрейма данных, передать их нашей функции, а затем вызвать функцию FreqDist NLTK, чтобы получить наиболее распространенные слова в положительных заголовках:
Теперь это для положительных слов, для отрицательных слов код точно такой же, только с другими соответствующими переменными. Вы можете придумать больше переменных и выводов
Вывод
Это было быстрое и легкое погружение в применение НЛП для анализа настроений. Анализ настроений — это огромная вселенная сама по себе. Я призываю вас исследовать домен самостоятельно. Я буду публиковать больше статей по NLP и другим темам Data Science. Полный код этого проекта находится на моем github.