Programmering

Hvordan søke på Twitter med rtweet og R.

Twitter er en god kilde til nyheter om R - spesielt under konferanser som useR! og RStudio Conference. Og takket være R og rtweet-pakken, kan du bygge ditt eget verktøy for å laste ned tweets for enkel søk, sortering og filtrering. La oss ta en titt, trinn for trinn.

Først vil du installere noen av rtweet-prosjektets pakker du ikke allerede har: rtweet, reagerbar, lim, stringr, httpuv og dplyr. Så start, last inn rtweet og dplyr.

# Hvis du trenger å installere noen av disse:

# install.packages ("rtweet")

# install.packages ("reagerbar")

# install.packages ("lim")

# install.packages ("stringr")

# install.packages ("httpuv")

# install.packages ("dplyr")

# install.packages ("purrr")

bibliotek (rtweet)

bibliotek (dplyr)

Autoriser Twitter API

For å bruke rtweet trenger du en Twitter-konto slik at du kan autorisere rtweet til å bruke dine spesifikke kontoopplysninger. Det er fordi det er en grense for hvor mange tweets du kan laste ned i løpet av en 15-minutters periode.

Michael Kearney, som skrev rtweet, gir rtweet-brukere to valg. Den enkleste måten er å bare be om noen tweets. Hvis det ikke er lagret legitimasjon på systemet ditt, bør et nettleservindu åpnes der du blir bedt om å autorisere forespørselen. Deretter lagres et autorisasjonstoken i .Renviron-filen, slik at du ikke trenger å autorisere på nytt i fremtiden.

Du kan gå til rtweet.info for å se den andre metoden, som innebærer å opprette en Twitter-utviklerkonto og et nytt prosjekt for å generere autorisasjonslegitimasjon. Hvis du skal bruke rtweet mye, vil du sannsynligvis gjøre det. Men for å starte, er den enklere måten, vel, lettere.

Importer tweets

For å søke etter tweets med en bestemt hashtag (eller setning som ikke er en hashtag), bruker du det intuitivt kalt search_tweets () funksjon. Det tar flere argumenter, inkludert spørringen, for eksempel #rstudioconf eller #rstats; om du vil inkludere retweets; og antall tweets som skal returneres. Tallet er som standard 100.

Mens du kan motta opptil 18 000 tweets innen 15 minutter, er det en viktig begrensning når du bruker Twitter API for å søke etter et ord eller et uttrykk: søkeresultatene går bare tilbake seks til ni dager med mindre du betaler for en premium Twitter API-konto. I motsetning til Twitter-nettstedet kan du ikke bruke rtweet til å søke etter tweets fra en konferanse i fjor. Du kan ikke søke to uker etter en konferanse for å få de tweets. Så du vil sørge for å lagre tweets du trekker nå som du kanskje vil ha i fremtiden.

Det er flere argumenter du kan bruke til å tilpasse søket, men la oss begynne med et grunnleggende søk: 200 tweets med hashtaggen #rstudioconf, uten retweets.

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

include_rts = FALSE)

Hvis du kjører den koden og aldri har brukt rtweet før, blir du bedt om å autorisere en Twitter-app.

Merk at selv om du ber om 200 tweets, kan du få tilbake færre. En grunn er at det ikke kan være 200 tweets for spørringen din de siste seks til ni dagene. En annen er at Twitter faktisk hadde opprinnelig hentet 200 tweets, men etter å ha filtrert ut retweets, var det færre igjen.

Datarammen tweet_df kommer tilbake med 90 kolonner med data for hver tweet:

Sharon Machlis,

Kolonnene jeg vanligvis er mest interessert i er status_id, created_at, screen_name, text, favorite_count, retweet_count, og urls_utvidet_url. Du vil kanskje ha noen andre kolonner for analysen din; men for denne opplæringen velger jeg bare de kolonnene.

Søk, filtrer og analyser tweets

Det er mange interessante visualiseringer og analyser du kan gjøre med Twitter-data og R. Noen av dem er innebygd i rtweet. Men jeg skriver denne veiledningen iført min tekniske journalisthatt. Jeg vil ha en enkel måte å se nye og kule ting jeg kanskje ikke vet om.

