Парсинг и анализ твитов в R
Изучите способы получения данных из Twitter и выполнения тематического моделирования в R
Январь 2021 года был важным месяцем в политической истории США по многим причинам. Во-первых, потому что Джо Байден был объявлен победителем президентских выборов 2020 года. Во-вторых, потому что сотни сторонников Трампа штурмовали здание Капитолия, чтобы выразить свою поддержку Дональду Трампу. В-третьих, потому что в январе началась вакцинация от Covid. Во время всех этих событий множество твитов было сделано мировыми политическими лидерами о происходящих событиях.
В этом проекте анализа давайте попробуем спарсить твиты, сделанные Джо Байденом в твиттере за последний месяц, и выполнить тематическое моделирование, разделив их на разные темы.
Шаг 1: Получение доступа к API от Twitter
Для парсинга данных с Twitter вам сначала необходимо создать учетную запись разработчика Twitter здесь. После этого вы получите код авторизации для доступа к твитам. Подробные инструкции по этому процессу можно найти здесь.
my_authorization <- rtweet::create_token(app = "название вашего приложения",
consumer_key = "ваш ключ потребителя",
consumer_secret = "ваш секретный ключ потребителя", access_token="ваш токен доступа", access_secret = "ваш секретный токен доступа")
Шаг 2: Парсинг твитов
Используя сгенерированный выше код авторизации, мы парсим твиты со страницы Твиттера Джо Байдена и сохраняем их в файл .csv.
biden_tweets <- rtweet::get_timeline(c("joebiden"), n = 3000, parse=T, token=my_authorization)
rtweet::write_as_csv(biden_tweets, "biden_tweets.csv", prepend_ids = TRUE, na = "", fileEncoding = "UTF-8")
Мы можем проверить файл .csv, чтобы убедиться, что в нем есть 3000 строк (как указано нами) и 90 различных столбцов с данными, такими как дата создания твита, текст твита, хэштеги, количество ретвитов и т.д.
Шаг 3: Анализировать твиты
Затем csv-файл считывается с помощью функции readtext из библиотеки readtext. Библиотека readtext упрощает импорт текстовых файлов в различных форматах и возвращает фрейм данных, который легко манипулировать.
bidenTexts <- readtext::readtext("biden_tweets.csv", text_field = "text")
dim(bidenTexts)
Давайте теперь получим 5 самых популярных твитов, которые были ретвитнуты максимальное количество раз.
head(bidenTexts[order(-bidenTexts$retweet_count), 'text'], 5)
Мы получаем следующий ответ:-
[1] "Америка, я чувствую честь, что вы выбрали меня в качестве лидера нашей великой страны.\n\nРабота, которая впереди нас, будет трудной, но я обещаю вам: я буду Президентом для всех американцев - независимо от того, за кого вы голосовали или нет.\n\nЯ буду верить в то, что вы положили на меня надежду. https://t.co/moA9qhmjn8" [2] "Мы сделали это, @JoeBiden. https://t.co/oCgeylsjB4" [3] "Это новый день в Америке." [4] "Мое послание моим соотечественникам и друзьям по всему миру после нападения на Капитолий на этой неделе. https://t.co/blOy35LWJ5" [5] "Я не могу поверить, что мне приходится говорить это, но пожалуйста, не пейте отбеливатель."
Аналогично, мы можем проанализировать фрейм данных, чтобы получить твиты, которые были отмечены как избранные максимальное количество раз.
head(bidenTexts[order(-bidenTexts$favorite_count), 'text'], 5)
[1] "Это новый день в Америке." [2] "Америка, я чувствую честь, что вы выбрали меня в качестве лидера нашей великой страны.\n\nРабота, которая впереди нас, будет трудной, но я обещаю вам: я буду Президентом для всех американцев - независимо от того, за кого вы голосовали или нет.\n\nЯ буду верить в то, что вы положили на меня надежду. https://t.co/moA9qhmjn8" [3] "Не теряйте веру, ребята. Мы победим." [4] "Дональд Трамп - самый худший президент, которого у нас когда-либо было." [5] "Америка вернулась."
Шаг 4: Найти наиболее часто используемые слова и темы
Мы начинаем с создания корпуса для твитов. Функция corpus преобразует каждый твит в документ с такими функциями, как количество токенов в документе, тип, идентификатор пользователя, ширина текста и т. д. Мы можем получить список всех функций, используя команду summary.
# создать корпус
bidenCorpus <- quanteda::corpus(bidenTexts)
summary(bidenCorpus)
dfmbiden <- dfm(bidenCorpus, remove = c(stopwords("english")),
remove_punct = TRUE, remove_numbers = TRUE, remove_symbol = TRUE,tolower=T)
Затем мы используем функцию dfm для преобразования корпуса в матрицу признаков документа, которая представляет счетчики признаков по документам. В матрице признаков документа корпус преобразуется в разреженную матрицу с количеством строк, равным количеству документов в корпусе, и количеством признаков, равным количеству слов в корпусе. Если слово присутствует в документе, оно представлено количеством раз, которое оно встречается в документе, в противном случае - 0. При этом мы также удалили стоп-слова, такие как "if", "an" и т. д., и удалили символы, числа и знаки препинания.
Чтобы увидеть, какие слова Байден использовал чаще всего в своих твитах, мы можем нарисовать облако слов с помощью функции textplot_wordcloud из библиотеки quanteda.
set.seed(111)
quanteda::textplot_wordcloud(dfmbiden, max_words = 150, color = RColorBrewer::brewer.pal(8, "Dark2"))
Теперь давайте попробуем провести тематическое моделирование, которое разделяет твиты на разные темы. Для этого мы сначала определяем словарь с примерными словами для каждой темы. Мы определили 10 тем для этого анализа. Твиты, не относящиеся ни к одной из этих тем, будут отнесены к "другим".
dict <- dictionary(list(capitol_attack = c("атака", "ответственность", "капитолий", "позор", "штурм"),
cabinet = c("кабинет", "министр", "советник"),
education = c("школа", "образование"),
employment = c("работа", "право", "зарплата", "трудоустройство"),
winning = c("победа", "победить", "спасибо", "Америка", "великий", "назад", "гордый"),
economy = c("бедность", "кризис", "общество", "работа*", "аренда", "помощь" ),
war = c("война", "солдат*", "ядерный"),
crime = c("преступление*", "убийство", "убийца", "насилие"),
corona = c("коронавирус", "корона", "пандемия", "вирус", "маска", "вакцина"),
trump = c("Трамп", "Дональд", "президент", "закон" )))
Теперь мы используем функцию textmodel_seededlda() из библиотеки seededlda для реализации полупривлеченного латентного размещения Дирихле (seeded-LDA). Без вдавания в детали алгоритма, достаточно знать, что этот алгоритм разделяет тексты на предопределенные темы. Мы делаем это, подгоняя модель seeded_lda к определенной выше dfm. Затем мы можем проверить топ-слова для каждой темы.
slda <- textmodel_seededlda(dfmbiden_tfidf, dict, residual = TRUE)
topwords_biden <- as.data.frame(seededlda::terms(slda, 20))
Теперь мы сохраняем определенные темы в столбце "topic" нашего фрейма данных. После этого мы табулируем частоты каждой темы в нашем корпусе и создаем таблицу пропорций для этого.
bidenTweets$topic <- seededlda::topics(slda)#tabulate frequencies of each topic in your corpus:
topics_table <-ftable(bidenTweets$topic)
topicsprop_table <- as.data.frame(prop.table(topics_table))
Наконец, все, что нам нужно сделать, это построить темы в соответствии с их частотой в таблице пропорций.
ggplot(data=topicsprop_table, aes(x=Var1, y=Freq)) +
geom_bar(stat = "identity") +
labs (x= "Темы", y = "Процент темы")+
labs(title = "Пропорции тем - Байден") +
theme(axis.text.x = element_text(face="bold",
size=10, angle=45,hjust = 1))
Мы видим из столбчатой диаграммы выше, что из 3000 твитов, сделанных Джо Байденом в январе, максимальное количество (13%) было о его победе на выборах, за ними следуют Covid-19 (11%) и экономика (9%).
В этой статье мы научились парсить твиты из приложения Twitter и анализировать их по количеству ретвитов или избранных. Мы также научились строить облако слов и проводить тематическое моделирование. Подробный код для этой статьи можно найти по этой ссылке.
Если вам понравилась статья, пожалуйста, не забудьте поставить лайк и подписаться.