rtweet 및 R로 Twitter를 검색하는 방법

Twitter는 R에 대한 훌륭한 뉴스 소스입니다. 특히 useR과 같은 컨퍼런스에서 더욱 그렇습니다! 및 RStudio 컨퍼런스. R과 rtweet 패키지 덕분에 쉽게 검색, 정렬 및 필터링 할 수 있도록 트윗을 다운로드하는 자체 도구를 구축 할 수 있습니다. 단계별로 살펴 보겠습니다.

먼저 rtweet, reactable, glue, stringr, httpuv, dplyr 등 아직 가지고 있지 않은 rtweet 프로젝트의 패키지를 설치하려고합니다. 그런 다음 시작하려면 rtweet 및 dplyr을로드하십시오.

# 다음 중 하나를 설치해야하는 경우 :

# install.packages ( "rtweet")

# install.packages ( "reactable")

# install.packages ( "glue")

# install.packages ( "stringr")

# install.packages ( "httpuv")

# install.packages ( "dplyr")

# install.packages ( "purrr")

도서관 (rtweet)

도서관 (dplyr)

Twitter API 승인

rtweet을 사용하려면 특정 계정 자격 증명을 사용하도록 rtweet을 인증 할 수 있도록 Twitter 계정이 필요합니다. 15 분 동안 다운로드 할 수있는 트윗 수에 제한이 있기 때문입니다.

rtweet을 작성한 Michael Kearney는 rtweet 사용자에게 두 가지 선택 사항을 제공합니다. 가장 쉬운 방법은 단순히 트윗을 요청하는 것입니다. 시스템에 저장된 자격 증명이없는 경우 요청 승인을 요청하는 브라우저 창이 열립니다. 그 후에는 인증 토큰이 .Renviron 파일에 저장되므로 나중에 다시 인증 할 필요가 없습니다.

rtweet.info로 이동하여 Twitter 개발자 계정 및 새 프로젝트를 설정하여 인증 자격 증명을 생성하는 다른 방법을 볼 수 있습니다. rtweet을 많이 사용한다면 아마 그렇게하고 싶을 것입니다. 하지만 시작하려면 더 쉬운 방법이 더 쉽습니다.

트윗 가져 오기

특정 해시 태그 (또는 해시 태그가 아닌 구)가있는 트윗을 검색하려면 직관적으로 명명 된 s earch_tweets()함수 를 사용합니다 . #rstudioconf 또는 #rstats와 같은 쿼리를 포함하여 여러 인수가 필요합니다. 리트 윗 포함 여부; 그리고 반환 할 트윗의 수. 기본값은 100입니다.

15 분 이내에 최대 18,000 개의 트윗을 수신 할 수 있지만 Twitter API를 사용하여 단어 또는 구문을 검색 할 때 중요한 제한이 있습니다. 프리미엄 Twitter API 계정에 대한 비용을 지불하지 않는 한 검색 결과는 6 ~ 9 일만 되돌아갑니다. 트위터 웹 사이트와 달리, 작년 컨퍼런스에서 트윗을 검색하는 데 rtweet을 사용할 수 없습니다. 그 트윗을 얻기 위해 회의가 끝난 후 2 주 후에는 검색 할 수 없습니다 . 따라서 앞으로 가져 오는 트윗을 저장하고 싶을 것입니다.

검색을 사용자 지정하는 데 사용할 수있는 더 많은 인수가 있지만 기본 검색부터 시작하겠습니다. 리트 윗없이 #rstudioconf 해시 태그가있는 200 개의 트윗입니다.

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

include_rts = FALSE)

해당 코드를 실행하고 이전에 rtweet을 사용한 적이 없다면 Twitter 앱을 승인하라는 메시지가 표시됩니다.

200 개의 트윗을 요청하더라도 더 적은 수의 트윗을받을 수 있습니다. 한 가지 이유는 지난 6 ~ 9 일 동안 쿼리에 대해 200 개의 트윗이 없을 수 있기 때문입니다. 또 다른 하나는 트위터가 처음에 200 개의 트윗을 추출했을 수 있지만 리트 윗을 필터링 한 후에는 더 적은 수의 트윗이 남아 있다는 것입니다.

