Comment rechercher sur Twitter avec rtweet et R

Twitter est une excellente source d'informations sur R, en particulier lors de conférences comme useR! et RStudio Conference. Et grâce à R et au package rtweet, vous pouvez créer votre propre outil pour télécharger des tweets pour une recherche, un tri et un filtrage faciles. Jetons un coup d'oeil, étape par étape.

Tout d'abord, vous voulez installer l'un des packages du projet rtweet que vous n'avez pas déjà: rtweet, reactable, glue, stringr, httpuv et dplyr. Ensuite, pour commencer, chargez rtweet et dplyr.

# Si vous devez installer l'un de ces éléments:

# install.packages ("rtweet")

# install.packages ("réactif")

# install.packages ("glue")

# install.packages ("stringr")

# install.packages ("httpuv")

# install.packages ("dplyr")

# install.packages ("purrr")

bibliothèque (rtweet)

bibliothèque (dplyr)

Autoriser l'API Twitter

Pour utiliser rtweet, vous avez besoin d'un compte Twitter afin de pouvoir autoriser rtweet à utiliser vos informations d'identification de compte spécifiques. En effet, il y a une limite au nombre de tweets que vous pouvez télécharger sur une période de 15 minutes.

Michael Kearney, qui a écrit rtweet, offre aux utilisateurs de rtweet deux choix. Le moyen le plus simple est de simplement demander des tweets. S'il n'y a pas d'informations d'identification stockées sur votre système, une fenêtre de navigateur devrait s'ouvrir pour vous demander d'autoriser la demande. Après cela, un jeton d'autorisation sera stocké dans votre fichier .Renviron afin que vous n'ayez pas à ré-autoriser à l'avenir.

Vous pouvez accéder à rtweet.info pour voir l'autre méthode, qui consiste à configurer un compte de développeur Twitter et un nouveau projet pour générer des informations d'identification d'autorisation. Si vous allez beaucoup utiliser rtweet, vous voudrez probablement le faire. Mais pour commencer, le moyen le plus simple est, eh bien, plus facile.

Importer des tweets

