Дают ли данные Twitter, относящиеся к крупному спортивному событию, представление об основных результатах?

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

Для всех, кто хочет улучшить свои навыки обработки естественного языка (NLP), полезной нитью в их луке является возможность доступа и работы с данными Twitter. API Twitter предоставляет платформу, с помощью которой мы можем программно получать доступ к данным Twitter. Чтобы упростить работу с этим API, существуют пакеты Python, которые включают функции, помогающие пользователю в извлечении. Одним из таких пакетов является Tweepy, пакет с открытым исходным кодом, который включает в себя множество функций и классов, которые помогают смягчить проблемы, такие как аутентификация и ограничение скорости. Ниже мы рассмотрим шаги, необходимые для аутентификации и запроса данных с помощью этого полезного пакета.

Первое, что нужно отметить, это то, что вам понадобится учетная запись Twitter, и после того, как вы зарегистрировались, вам необходимо зарегистрироваться в качестве разработчика https://developer.twitter.com. При регистрации в качестве разработчика вы ответите на ряд вопросов, чтобы определить, нужен ли вам доступ к данным Twitter. После этого вы можете создать приложение, в котором хранятся ваши учетные данные, используемые при выполнении вызовов API. В разделе ключи и токены вы найдете токен носителя, который для Twitter API v2 — это все, что вам нужно. Более подробная информация здесь: https://developer.twitter.com/en/support/twitter-api/developer-account.

Как указано в ссылке, скорее всего, вам потребуется повышенный доступ.

Цель проекта

Думая о проекте на основе данных Twitter, меня не может не привлечь личный интерес — футбол (футбол) и, в частности, футбольный клуб «Арсенал». Подписка на твиты во время игры часто сама по себе является событием. Это заставляет нас задаться вопросом, можно ли почерпнуть что-нибудь полезное из этих твитов (может быть, немного оптимистично!?). В отличие от анализа настроений на данном этапе, другой областью интереса НЛП является тематическое моделирование. Следовательно, можно ли определить ключевые темы и темы, характерные для конкретной игры, исключительно на основе твитов пользователей, относящихся к этой игре? Мы копаемся в Твиттере, чтобы узнать!

Работа с Tweepy

Теперь, когда мы зарегистрировались в учетной записи разработчика Twitter, нам нужно установить (pip install tweepy) и узнать, как использовать Tweepy для доступа к API. Первым необходимым шагом является аутентификация. Client — это интерфейс Tweepy для Twitter API v2, который использует ваш токен носителя (полученный на вкладке keys and tokens на портале разработчиков).

Обратите внимание, что другим включенным параметром является wait_on_rate_limit. Это полезно обрабатывает наш запрос, если мы нарушаем ограничения скорости, установленные API, то есть количество запросов, которые нам разрешено делать в течение заданного окна. Этот параметр приостанавливает запрос, если достигнут предел скорости.

Следующий элемент определяет наш поисковый запрос. Этот поисковый запрос будет использоваться для фильтрации релевантных твитов и может включать в себя термины, операторы и логические значения для получения более точного подмножества. Ниже, например, мы ищем такие термины, как арсенал, и отрицаем такие термины, как ядерный, поскольку этот термин часто сочетается с арсеналом. Точно так же мы включили и исключили другие термины, чтобы помочь нам сузить круг того, что нам нужно. В дополнение к ключевым терминам мы также включили оператор типа конъюнкции -is:retweet, где минус указывает на отрицание. Это удаляет ретвиты из нашего запроса и является ключом к возврату исходных твитов. Оператор lang:en возвращает только те твиты, которые Твиттер пометил как англоязычные. Существует множество других операторов, и я бы посоветовал обратиться к документации для получения дополнительной информации. Эта ссылка содержит полезный обзор того, как построить запрос: https://developer.twitter.com/en/docs/twitter-api/tweets/search/integrate/build-a-query

В наш поисковый запрос не включены полезные аннотации, которые Twitter добавляет ко многим твитам. К ним относятся добавление тегов для сущностей, упомянутых в твите, а также контекстные аннотации, которые Twitter добавляет в твиты, чтобы помочь понять контекстную информацию о твите. Они ищутся с помощью оператора context . Сами они являются результатом семантического анализа, и есть ряд областей, из которых можно выбирать. Полный список всех контекстных доменов можно найти здесь https://github.com/twitterdev/twitter-context-annotations. Например, мы можем добавить к нашему поисковому запросу следующее: context:3.10027427957, где 3 — это домен, а сущность — Barclays Premier League Football. Это был бы потенциальный метод, с помощью которого мы можем удалить нерелевантные твиты. Однако таким образом помечается только часть твитов, поэтому мы пропускаем большое количество релевантных твитов. По этой причине мы не включили это в наш запрос.

Ниже у нас теперь есть запрос для поиска. Для начала, возможно, мы хотим увидеть, сколько твитов будет соответствовать этим параметрам за последние семь дней, на что ссылается recent_tweets_count. Мы видим большой всплеск количества твитов в день матча, 1 октября 2022 года.

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

