Будучи младшим специалистом по компьютерным наукам и производству новых медиа в Итака-колледже, я очень заинтересован в том, как мы можем использовать технологии, чтобы рассказывать истории за пределами областей STEM. Мой интерес также достигает пика в области обработки естественного языка, которая позволяет компьютерам понимать человеческий язык и анализировать текстовые проблемы по-новому. Сочетание этих двух интересов натолкнуло меня на идею этого проекта. Цель этого проекта — изучить применение анализа настроений в контексте политических дебатов.

Что такое анализ настроений?

Анализ настроений в обработке естественного языка позволяет нам определить основное настроение или отношение в данном фрагменте текста. Говоря более конкретно, ученые-компьютерщики разработали метод под названием «Частота терминов — обратная частота документов» (TF-IDF), который можно использовать для ранжирования определенных токенов или n-грамм и помочь нам определить, считаются ли они положительными или отрицательными по шкале от от -1,0 до 1,0, где -1,0 очень отрицательно, а 1,0 очень положительно.

Частота терминов — обратная частота документов — это статистическая мера того, насколько часто термин появляется в его документе пропорционально количеству документов во всем наборе, содержащих тот же термин. TF-IDF можно использовать в анализе тональности, потому что термины с низкой частотой можно считать «отрицательными», а термины с более высокой частотой, вероятно, будут «положительными».

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

Определение эксперимента

Чтобы начать этот проект, я выбрал 10 поисковых запросов, которые буду использовать во время этого эксперимента. Они перечислены следующим образом:

  • Эндрю Янг
  • Эми Клобучар
  • Берни Сандерс
  • Элизабет Уоррен
  • Джо Байден
  • Пит Буттиджич
  • Том Стейер
  • Дональд Трамп
  • демократ
  • республиканец

В часы, предшествовавшие президентским дебатам демократов 19 декабря 2019 года, я запустил скрипт Python, который каждые 15 минут запрашивал 250 твитов на поисковый запрос из Twitter API с использованием библиотеки Python tweepy. На этом этапе для каждого твита я извлекал текст твита, время его создания (в формате UTC) и вычислял его тональность с помощью библиотеки TextBlob. После того, как его настроение рассчитано, три балла для каждого твита упаковываются в словарь и в конечном итоге записываются в текстовый файл.

Изучив собранные данные, я понял, что текстовый файл — не самый эффективный способ хранения моих данных, которые в конечном итоге можно было бы использовать для визуализации. Затем я преобразовал данные, хранящиеся в моих текстовых файлах, в файлы JSON и Javascript, используя библиотеку JSON в Python. Затем эти файлы JavaScript использовались для создания линейного графика ChartJS, где каждому поисковому запросу соответствует своя линия.

Результаты

Собрав свои данные, я использовал библиотеку ChartJS, чтобы создать визуализацию настроений во времени. Как видно из графика, я собирал данные с 19 декабря 18:00 по 20 декабря 7:00. На первый взгляд, данные на этой диаграмме довольно внушительны. Точки данных имеют тенденцию группироваться между 0,05 и 0,1, что означает, что общее мнение несколько положительное. Строки для каждого кандидата настолько беспорядочны из-за того, что данные могут собираться нечасто. Поскольку каждую секунду создаются тысячи твитов, данные, которые я могу получить, ничтожно малы по сравнению со всеми твитами, связанными с каждым поисковым запросом. Собранный необработанный набор данных содержит 12 500 точек данных для каждого кандидата — 250 точек, собираемых каждые 15 минут в течение примерно 13 часов. Все эти данные (всего 125 000 точек) даже в таком малом масштабе были слишком громоздкими, чтобы их можно было визуализировать в необработанном виде, поэтому я взял среднее значение настроений каждого раунда из 250 твитов, чтобы сделать визуализацию более полезной.

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

Точность этих данных ограничена из-за особенностей Стандартного API Twitter. Чтобы ограничить непрерывные обращения к базе данных Twitter, общедоступный стандартный API ограничен 15 запросами в течение 15-минутного окна. Поэтому мы не можем создать полностью точную картину общественного мнения во время дебатов. Однако, обновив API, мы могли бы совершать более частые вызовы и, в конечном счете, получать больше данных, которые могли бы помочь лучше понять, как Twitter реагирует на событие.

Следующие шаги

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

  • Расширенный API Twitter. В ходе этого проекта я столкнулся с рядом ограничений при использовании общедоступного API Twitter. В будущем переход на Premium или Enterprise Twitter API позволит проводить исторический анализ производительности кандидата по запросу по всему архиву Twitter (до 2006 г.) и увеличить лимит запросов. В настоящее время стандартный Twitter API ограничен 15 запросами за 15-минутное окно. Премиум и корпоративные API получают гораздо более частый доступ к базе данных Twitter, что позволяет собирать более согласованные данные. Чем более последовательные данные можно собрать, тем менее изменчивыми и более точными могут быть графики.
  • Отслеживание результатов в реальном времени. Чтобы сделать этот инструмент еще более эффективным, результаты можно рассчитывать и визуализировать в режиме реального времени. ChartJS поддерживает обновление данных в режиме реального времени, поэтому этот инструмент может быть размещен в Интернете, а визуализация ChartJS может получать данные из Twitter API в режиме реального времени.
  • Дополнительный интерфейс аналитики. Этот инструмент анализа настроений можно легко интегрировать в более крупную систему веб-аналитики, чтобы получить более полное представление об эффективности кандидата в дебатах. Анализ тональности можно выполнять на данных из многих других текстовых источников, чтобы создать гораздо больший набор данных, который можно использовать для анализа.
  • Эффективность кода. До этого проекта я почти не был знаком с JavaScript как с языком, поэтому, вероятно, в мой код можно внести улучшения, чтобы использовать мощь языка. В том же духе есть стилистические варианты, которые могут сделать мой код более «питоновским» и задействовать больше повторного использования кода и более продвинутые функции языка для повышения эффективности моего времени.

использованная литература



Чтобы получить интерактивную версию графика, описанного выше, клонируйте репозиторий git и откройте файл «chartjs_code/averaged_data.html».

Tweepy:https://tweepy.readthedocs.io/en/latest/index.html
JSON:https://www.json. org/json-en.html
Twitter API:https://developer.twitter.com/en/docs
ChartJS: https://www.chartjs.org/
TextBlob: https://textblob.readthedocs.io/en/dev/