tweet_df 데이터 프레임은 각 트윗에 대해 90 개 열의 데이터와 함께 반환됩니다.

Sharon Machlis,

내가 일반적으로 가장 관심을 갖는 열은 status_id, created_at, screen_name, text, favorite_count, retweet_counturls_expanded_url입니다. 분석을 위해 다른 열이 필요할 수 있습니다. 하지만이 자습서에서는 해당 열만 선택하겠습니다. 

트윗 검색, 필터링 및 분석

Twitter 데이터 및 R로 할 수있는 흥미로운 시각화 및 분석이 많이 있습니다. 그중 일부는 rtweet에 바로 내장되어 있습니다. 하지만 저는 기술 저널리스트 모자를 쓰고이 튜토리얼을 작성하고 있습니다. 내가 모르는 새롭고 멋진 것들을 쉽게 볼 수있는 방법을 원합니다.

회의에서 가장 좋아하는 트윗이 도움이 될 수 있습니다. 그리고 rtweet과 Twitter API를 사용하면 Twitter의 "인기있는"알고리즘에 의존 할 필요가 없습니다. 내가 직접 검색하고 '인기'에 대한 내 자신의 기준을 설정할 수 있습니다. 컨퍼런스가 진행되는 동안 오늘의 인기 트윗을 검색하거나 "반짝이는"또는 "보라색"과 같은 관심있는 특정 주제를 가장 좋아하거나 가장 많이 리트 윗으로 정렬하여 필터링 할 수 있습니다.

이러한 종류의 검색 및 정렬을 수행하는 가장 쉬운 방법 중 하나는 정렬 가능한 테이블을 사용하는 것입니다. DT는이를위한 인기있는 패키지 중 하나입니다. 하지만 최근에 저는 반응 형이라는 또 다른 실험을하고 있습니다. 

기본값 reactable()은 일종의 blah입니다. 예를 들면 : 

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

도서관 (반응 가능)

반응 가능 (tweet_table_data)

이 코드는 다음과 같은 테이블을 생성합니다.

Sharon Machlis,

그러나 다음과 같은 사용자 지정을 추가 할 수 있습니다.

반응 가능 (tweet_table_data,

필터링 가능 = TRUE, 검색 가능 = TRUE, 테두리 있음 = TRUE,

스트라이프 = TRUE, 강조 표시 = TRUE,

defaultPageSize = 25, showPageSizeOptions = TRUE,

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

열 = 목록 (

created_at = colDef (defaultSortOrder = "asc"),

screen_name = colDef (defaultSortOrder = "asc"),

text = colDef (html = TRUE, minWidth = 190, 크기 조정 가능 = TRUE),

favorite_count = colDef (filterable = FALSE),

retweet_count = colDef (필터링 가능 = FALSE),

urls_expanded_url = colDef (html = TRUE)

)

)

결과는 다음과 같은 테이블입니다.

Sharon Machlis,

반응 가능한 데이터 테이블 구성 

위의 코드 청크에서 filterable = TRUE인수는 각 열 헤더 아래에 검색 필터를 searchable추가하고 오른쪽 상단에 전체 테이블 검색 상자를 추가했습니다. 켜기 bordered, striped그리고 highlight당신이 기대하는 것을 수행합니다을 추가 테이블의 테두리를 교류 행 색상 "줄무늬"와 하이라이트 당신이 그것에 커서를 넣을 경우 행을 추가합니다.

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.

이 Twitter 추적 앱을 대화 형 Shiny 앱으로 바꾸는 방법을 알아 보려면 보너스 "R로 더 많은 작업 수행"에피소드를 확인하십시오.

더 많은 R 팁을 보려면 //bit.ly/domorewithR의 Do More With R 페이지 또는 TECHtalk YouTube 채널의 Do More With R 재생 목록으로 이동하세요.