Mest likt tweets fra en konferanse kan hjelpe med det. Og hvis jeg bruker rtweet og Twitter API, trenger jeg ikke å stole på Twitters "populære" algoritme. Jeg kan gjøre mine egne søk og sette mine egne kriterier for "populær". Det kan være lurt å søke etter topp tweets bare fra i dag mens en konferanse pågår, eller filtrere etter et bestemt emne jeg er interessert i - som “skinnende” eller “purrr” - sortert etter de fleste likes eller flest retweets.

En av de enkleste måtene å gjøre slike søk og sorteringer er med en sorterbar tabell. DT er en populær pakke for dette. Men i det siste har jeg eksperimentert med en annen: reagerbar.

Standaren reagerbar () er litt bla. For eksempel:

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

bibliotek (reagerbart)

reagerbar (tweet_table_data)

Denne koden produserer en tabell som ser slik ut:

Sharon Machlis,

Men vi kan legge til noen tilpasninger, for eksempel:

reagerbar (tweet_table_data,

filtrerbar = SANT, søkbar = SANT, avgrenset = SANT,

stripete = SANN, høydepunkt = SANT,

defaultPageSize = 25, showPageSizeOptions = SANT,

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

kolonner = liste (

created_at = colDef (defaultSortOrder = "asc"),

screen_name = colDef (defaultSortOrder = "asc"),

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

favorite_count = colDef (filterable = FALSE),

retweet_count = colDef (filtrerbar = FALSE),

urls_expanded_url = colDef (html = TRUE)

)

)

Resultatet er en tabell som ser slik ut:

Sharon Machlis,

Konfigurer den reagerbare datatabellen

I kodebiten ovenfor viser filtrerbar = SANT argument lagt til søkefiltre under hver kolonneoverskrift, og søkbar la til det overordnede søkefeltet øverst til høyre. Slå på grenser, stripete, og fremheve gjør det du kan forvente: Legger til en tabellramme, legger til "striper" i vekslende farger og fremhever en rad hvis du setter en markør på den.

Jeg setter min defaultPageSize til 25. TheshowPageSizeOptions argument lar meg endre sidelengden interaktivt, og så definerer jeg sidestørrelsesalternativer som vil vises i en rullegardinmeny under tabellen (ikke synlig i skjermbildet). De showSortable argumentet legger til små pilikoner ved siden av kolonnenavn, slik at brukerne vet at de kan klikke for å sortere. Og jeg angir hver kolonnedefaultSortOrder til synkende i stedet for stigende. Så hvis jeg klikker på kolonnen med antall retweets eller likes, vil jeg se det som mest til minst, ikke minst for de fleste.

Endelig er det kolonner argument. Det er en liste som inneholder en kolonnedefinisjon for hver kolonne. Se på de reagerbare hjelpefilene for mer informasjon om andre tilgjengelige alternativer. I dette eksemplet setter jeg opprettet_på og skjerm navn kolonnene for å ha en standard sorteringsrekkefølge på stigende. For tekst kolonne, satte jeg den til å vise HTML som HTML slik at jeg kan legge til klikkbare lenker. Jeg satte også en minste kolonnebredde på 190 piksler og gjorde kolonnen tilpasbar - slik at brukerne kan klikke og dra for å gjøre den bredere eller smalere.

Jeg har også slått av filterboksene for favoritt_telling og svar_antall. Dessverre forstår reagerbare filtre ikke når kolonnene er tall, og filtrerer dem som tegnstrenger. Mens det er reagerbart sorterer antall kolonner riktig, er filterboksene problematiske. Det er den største ulempen med reagerbar kontra DT-pakken: DT forstår kolonnetyper og filtrerer deretter. Men å sortere numerisk er nok for meg for dette formålet.

Du kan sjekke ut videoen øverst i denne artikkelen for å se hvordan den ser ut når du sorterer en kolonne eller gjør tweettekstkolonnen bredere og smalere.

Gjør datatabellen mer nyttig

Et par ting vil gjøre denne tabellen mer nyttig. Denne koden viser ikke bilder eller videoer som er inkludert i tweets. Det er greit, fordi formålet mitt her er å skanne tekst, ikke å lage en Twitter-applikasjon på nytt. Men det betyr at det noen ganger vil være nyttig å se den originale tweeten for å se bilder, videoer eller kommentarer.