Pour rechercher des tweets avec un hashtag spécifique (ou une phrase qui n'est pas un hashtag), vous utilisez la earch_tweets()fonction s nommée intuitivement . Il prend plusieurs arguments, y compris la requête, tels que #rstudioconf ou #rstats; si vous souhaitez inclure des retweets; et le nombre de tweets à renvoyer. Le nombre par défaut est 100.

Bien que vous puissiez recevoir jusqu'à 18000 tweets en 15 minutes, il existe une restriction importante lors de l'utilisation de l'API Twitter pour rechercher un mot ou une expression: les résultats de la recherche ne remontent que de six à neuf jours, sauf si vous payez pour un compte API Twitter premium. Contrairement au site Web Twitter, vous ne pouvez pas utiliser rtweet pour rechercher des tweets d'une conférence de l'année dernière. Vous ne pourrez pas effectuer de recherche deux semaines après une conférence pour obtenir ces tweets. Vous voudrez donc vous assurer de sauvegarder les tweets que vous tirez maintenant et que vous voudrez peut-être à l'avenir.

Il y a plus d'arguments que vous pouvez utiliser pour personnaliser votre recherche, mais commençons par une recherche basique: 200 tweets avec le hashtag #rstudioconf, sans retweets.

tweet_df <- search_tweets ("# rstudioconf", n = 200,

include_rts = FALSE)

Si vous exécutez ce code et n'avez jamais utilisé rtweet auparavant, il vous sera demandé d'autoriser une application Twitter.

Notez que même si vous demandez 200 tweets, vous pourriez en recevoir moins. Une des raisons est qu'il n'y aura peut-être pas 200 tweets pour votre requête au cours des six à neuf derniers jours. Un autre est que Twitter a peut-être extrait au départ 200 tweets, mais après avoir filtré les retweets, il en restait moins.

La trame de données tweet_df revient avec 90 colonnes de données pour chaque tweet:

Sharon Machlis,

Les colonnes qui m'intéressent généralement le plus sont status_id, created_at, screen_name, text, favorite_count, retweet_count et urls_expanded_url. Vous voudrez peut-être d'autres colonnes pour votre analyse; mais pour ce tutoriel, je ne sélectionnerai que ces colonnes. 

Recherchez, filtrez et analysez vos tweets

Il existe de nombreuses visualisations et analyses intéressantes que vous pouvez faire avec les données Twitter et R. Certaines d'entre elles sont intégrées directement dans rtweet. Mais j'écris ce tutoriel en portant mon chapeau de journaliste technique. Je veux un moyen facile de voir des choses nouvelles et intéressantes que je ne connais peut-être pas.

Les tweets les plus appréciés d'une conférence pourraient y contribuer. Et si j'utilise rtweet et l'API Twitter, je n'ai pas besoin de me fier à l'algorithme «populaire» de Twitter. Je peux faire mes propres recherches et définir mes propres critères pour "populaire". Je pourrais vouloir rechercher les meilleurs tweets de la journée en cours pendant qu'une conférence est en cours, ou filtrer pour un sujet spécifique qui m'intéresse - comme «brillant» ou «ronronnement» - trié par la plupart des likes ou la plupart des retweets.

L'un des moyens les plus simples d'effectuer ce type de recherche et de tri consiste à utiliser une table triable. DT est un package populaire pour cela. Mais dernièrement, j'en ai expérimenté un autre: réactif. 

La valeur par défaut reactable()est un peu bla. Par exemple: 

tweet_table_data <- select (tweets, -user_id, -status_id)

bibliothèque (réactif)

réactif (tweet_table_data)

Ce code produit une table qui ressemble à ceci:

Sharon Machlis,

Mais nous pouvons ajouter quelques personnalisations, telles que:

réactif (tweet_table_data,

filtrable = TRUE, interrogeable = TRUE, bordé = TRUE,

rayé = TRUE, surligné = TRUE,

defaultPageSize = 25, showPageSizeOptions = TRUE,

showSortable = TRUE, pageSizeOptions = c (25, 50, 75, 100, 200), defaultSortOrder = "desc",

colonnes = liste (

created_at = colDef (defaultSortOrder = "asc"),

screen_name = colDef (defaultSortOrder = "asc"),

text = colDef (html = TRUE, minWidth = 190, redimensionnable = TRUE),

favorite_count = colDef (filtrable = FALSE),

retweet_count = colDef (filtrable = FALSE),

urls_expanded_url = colDef (html = TRUE)

)

)

Le résultat est une table qui ressemble à ceci:

Sharon Machlis,

Configurez votre table de données réactives 

Dans le bloc de code ci-dessus, l' filterable = TRUEargument a ajouté des filtres de recherche sous chaque en-tête de colonne et searchableajouté la zone de recherche globale du tableau en haut à droite. Mise en marche bordered, stripedet highlightfait ce que vous pourriez attendre: Ajoute une bordure de table, ajoute de la couleur rangée alternée « bandes », et met en évidence une ligne si vous mettez un curseur dessus.

I set my defaultPageSize to 25. The showPageSizeOptions argument lets me change the page length interactively, and then I define page size options that will show up in a drop-down menu below the table (not visible in the screen shot). The showSortable argument adds little arrow icons next to column names so users know they can click to sort. And I set each column’s defaultSortOrder to descending instead of ascending. So if I click on the column of number of retweets or likes, I will see that as most to least, not least to most.

Finally, there is the columns argument. That’s a list containing a column definition for each column. Look at the reactable help files for more details on other available options. In this example, I set the created_at and screen_name columns to have a default sort order of ascending. For the text column, I set it to display HTML as HTML so I can add clickable links. I also set a minimum column width of 190 pixels and made the column resizable — so users can click and drag to make it wider or narrower.

I also turned off the filter boxes for favorite_count and reply_count. That’s because, unfortunately, reactable filters don’t understand when columns are numbers and will filter them as character strings. While reactable sorts number columns properly, the filter boxes are problematic. That’s the major drawback to reactable vs. the DT package: DT understands column types and filters accordingly. But sorting numerically is enough for me for this purpose. 

You can check out the video at the top of this article to see what it looks like when you sort a column or make the tweet text column wider and narrower.

Make your data table more useful

A couple of things will make this table more useful. This code doesn’t display images or videos included in tweets. That’s fine, because my purpose here is to scan text, not re-create a Twitter application. But that means it will sometimes be helpful to see the original tweet in order to view photos, videos, or comments.

I think it’s convenient to add a small clickable something at the end of each tweet’s text that you can click to see the actual tweet on Twitter. I decided on >> although it could be any character or characters.

To construct a URL, I need to know the format of a tweet, which if you look at any tweet on the Twitter website, you can see is //twitter.com/username/status/tweetID. 

Using the glue package, that would be rendered like this: 

glue::glue("//twitter.com/{screen_name}/status/{status_id}")

If you haven’t used glue before, it’s a great package for pasting together text and variable values. In the above code, any variable name between braces is evaluated.

My full code to create a column with a clickable link to the tweet after the tweet text:

Tweet = glue::glue("{text} >> ") 

And the code to create a data frame for an interactive table:

tweet_table_data %

select(user_id, status_id, created_at, screen_name, text, favorite_count, retweet_count, urls_expanded_url) %>%

mutate(

Tweet = glue::glue("{text} >> ")

)%>%

select(DateTime = created_at, User = screen_name, Tweet, Likes = favorite_count, RTs = retweet_count, URLs = urls_expanded_url)

I'd also like to make clickable links from the URL column, which is now just text. This is a bit complicated, because the URL column is a list column because some tweets include more than one URL.

I’m sure there is a more elegant way to create clickable links from a list column of plain-text URLs, but the code below works. First I create a function to generate the HTML if there are no URLs, one URL, or two or more:

make_url_html <- function(url) {

if(length(url) < 2) {

if(!is.na(url)) {

as.character(glue("{url}") )

} else {

""

}

} else {

paste0(purrr::map_chr(url, ~ paste0("", .x, "", collapse = ", ")), collapse = ", ")

}

}

I run purrr::map_chr() on the URL value if there are two or more URLs so that each URL gets its own HTML; then I paste them together and collapse them into a single character string to appear in the table.

Once my function works, I use purrr::map_chr() again to iterate over each item in the column:

tweet_table_data$URLs <- purrr::map_chr(tweet_table_data$URLs, make_url_html)

Don’t worry if you don’t understand this part, since it’s really more about purrr and list columns than rtweet and reactable. And it’s not necessary to search and sort the tweets; you can always click to the original tweet and see clickable links there.

Finally, I can run my customized reactable() code on the new tweet table data: 

reactable(tweet_table_data,

filterable = TRUE, searchable = TRUE, bordered = TRUE, striped = TRUE, highlight = TRUE,

showSortable = TRUE, defaultSortOrder = "desc", defaultPageSize = 25, showPageSizeOptions = TRUE, pageSizeOptions = c(25, 50, 75, 100, 200),

columns = list(

DateTime = colDef(defaultSortOrder = "asc"),

User = colDef(defaultSortOrder = "asc"),

Tweet = colDef(html = TRUE, minWidth = 190, resizable = TRUE),

Likes = colDef(filterable = FALSE, format = colFormat(separators = TRUE)),

RTs = colDef(filterable = FALSE, format = colFormat(separators = TRUE)),

URLs = colDef(html = TRUE)

)

)

If you’ve been following along, you should have your own interactive table that can search, sort, and filter conference or topic tweets.

Tips for tweet collectors

One thing to remember: If you’re following a conference hashtag during a conference, you will want to pull enough tweets to get the whole conference. So check the earliest date in your tweet data frame. If that date is after the conference started, request more tweets. If your conference hashtag has more than 18,000 tweets (as happened when I was tracking CES) you’ll need to come up with some strategies to get the whole set. Check out the retryonratelimit argument for search_tweets() if you want to collect a whole 18,000+ set of conference hashtag tweets going back 6 days or less 

Finally, make sure to save your data to a local file when the conference ends! A week later, you’ll no longer have access to those tweets via search_tweets() and the Twitter API.

Et regardez l'épisode bonus «Faites plus avec R» pour voir comment transformer cette application de suivi Twitter en une application Shiny interactive.

Pour plus de conseils R, rendez-vous sur la page Faire plus avec R sur //bit.ly/domorewithR ou sur la liste de lecture Do More With R sur la chaîne YouTube TECHtalk.