כיצד לחפש טוויטר באמצעות rtweet ו- R.

טוויטר הוא מקור נהדר לחדשות על R - במיוחד במהלך כנסים כמו useR! וכנס RStudio. ובזכות R וחבילת rtweet, אתה יכול לבנות כלי משלך להורדת ציוצים לחיפוש, מיון וסינון קלים. בואו נסתכל, שלב אחר שלב.

ראשית ברצונך להתקין את כל החבילות של פרויקט rtweet שאין לך: rtweet, reactable, דבק, stringr, httpuv ו- dplyr. ואז כדי להתחיל, טען rtweet ו- dplyr.

# אם אתה צריך להתקין אחד מאלה:

# install.packages ("rtweet")

# install.packages ("מגיב")

# install.packages ("דבק")

# install.packages ("stringr")

# install.packages ("httpuv")

# install.packages ("dplyr")

# install.packages ("purrr")

ספרייה (rtweet)

ספרייה (dplyr)

אשר את ה- API של טוויטר

כדי להשתמש ב- rtweet, אתה זקוק לחשבון טוויטר כדי שתוכל לאשר ל- rtweet להשתמש בכניסה האישית הספציפית שלך. הסיבה לכך היא שיש מגבלה לכמה ציוצים תוכלו להוריד בפרק זמן של 15 דקות.

מייקל קירני, שכתב rtweet, נותן למשתמשי rtweet שתי אפשרויות. הדרך הקלה ביותר היא פשוט לבקש כמה ציוצים. אם אין אישורים המאוחסנים במערכת שלך, חלון דפדפן אמור להיפתח ומבקש ממך לאשר את הבקשה. לאחר מכן, יישמר אסימון הרשאה בקובץ ה- .Renviron כך שלא תצטרך לאשר מחדש בעתיד.

אתה יכול ללכת לכתובת rtweet.info כדי לראות את השיטה האחרת, הכוללת הגדרת חשבון מפתח טוויטר ופרויקט חדש ליצירת אישורי הרשאה. אם אתה הולך להשתמש ב- rtweet הרבה, סביר להניח שתרצה לעשות זאת. אבל כדי להתחיל, הדרך הקלה יותר היא, ובכן, קלה יותר.

ייבא ציוצים

כדי לחפש ציוצים עם hashtag ספציפי (או ביטוי שאינו hashtag), אתה משתמש earch_tweets()בפונקציה s ששמה אינטואיטיבי . נדרשים מספר טיעונים, כולל השאילתה, כגון #rstudioconf או #rstats; אם ברצונך לכלול ציוצים מחדש; ומספר הציוצים שיש לחזור. המספר כברירת מחדל הוא 100.

אמנם אתה יכול לקבל עד 18,000 ציוצים תוך 15 דקות, אך קיימת מגבלה חשובה כאשר אתה משתמש בממשק ה- API של Twitter לחיפוש מילה או ביטוי: תוצאות החיפוש חוזרות רק שישה עד תשעה ימים, אלא אם כן אתה משלם עבור חשבון פרמיום API של Twitter. בניגוד לאתר טוויטר, אינך יכול להשתמש ב- rtweet לחיפוש ציוצים מכנס בשנה שעברה. לא תוכל לחפש שבועיים לאחר כנס כדי לקבל את הציוצים האלה. אז תרצה להקפיד לשמור טוויטים שאתה מושך עכשיו שאולי תרצה בעתיד.

ישנם ארגומנטים נוספים שבהם אתה יכול להשתמש כדי להתאים אישית את החיפוש שלך, אך נתחיל בחיפוש בסיסי: 200 ציוצים עם ההאשטאג #rstudioconf, ללא ציוצים מחדש.

tweet_df <- חיפוש_טוויטים ("# rstudioconf", n = 200,

include_rts = FALSE)

אם אתה מפעיל קוד זה ומעולם לא השתמשת ב- rtweet לפני כן, תתבקש לאשר אפליקציית טוויטר.

שים לב שלמרות שאתה מבקש 200 ציוצים, ייתכן שתחזור פחות. אחת הסיבות היא שלא יתכנו 200 ציוצים לשאילתה בששת עד תשעה הימים האחרונים. דבר נוסף הוא שאולי בטוויטר אמנם חילצו 200 ציוצים, אך לאחר סינון ציוצים, נותרו פחות.

מסגרת הנתונים tweet_df חוזרת עם 90 עמודות נתונים לכל ציוץ:

שרון מכליס,

העמודות שאני בדרך כלל הכי מתעניינות בהן הן status_id, created_at, screen_name, text, favorite_count, retweet_count ו- urls_expanded_url. אולי תרצה עוד כמה עמודות לניתוח שלך; אך עבור הדרכה זו, אבחר בדיוק בעמודות האלה. 

חפש, סנן ונתח את הציוצים שלך

יש המון ויזואליזציות וניתוחים מעניינים שאתה יכול לעשות עם נתוני טוויטר ו- R. חלקם מובנים ממש לתוך rtweet. אבל אני כותב את ההדרכה הזו עם כובע העיתונאי הטכנולוגי שלי. אני רוצה דרך קלה לראות דברים חדשים ומגניבים שאולי לא אדע עליהם.

ציוצים אהובים ביותר מכנס עשויים לעזור בכך. ואם אני משתמש ב- rtweet וב- API של Twitter, אני לא צריך להסתמך על האלגוריתם ה"פופולרי "של טוויטר. אני יכול לעשות חיפושים משלי ולקבוע קריטריונים משלי ל"פופולרי ". ייתכן שתרצה לחפש ציוצים מובילים בדיוק מהיום הנוכחי תוך כדי ועידה, או לסנן נושא ספציפי שאני מעוניין בו - כמו "מבריק" או "מגרגר" - ממוינים לפי רוב הלייקים או רוב התוכניות השונות.

אחת הדרכים הקלות ביותר לבצע חיפושים ומיונים מסוג זה היא באמצעות טבלת מיון. DT הוא חבילה פופולרית אחת לכך. אבל לאחרונה אני מתנסה בעוד אחד: מגיב. 

ברירת המחדל reactable()היא סוג של בלה. לדוגמה: 

tweet_table_data <- בחר (tweets, -user_id, -status_id)

ספרייה (בתגובה)

ניתן להגיב (tweet_table_data)

קוד זה מייצר טבלה שנראית כך:

שרון מכליס,

אך אנו יכולים להוסיף מספר התאמות אישיות, כגון:

ניתן להגיב (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"),

טקסט = colDef (html = TRUE, minWidth = 190, resizable = TRUE),

favorite_count = colDef (ניתן לסינון = FALSE),

retweet_count = colDef (ניתן לסינון = FALSE),

urls_expanded_url = colDef (html = TRUE)

)

)

התוצאה היא טבלה שנראית כך:

שרון מכליס,

הגדר את טבלת הנתונים הניתנים לתגובה 

בנתח הקוד שלמעלה, 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.

ובדק את פרק הבונוס "עשה יותר עם R" כדי לראות כיצד להפוך את אפליקציית המעקב הזו לטוויטר לאפליקציה מבריקה אינטראקטיבית.

לקבלת טיפים נוספים בנושא R, היכנס לדף Do More With R בכתובת //bit.ly/domorewithR או לרשימת ההשמעה Do More With R בערוץ YouTube.