Für die Durchführung der Analysen wird ein Twitter-Account benötigt. Außerdem ist es notwendig, sich bei Twitter zu registrieren:
Installation der benötigten R-Pakete.
install.packages(c("devtools", "rjson", "httr", "purr", "tidytext", "ggplot2", "stringr", "wordcloud", "reshape2"))
library(devtools)
install_github("geoffjentry/twitteR")
Wir fügen nun die Twitter-Zugriffsdaten aus Schritt 1 ein (die bereits eingefügten Werte sind Platzhalter). Die Daten sollten nun in R-Studio rechts oben im Global Environment unter Values aufgeführt sein.
api.key <- 'HWEPGcSOPjP9My3Wcz7wQqFnt'
api.secret <- 'qIpXYo1W8E6TRUAK7FyHAhAbIVYWwp5ORnPgCJCLNfTyYWMkZ8'
access.token <- '842728750160777217-qDctgf6P9PXUtOMdOGK1wQFgs1mWD82'
access.token.secret <- 'C9lqfzl5u6g4rKh8eZOcowvM5W8PGuKokTxxtXzzxvZJV'
Wenn das folgende Skript ausgeführt wird, erscheint in der Konsole diese Meldung: “Using browser based authentication” Use a local file (‘.httr-oauth’), to cache OAuth access credentials between R sessions? “1” auswählen und Enter drücken.
library(rjson)
library(httr)
library(twitteR)
setup_twitter_oauth(api.key,api.secret)
[1] "Using browser based authentication"
Wir nutzen nun die userTimeline Funktion des twitteR Pakets um die 100 aktuellsten Tweets von Donald Trump zu laden. Damit wir damit arbeiten können, wandeln wir die Daten in einen Data Frame um.
library(dplyr)
library(purrr)
trump.tweets <- userTimeline("realDonaldTrump", n = 100)
trump.tweets.df <- tbl_df(map_df(trump.tweets, as.data.frame))
Die folgenden Inhalte orientieren sich an dem Buch Text Mining with R von Julia Silge und David Robinson. Dort finden Sie ausführliche Erklärungen zu allen folgenden Schritten.
Zuerst wird jedes Wort als einzelne Zeile in einem Data Frame (hier als trump.tweets.df2) abgespeichert.
library(tidytext)
trump.tweets.df2 <- trump.tweets.df %>%
unnest_tokens(word, text)
Wir entfernen nun alle Stoppwörter (insb. Artikel und Konjunktionen), da diese für die Analysen irrelevant sind.
data(stop_words)
trump.tweets.df2 <- trump.tweets.df2 %>%
anti_join(stop_words)
Joining, by = "word"
Nun könnne wir die häufigsten Wörter untersuchen.
trump.tweets.df2 %>%
count(word, sort = TRUE)
Wie wir sehen, kommen immer noch Wörter vor, die wir nicht analysieren möchten (z.B. https, t.co und amp). Diese werden nun in den Katalog der Stoppwörter mit aufgenommen. Wir erzeugen dafür einen neuen Katalog (custom.stop.words), welcher die ursprünglichen Stoppwörter (stop_words) und die von uns definierten Stoppwörter umfasst.
custom.stop.words <- bind_rows(data_frame(word = c("https", "t.co", "amp"),
lexicon = c("custom", "custom", "custom")),
stop_words)
trump.tweets.df2 <- trump.tweets.df2 %>%
anti_join(custom.stop.words)
Joining, by = "word"
head(custom.stop.words)
Visualisierung der Worthäufigkeiten mit ggplot2.
library(ggplot2)
trump.tweets.df2 %>%
count(word, sort = TRUE) %>%
filter(n > 5) %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n)) +
geom_col() +
xlab(NULL) +
coord_flip()
Nutzung des NRC-Lexikon, um die positiven Wörter in den Tweets zu bestimmen.
library(stringr)
nrc.positive <- get_sentiments("nrc") %>%
filter(sentiment == "positive")
trump.tweets.df2 %>%
inner_join(nrc.positive) %>%
count(word, sort = TRUE)
Joining, by = "word"
Die gleiche Vorgehensweise können wir für negative Wörter nutzen.
nrc.negative <- get_sentiments("nrc") %>%
filter(sentiment == "negative")
trump.tweets.df2 %>%
inner_join(nrc.negative) %>%
count(word, sort = TRUE)
Joining, by = "word"
Wir nutzen nun das Bing-Lexikon um sowohl positive als auch negative Wörter in einer Tabelle anzeigen zu lassen.
bing.word.counts <- trump.tweets.df2 %>%
inner_join(get_sentiments("bing")) %>%
count(word, sentiment, sort = TRUE) %>%
ungroup()
Joining, by = "word"
bing.word.counts
Visualisierung der Sentimentanalyse mit ggplot2.
bing.word.counts %>%
group_by(sentiment) %>%
top_n(10) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(y = "Contribution to sentiment",
x = NULL) +
coord_flip()
Selecting by n
Visualisierung der Sentinemtanalyse mit einer Wortwolke.
library(wordcloud)
Lade nötiges Paket: RColorBrewer
trump.tweets.df2 %>%
anti_join(stop_words) %>%
anti_join(custom.stop.words) %>%
count(word) %>%
with(wordcloud(word, n, max.words = 10))
Joining, by = "word"
Joining, by = "word"
Unterteilung der Wortwolke in negative und positive Wörter.
library(reshape2)
trump.tweets.df2 %>%
inner_join(get_sentiments("bing")) %>%
count(word, sentiment, sort = TRUE) %>%
acast(word ~ sentiment, value.var = "n", fill = 0) %>%
comparison.cloud(colors = c("#F8766D", "#00BFC4"),
max.words = 30)
Joining, by = "word"