Twitter-mining mit R – Teil 2 – Einfache Wordclouds
Hier wird gezeigt, wie in R Twitterdaten zu einfachen Wordclouds verarbeitet werden können. Wordclouds visualisieren die Häufigkeit von Wörtern, die mit einem bestimmten Wort (einem Hashtag oder Suchbegriff) zusammen genannt werden.
Die Basis für die Visualisierung sind Daten, die über die Rest-API von Twitter abgerufen werden (Siehe: https://statistics.ohlsen-web.de/twitter-mining-teil1/).
#----------------------------------------------------- # --- Mit Twitter verbinden --- #----------------------------------------------------- library(twitteR) # Authentifizierungsschlüssel eingeben api_key <- "**************************" api_secret <- "***************************" access_token <- "*****************************" access_token_secret <- "******************************" setup_twitter_oauth(api_key,api_secret,access_token,access_token_secret) #--- Suchabfrage: 450 tweets mit dem Hashtag #rstats --- tweets<-searchTwitter("christmas",n=450)) tweets
Textkorpus für Wordcloud erstellen
Die Datenbasis für die Wordcloud haben wir jetzt. Jetzt benötigen wird die tm-library (textmining), um den Wortkorpus zu erstellen. Anschließend wird mit der wordcloud-library die Häufigkeit als Wordcloud erstellt. Das Paket RColorBrewer bietet verschiedene Farbschemas an, die genutzt werden können, wenn die Standardfarbgebung nicht gefällt.
library(tm) library(wordcloud) library(RColorBrewer) #Tweet-Text extrahieren tweet.tex<-sapply(tweets, function(x) x$getText()) #Aufgrund von emoticons &co gibt es manchmal probleme. #Das liegt daran, dass wir eine UTF-8 Codierung nutzen, viele chinesische Symbole, mathematische Symbole und Emoji-icons #länger als 4 bytes sind und zudem keine kleingeschriebene Variante enthalten. #Hier ist ein Workaround, um solche Zeichen zu übergehen:
http://gastonsanchez.com/blog/how-to/2012/05/29/Catching-errors-when-using-tolower.html
tryTolower = function(x) { # create missing value # this is where the returned value will be y = NA # tryCatch error try_error = tryCatch(tolower(x), error = function(e) e) # if not an error if (!inherits(try_error, "error")) y = tolower(x) return(y) } tweet.text<-sapply(tweet.text, function(x) tryTolower(x)) ## Wortkorpus erstellen tweet.corpus<-Corpus(VectorSource(enc2utf8(tweet.text))) # removing numbers, punctuation symbols, lower case, etc. tdm = TermDocumentMatrix(tweet.corpus, control = list(removePunctuation = TRUE, stopwords = c("follow"),removeNumbers = TRUE, tolower = TRUE)) #Worthäufigkeiten ermitteln # define tdm as matrix m = as.matrix(tdm) # get word counts in decreasing order word_freqs = sort(rowSums(m), decreasing=TRUE) # create a data frame with words and their frequencies dm = data.frame(word=names(word_freqs), freq=word_freqs)
Grafik plotten
wordcloud(dm$word, dm$freq, random.order=FALSE, colors=brewer.pal(8, "Dark2"))
Im Code für die TermDocumentMatrix gibt es das „stopwords(kind = „en“)“-Argument. Stopwords sind Worte, die aus der Wordcloud ausgeschlossen werden sollen, weil sie so häufig vorkommen und daher nicht informativ sind. Stopwords sind für verschiedene Sprachen verfügbar (danish, dutch, english, finnish, french, german, hungarian, italian, norwegian, portuguese, russian, spanish, and swedish).
Wenn die Wordcloud zuviele einzelne Nennungen enthält, kann man z.B. mit min.freq=3 festlegen, dass nur Wörter angezeigt werden, die mindestens drei mal in der Wortliste enthalten sind.
wordcloud(dm$word, dm$freq, random.order=FALSE, colors=brewer.pal(3, "Dark2"),min.freq=3,max.words=100) png("c:/wordcloud.png", width=800,height=800)
Mehrfache Berücksichtigung von Accounts
Mir ist aufgefallen, dass die Häufigkeit mancher Wörter aus Retweets resultiert. Besonders die jugendlichen Follower/Fans von bekannten Youtubern wie der Slimani-Familie scheinen Weltmeister im Retweeten jeder noch so kleinen Äußerung ihrer Vorbilder zu sein. Dieses Problem kann auch durch sogenannte „Retweet-Bots“ entstehen, die automatisiert alle Tweets mit einem bestimmten Wortinhalt retweeten.
Möglicherweise möchte man solche Accounts aus der Wordcloud ausfiltern. Zur Demonstration hier eine Grafik mit den TwitterAccounts, die durch Retweets den größten Anteil an der Wordcloud haben.
Hier der R-Code für die Grafik
#----------------------------------------------------- # --- Welche Accounts haben den höchsten Anteil an den tweets #----------------------------------------------------- library(dplyr) library(ggplot2) #rohtweets zu dataframe umwandeln tweets.df<-twListToDF(tweets) counts<-as.data.frame(table(tweets.df$screenName)) #Mit dplyr nach Häufigkeit sortieren und top 5% auswählen counts<- counts %>% arrange(desc(Freq)) %>% filter(cume_dist(desc(Freq)) < 0.05) #erweiterte Farbpalette(Quelle: http://novyden.blogspot.de/2013/09/how-to-expand-color-palette-with-ggplot.html) library(RColorBrewer) colourCount<-length(unique(counts$Var1)) myPalette<-colorRampPalette(brewer.pal(9, "Blues")) #counts<-as.factor(counts$Freq) ggplot(counts, aes(reorder(Var1, Freq),Freq,fill=Var1)) + geom_bar(stat="identity") + coord_flip()+ theme_bw()+theme(legend.position="none") + xlab("Twitter-Accounts") + ylab("Häufigkeit") + scale_fill_manual(values = myPalette(colourCount))
Hier geht es weiter mit Teil 3 – Comparison Wordclouds.