R und Social
Media am Beispiel von Twitter®
Dozent: Dr. Guido Möser,
GF masem research institute GmbH
Workshop der Giessen R User Group
Geschäftsführer: Dr. Guido Möser
Wissenschaftlicher Beirat:
Prof. Dr. Peter Schmidt, Dr. Gero Schwenk
Stand: 09. Mai 2011
Inhalte R und Social Media am Beispiel von Twitter
• Literatur
• Social Media: Datengewinnung und Aufbereitung
• Anwendungen in R
• Twitter Search API Method
• Umsetzungsmöglichkeiten in R
– Pakete twitteR und XML
• Auswertungen in R - Textmining
• Diskussion
Literatur
Literatur
• Bollen, J., Mao, H., & Zeng, X.-J. (2010). Twitter mood predicts the
stock market.
• Feinerer, I. (2011). Package ‘tm‘.
• Lang, D. T. (2011). Package ‘XML‘.
• Feinerer, I. (2011). Introduction to the tm Package. Text Mining in R.
• Gentry, J. (2011). Twitter client for R.
• o.V. (2011). Twitter API Wiki: API Methods: Twitter Search API.
Method:search
• Blog: R-bloggers. Internet: http://www.r-bloggers.com
Social Media:
Datengewinnung und Aufbereitung
Datengewinnung und Aufbereitung
Data Processing
Web2.0
Daten-
quellen
CRAWLER
DATA
GATHERING
ETL
SUCH-
BEGRIFFE
RELEVANTE
QUELLEN
Web2.0
Warehouse
INTERFACE
MIT
DATENMATRIX
ROHDATEN
MUSTERTEXTEN
Analysen
Reporting
Datengewinnung
Tool: Radian 6®,
R® etc.
Optimal: IBM DB2® etc.
Mindestanforderung: MS Excel® R mit tm Paket,
...
...
Anwendungen in R
Anwendungen in R
• Text Data Mining with Twitter and R
– http://heuristically.wordpress.com/2011/04/08/text-data-mining-twitter-r/
• The structure of twitter participant relationships in conversations
around #Libya, #Bieber, and #Rstats
– http://www.babelgraph.org/wp/?p=120
• A quick look at #march11 / #saudi tweets
– http://www.michaelbommarito.com/blog/2011/03/12/a-quick-look-at-march11-
saudi-tweets/
• Dataset: Wisconsin Union Protester Tweets #wiunion
– http://www.michaelbommarito.com/blog/2011/02/21/dataset-wisconsin-union-
protester-tweets-wiunion/
Twitter® Search API Method
Twitter® Search API
• Twitter® Search API
– The API is entirely HTTP-based
– The API ... supports the following data formats: XML, JSON, ...
• Dokumentation Twitter® API:
– Twitter® exposes ist data via an Application Programming Interface (API).
– http://apiwiki.twitter.com/w/page/22554679/Twitter-API-Documentation
• Twitter Search API Method: search
– Returns tweets that match a specified query.
– Dokumentation: http://apiwiki.twitter.com/w/page/22554756/Twitter-Search-
API-Method:-search
Ref: http://apiwiki.twitter.com/w/page/22554679/Twitter-API-Documentation
http://apiwiki.twitter.com/w/page/22554756/Twitter-Search-API-Method:-search,
10.05.2011
Twitter® Search API - Limitations
• Search API Limit
– Clients may request up to 1,500 statuses…
– This artificial limit is in place to ensure the performance of the search system.
We also restrict the size of the search index by placing a date limit on the
updates we allow you to search. This limit varies depending on the number of
Tweets being created and the relevance of the results.
• REST API Rate Limiting
– Anonymous calls are based on the IP of the host and are permitted 150
requests per hour. This classification includes unauthenticated requests (such
as RSS feeds), and authenticated requests to resources that do not require
authentication.
– OAuth calls are permitted 350 requests per hour.
Ref: http://dev.twitter.com/pages/every_developer, 10.05.2011
http://dev.twitter.com/pages/rate-limiting; 10.05.2011
Beispiele - Twitter® Search API Method: search
• Containing a word:
– http://search.twitter.com/search.atom?q=twitter
• From a user:
– http://search.twitter.com/search.atom?q=from%3Aal3x
• Replying to a user (tweet starts with @mzsanford):
– http://search.twitter.com/search.atom?q=to%3Amzsanford
• Mentioning a user (tweet contains @rstats):
– http://search.twitter.com/search.atom?q=%40biz
Ref: http://apiwiki.twitter.com/w/page/22554756/Twitter-Search-API-Method:-search,
10.05.2011
Beispiele - Twitter® Search API Method: search
• Containing a hashtag (up to 16 characters)
– http://search.twitter.com/search.atom?q=%23haiku
• Combine any of the operators together.
– http://search.twitter.com/search.atom?q=happy+hour&until=2009-03-24
• Originating from an application:
– http://search.twitter.com/search.atom?q=landing+source:tweetie
Ref: http://apiwiki.twitter.com/w/page/22554756/Twitter-Search-API-Method:-search,
10.05.2011
Umsetzungsmöglichkeiten in R
Pakete XML / twitteR
Paket XML
• Twitter® API unterstützt XML (siehe Dokumentation)
• Mittels XML-Paket können geeignete Suchanfragen programmiert und
mittels http-request übergeben werden
• Die eigene Erzeugung nach den gezeigten Regeln des Tweitter® API
stellt die flexibelste Lösung dar, auf Probleme zugeschnittene Abfragen
zu erzeugen
• Dazu muss in R das XML Paket installiert werden
> install.packages('XML‘, dependencies = TRUE)
> library(XML)
Einfache Abfrage mittels XML-Paket (1)
• Zum Abspeichern der Tweets einen Vektor erzeugen
> req.tweets <- character(0)
• Abfrage erzeugen:
• Suchbegriff(e)
> twitter_q <- URLencode('rstats')
• URL für Abfrage erzeugen
> twitter_url =
paste('http://search.twitter.com/search.atom?q=',twitter_q,'&rpp=100&1=', 1,
sep='')
Ref: http://heuristically.wordpress.com/2011/04/08/text-data-mining-twitter-r/, 10.05.2011
Einfache Abfrage mittels XML-Paket
• Übergabe
> mydata.xml <- xmlParseDoc(twitter_url, asText=F)
• Titel extrahieren
> req.tweets <- xpathSApply(mydata.xml, '//s:entry/s:title', xmlValue,
namespaces =c('s'='http://www.w3.org/2005/Atom'))
• Anzahl der geernteten Tweets
> length(req.tweets)
Ref: http://heuristically.wordpress.com/2011/04/08/text-data-mining-twitter-r/, 10.05.2011
Erweiterungen - XML-Paket
• Der Block von Heuristic Andy legt um die Abfrage eine Schleife
herum, so dass eine größere Zahl an Tweets abgefragt werden
können, ohne Limits zu überschreiten
mydata.vectors <- character(0)
# paginate to get more tweets
for (page in c(1:15))
{
# search parameter
twitter_q <- URLencode('rstats')
# construct a URL
twitter_url = paste('http://search.twitter.com/search.atom?q=',twitter_q,'&rpp=100&page=', page, sep='')
# fetch remote URL and parse
mydata.xml <- xmlParseDoc(twitter_url, asText=F)
# extract the titles
mydata.vector <- xpathSApply(mydata.xml, '//s:entry/s:title', xmlValue, namespaces =c('s'='http://www.w3.org/2005/Atom'))
# aggregate new tweets with previous tweets
mydata.vectors <- c(mydata.vector, mydata.vectors)
}
Ref: http://heuristically.wordpress.com/2011/04/08/text-data-mining-twitter-r/, 10.05.2011
Beispiel - XML-Paket
• Suchbegriff rstats am 10. Mai 2011 um 15:51 Uhr
• Abruf der ersten 4 geernteten Tweets
> req.tweets[1:4]
[1] "@revodavid I have just recieved a box of goodies! Thank you in behalf of Serbian RUG!
@RevolutionR #rstats"
[2] "RT @Rbloggers: First-Cut Approach to Synchronizing Field Notes with GPS Data: After
a week's worth… http://goo.gl/fb/zjjgt #rstats"
[3] "RT @Rbloggers: making meat shares more efficient with R and Symphony: In my
previous post, I… http://goo.gl/fb/M3d8z #rstats"
[4] "RT @Rbloggers: Comments on an R Connections API: I wrote this post months ago but
never hit 'Publish… http://goo.gl/fb/eHDTJ #rstats"
Ref: http://heuristically.wordpress.com/2011/04/08/text-data-mining-twitter-r/, 10.05.2011
Paket twitteR
• Hinweis: Das Paket twitteR läuft nur eingeschränkt auf unter Windows 7
Systemen, die folgenden Analysen wurden mittels Ubuntu 8.04 erzeugt
– http://cran.r-project.org/web/packages/twitteR/
• Für das Paket steht eine umfangreiche Dokumentation zur Verfügung
– http://cran.r-project.org/web/packages/twitteR/twitteR.pdf
– http://cran.r-project.org/web/packages/twitteR/vignettes/twitteR.pdf
• Viele nützliche Abfragen sind bereits implementiert
• Auf eine Demonstration wird hier verzichtet!
Auswertungen in R mit Paket tm:
Text Mining
Das Paket tm
• Das Paket tm (Autor: Ingo Feinerer) stellt Möglichkeiten zur Durchführung
von Text Mining bereit
– http://cran.r-project.org/web/packages/tm/vignettes/tm.pdf
• Es steht eine ausführliche Dokumentation zur Verfügung
– http://cran.r-project.org/web/packages/tm/index.html
– http://cran.r-project.org/web/packages/tm/tm.pdf
• Das Paket muss zuerst installiert und geladen werden
> install.packages("tm", dependencies = TRUE)
> library(tm)
Der Datensatz aus Beispiel 1 (req.tweets) muss in R zur Verfügung stehen
Corpus erzeugen und Transformationen
• Corpus aus Twitter-Abfragen erzeugen (siehe Beispiele 1 und 2)
> mydata.corpus <- Corpus(VectorSource(req.tweets))
> mydata.corpus
• Transformation 1 - Kleinbuchstaben
> mydata.corpus <- tm_map(mydata.corpus, tolower)
• Satzzeichen entfernen
> mydata.corpus <- tm_map(mydata.corpus, removePunctuation)
• Entfernen der stopwords - generische und manuell vorgegebene
> my_stopwords <- c(stopwords('english'), 'rstats', '#rstats')
> mydata.corpus <- tm_map(mydata.corpus, removeWords, my_stopwords)
tdm erzeugen und inspizieren
• Term-Document Matrix bauen
> mydata.dtm <- TermDocumentMatrix(mydata.corpus)
• Inspizierung der Matrix
> mydata.dtm
• Matrizen erzeugen
> mydata.df <- as.data.frame(inspect(mydata.dtm))
Analysen
• Inspizierung der häufigsten Wörter
> findFreqTerms(mydata.dtm, lowfreq=3)
• Assoziationsanalyse
> findAssocs(mydata.dtm, 'quantmod', 0.20)
Reduzierte Matrizen
• Selten vorkommende Begriffe entfernen, um die Darstellung der Matrix zu
verbessern
– Hinweis: Den sparse Parameter ein wenig modifizieren, um eine gute Anzahl
an Wörtern zu finden
– 10 - 30 Wörter stellt eine gute Zahl dar, um noch den Überblick zu behalten
> mydata.dtm2 <- removeSparseTerms(mydata.dtm, sparse=0.95)
• Matrizen erzeugen
> mydata2.df <- as.data.frame(inspect(mydata.dtm2))
Diskussion
Vielen Dank für Ihre Aufmerksamkeit!