общее количество твитов в игровой день 01–10–22 составило 124560.

Это день, на котором мы собираемся остановиться, так как в этот день произошла игра, в частности, игра между «Арсеналом» и их соперником «Тоттенхэмом». Возвращаясь к нашему первоначальному вопросу, мы будем извлекать твиты в соответствии с нашим поисковым запросом, который произошел во время игры, чтобы посмотреть, сможем ли мы извлечь ключевые события/темы из игры! Для этого мы будем использовать два запроса к API, один для первой половины, а другой для второй.

Ниже мы можем увидеть запрос на первую половину. Обратите внимание на использование функции Paginator, в которую вы передаете необходимую функцию поиска и параметры. Это необходимо, если вы хотите получить более 100 результатов за один запрос. У него есть полезная функция для flatten всех страниц в одну, где вы также указываете общее количество твитов, которые хотите. Обратите внимание, что это максимум, и Twitter может вернуть меньше.

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

Функция Paginator возвращает генератор, который мы затем преобразуем в список, чтобы позволить нам просматривать и манипулировать результатами.

Очистка данных Твиттера

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

Текстовые данные Twitter, как и другие тексты социальных сетей, имеют некоторые особенности, с которыми вы можете не иметь дело в других доменах. Эти сведения обрабатываются функцией clean_tweet ниже. Эта функция включает в себя ряд шагов для преобразования наших данных твитов в пригодный для использования формат. Обратите внимание, что некоторые из этих шагов актуальны в контексте тематического моделирования. Для других типов анализа нам может потребоваться настроить способ очистки данных. Каждый шаг в функции включает краткое, но, надеюсь, достаточное объяснение! Мы используем сочетание операций с регулярными выражениями для замены элементов строки, а также некоторые действительно полезные функции предварительной обработки, доступные в библиотеке textacy. Я рекомендую вам ознакомиться с другими доступными функциями для очистки текста в этом пакете, некоторые из них включены в качестве альтернатив регулярному выражению.

Токенизация

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

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

Стоит отметить, что пакет nltk имеет удобную функцию TweetTokenizer, которая токенизирует твиты, сохраняя такие элементы, как смайлики. Ниже представлена ​​демонстрация.

Стоп-слова

Следующим шагом в нашем конвейере является удаление так называемых стоп-слов. Это слова, которые часто встречаются в языке, такие как «the», и (часто) не добавляют много значения. Многие библиотеки НЛП включают в себя список стоп-слов. Здесь мы использовали список из nltk. Функция просто отфильтровывает все стоп-слова из списка токенов. Однако стоит отметить, что такие слова, как «делать» и «не» включены в стоп-слова, и в контексте семантического анализа это окажет значительное влияние на значение. Например, если мы удалим эти слова из утверждения «Я не люблю мороженое», вы увидите, какую проблему это вызовет! Поэтому мы должны быть осторожны с тем, какие стоп-слова мы удаляем, и мы можем захотеть настроить список, чтобы он соответствовал предметной области, в которой мы работаем.

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

Векторизация

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

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

Поэтому ниже мы используем TfidfVectorizer из sklearn, который векторизует твиты для нас с помощью алгоритма на основе TF-IDF.

Обратите внимание на некоторые ключевые параметры, включенные при создании экземпляра векторизатора. Два имени max_df и min_df помогают уточнить наш список возможностей. min_df удаляет слова, встречающиеся менее двух раз, что разумно, поскольку слова, встречающиеся только один раз во всем корпусе, вероятно, мало что добавляют к кластеризации или группировке твитов. Действительно, мы, вероятно, могли бы увеличить это число до 3 или 4. Стоит попробовать это и визуализировать изменение результатов, а также количества включенных функций, которые можно увидеть выше. В любом данном корпусе некоторые слова, вероятно, будут использоваться неоднократно, почти в каждом документе или твите. Они могут зависеть от контекста и, следовательно, не могут быть включены в список стоп-слов. Такие слова также мало помогут в кластеризации текстов. Таким образом, аргумент max_df позволяет нам опустить функции, которые часто встречаются в нашем корпусе, и здесь мы удаляем функции, которые встречаются в 80% или более твитов. ngram_range указывает, что нас интересуют униграммы, биграммы и триграммы. Аргумент max_features позволяет нам ограничить количество функций, если это необходимо (здесь не применяется).

Выше мы можем видеть размеры полученной разреженной матрицы. Мы видим, что в нашем векторизованном наборе данных примерно 10 тысяч объектов. Настройка параметров в TfidfVectorizer, скорее всего, изменит количество функций. С этим стоит поэкспериментировать.

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

Тематическое моделирование с помощью кластеризации K-средних

Мы можем развернуть здесь алгоритм кластеризации K-средних, чтобы попытаться идентифицировать кластеры в нашем корпусе. Мы надеемся, что эти кластеры будут характеризоваться определенными темами и темами, взятыми из наших твитов об этой футбольной игре. Нам нужно указать количество кластеров, в которые мы хотим сгруппировать наши твиты, представленное k = 15. На данный момент это довольно произвольно и может быть изменено в зависимости от результатов. Алгоритм распределит каждый твит в один кластер или тему. Этот вид жесткой кластеризации может быть не идеальным для более длинных документов с несколькими темами. Тем не менее, твиты пользователей часто сосредоточены вокруг одной темы, учитывая необходимость сжать то, что нужно передать, до небольшого количества символов. Посмотрим, встретится ли это с результатами этого упражнения по кластеризации.

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

