CoderCastrov logo
CoderCastrov
Парсинг

Парсинг и анализ твитов в R

Парсинг и анализ твитов в R
просмотров
5 мин чтение
#Парсинг

Изучите способы получения данных из 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"))
Word cloud for most frequently used words in the tweets of Joe Biden

Теперь давайте попробуем провести тематическое моделирование, которое разделяет твиты на разные темы. Для этого мы сначала определяем словарь с примерными словами для каждой темы. Мы определили 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))
Topic proportions of tweets by Joe Biden

Мы видим из столбчатой диаграммы выше, что из 3000 твитов, сделанных Джо Байденом в январе, максимальное количество (13%) было о его победе на выборах, за ними следуют Covid-19 (11%) и экономика (9%).


В этой статье мы научились парсить твиты из приложения Twitter и анализировать их по количеству ретвитов или избранных. Мы также научились строить облако слов и проводить тематическое моделирование. Подробный код для этой статьи можно найти по этой ссылке.

Если вам понравилась статья, пожалуйста, не забудьте поставить лайк и подписаться.