Jeg synes det er praktisk å legge til et lite klikkbart noe på slutten av hver tweets tekst som du kan klikke for å se den faktiske tweeten på Twitter. Jeg bestemte meg for >> selv om det kan være hvilken som helst karakter eller tegn.

For å konstruere en URL må jeg vite formatet på en tweet, som hvis du ser på en tweet på Twitter-nettstedet, kan du se er//twitter.com/username/status/tweetID. 

Ved å bruke limpakken blir det gjengitt slik:

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

Hvis du ikke har brukt lim før, er det en flott pakke for å lime sammen tekst og variable verdier. I koden ovenfor evalueres ethvert variabelnavn mellom klammeparenteser.

Min fulle kode for å lage en kolonne med en klikkbar lenke til tweetet etter tweetteksten:

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

Og koden for å lage en dataramme for en interaktiv tabell:

tweet_table_data%

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

mutere (

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

)%>%

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

Jeg vil også lage klikkbare lenker fra URL-kolonnen, som nå bare er tekst. Dette er litt komplisert, fordi URL-kolonnen er en listekolonne fordi noen tweets inneholder mer enn én URL.

Jeg er sikker på at det er en mer elegant måte å lage klikkbare lenker fra en listekolonne med nettadresser med ren tekst, men koden nedenfor fungerer. Først oppretter jeg en funksjon for å generere HTML hvis det ikke er URL-er, en URL eller to eller flere:

make_url_html <- funksjon (url) {

hvis (lengde (url) <2) {

hvis (! is.na (url)) {

som.karakter (lim ("{url}"))

} annet {

""

}

} annet {

lim inn 0 (purrr :: map_chr (url, ~ paste0 ("", .x, "", kollaps = ",")), kollaps = ",")

}

}

jeg løper purrr :: map_chr () på URL-verdien hvis det er to eller flere URL-er, slik at hver URL får sin egen HTML; så limer jeg dem sammen og kollapser dem i en enkelt tegnstreng for å vises i tabellen.

Når funksjonen min fungerer, bruker jeg purrr :: map_chr () igjen for å gjenta over hvert element i kolonnen:

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

Ikke bekymre deg hvis du ikke forstår denne delen, siden det egentlig handler om purrr og listekolonner enn rtweet og reagerbart. Og det er ikke nødvendig å søke og sortere tweets; Du kan alltid klikke på den originale tweeten og se klikkbare lenker der.

Endelig kan jeg kjøre min tilpassede reagerbar () kode på de nye tweetabeldataene:

reagerbar (tweet_table_data,

filtrerbar = SANT, søkbar = SANT, avgrenset = SANT, stripet = SANT, utheving = SANT,

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

kolonner = liste (

DateTime = colDef (defaultSortOrder = "asc"),

Bruker = colDef (defaultSortOrder = "asc"),

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

Liker = colDef (filtrerbar = FALSK, format = colFormat (skilletegn = SANT)),

RTs = colDef (filtrerbar = FALSE, format = colFormat (separatorer = SANT)),

URLer = colDef (html = TRUE)

)

)

Hvis du har fulgt med, bør du ha din egen interaktive tabell som kan søke, sortere og filtrere konferanse- eller emnet tweets.

Tips for twittersamlere

En ting å huske: Hvis du følger en konferanse-hashtag under en konferanse, vil du hente nok tweets for å få hele konferansen. Så sjekk den tidligste datoen i tweet-datarammen. Hvis denne datoen er etter at konferansen startet, be om flere tweets. Hvis konferansehashtaggen din har mer enn 18.000 tweets (som skjedde da jeg sporet CES), må du komme med noen strategier for å få hele settet. Sjekk ut retryonratelimit argument for search_tweets () hvis du vil samle hele 18.000+ sett med konferanse-hashtag-tweets som går 6 dager eller mindre tilbake

Til slutt, sørg for å lagre dataene dine i en lokal fil når konferansen avsluttes! En uke senere har du ikke lenger tilgang til disse tweets via search_tweets () og Twitter API.

Og sjekk ut bonusen "Gjør mer med R" -episoden for å se hvordan du kan gjøre denne Twitter-sporingsappen til en interaktiv skinnende app.

For flere R-tips, gå til Do More With R-siden på //bit.ly/domorewithR eller Do More With R-spillelisten på TECHtalk YouTube-kanalen.

$config[zx-auto] not found$config[zx-overlay] not found