Теперь мы повторяем тот же процесс для второй половины твитов.

Полученные результаты

Помните, что нашим первоначальным намерением было попытаться использовать Tweepy для получения твитов, относящихся к конкретному событию. В данном случае игра в футбол. Затем мы хотели определить, сможем ли мы извлечь ключевые события и темы из этой игры с помощью некоторой формы тематического моделирования. Мы сосредоточились на матче Премьер-лиги между «Арсеналом» и «Тоттенхэмом», который состоялся 1 октября 2022 года. Для тех, кто не в курсе, ключевые события были совершенно очевидны: игрок «Арсенала» Томас Парти забил отличный тайм, после периода господства Арсенала. Затем игрок «Тоттенхэма» Гарри Кейн сравнял счет с пенальти. Во втором тайме «Арсенал» снова сыграл хорошо и вышел вперед через Габриэля Жезуса. Затем последовала красная карточка игроку «Тоттенхэма» и, наконец, гол Гранита Джаки. Давайте посмотрим, сможем ли мы определить эти ключевые темы в наших кластерах!

Чтобы визуально помочь нашему анализу, мы можем отобразить наши векторы TF-IDF в виде двумерных диаграмм рассеяния. Это поможет нам визуализировать, есть ли у нас четкие кластеры, и, следовательно, применимость кластеризации K-средних к этому набору данных. Это также поможет определить, нужно ли нам дополнительно настраивать параметры нашей модели. Для этого мы можем использовать анализ основных компонентов (PCA), чтобы уменьшить наши многомерные векторы оценок TF-IDF до матрицы более низкого размера, подходящей для построения графика. PCA — это популярный алгоритм уменьшения размерности, который преобразует данные в меньшее количество измерений, сохраняя при этом максимально возможную дисперсию. Затем мы сможем построить этот сокращенный набор данных в виде диаграммы рассеяния, чтобы визуализировать ключевые кластеры.

Ниже мы используем PCA, чтобы сократить наши векторы TF-IDF на две компоненты для каждого твита. Это дает нам значения x и y, которые мы затем отображаем как разброс.

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

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

Кластер 1
гол
арсенал Тоттенхэм
Тоттенхэм
гол арсенал
гол арсенал
Кейн
Тоттенхэм Хотспур
Хотспур
Арсенал Тоттенхэм Хотспур
Гарри

Это отражает голы, забитые в первом тайме. Ясно, что это гол «Арсенала», и, возможно, один из них забил Гарри Кейн. В дополнение к этому выделяются кластеры 4, 5 и 10. Кластер 10 — это темно-зеленая полоса слева, которая не так заметна на визуальном изображении, но для которой наиболее заметны следующие ключевые особенности, связанные с голом Томаса Партея. С точки зрения ключевых особенностей, это действительно хорошо определено и относится к ключевому событию в первом тайме.

Кластер 10
Парти
Томас
Томас Парти
Гол
Арсенал Парти
Гол Парти
Гол Томас
Арсенал Томаса Парти
гол Томас Парти
ведущий

Вероятно, наиболее определенным кластером является кластер под номером 5. Эти твиты на самом деле относятся к ссылкам на прямую трансляцию игры! Вы можете увидеть основные функции по ссылке GitHub ниже. Ясно, что с точки зрения темы этот кластер хорошо отличается от других.

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

Ниже мы запускаем тот же анализ и визуализацию для второй половины твитов.

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

Кластер 8
лига
победа
победа
победа в арсенале
победа в арсенале
победа в лиге
лига-победитель
лига-победитель в арсенале
арсенал победная лига
арсенал лига

Темно-зеленый кластер, 10, указывает на следующие особенности. Снова некоторое позитивное настроение, обычно используемая насмешка над северным Лондоном, который является красным.

Кластер 10
лондон
север
север лондона
лондон красный
красный
север лондон красный
лондон дерби
север лондон дерби< br /> Дерби
Арсенал Норт

Меня также привлек коричневый кластер на графике выше, который был вызван ключевым событием, которое произошло.

Кластер 4
красная
карта
красная карта
арсенал карт
арсенал красных карт
emerson
royal
emerson royal
Арсенал красный
игра

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

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

Заключительные замечания

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

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

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

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

Спасибо, что прочитали.

Рекомендации

Следующий ресурс был бесценным и помог, в частности, в обработке твитов.

Йенс Альбрехт, Сидхарт Рамачандран и Кристиан Винклер. Схемы текстовой аналитики с использованием Python (2020)

Следующее видео помогает в построении значений PCA.

https://www.youtube.com/watch?v=B0BkUNMqfSo&list=PL2VXyKi-KpYttggRATQVmgFcQst3z6OlX&index=7&t=536s