2012-07-26 15 views
11

Recentemente Edwin Chen ha registrato una grande mappa della utilizzo regionale di soda pop vs vs coca creato da tweets geocodificati inolving quelle parole nel contesto di bere. http://blog.echen.me/2012/07/06/soda-vs-pop-with-twitter/Come estrarre Tweet geocode nel pacchetto di Twitter in R

Dice che ha usato il pacchetto di Twitter creato da Jeff Gentry in R. Certo, basta, è facile raccogliere tweets che utilizzano una data parola e metterli in un dataframe:

require(twitteR) 
require(plyr) 
cat.tweets<-searchTwitter("cats",n=1000) 
tweets.df = ldply(cat.tweets, function(t) t$toDataFrame()) 

il dataframe (tweets.df) conterrà l'id utente, tweet testo, ecc. per ogni tweet, ma non sembra contenere il codice geografico. Qualche idea su come ottenerlo in R?

+0

è necessario fornire un '' geocode' per searchTwitter' da usare. Vedi la documentazione della biblioteca '? SearchTwitter'. –

+1

vedo che si può fornire un geocode e il raggio in 'searchTwitter' ma che non produce un geocode per ogni tweet tirato. – iantist

+0

ma avresti il ​​geocode che hai fornito, giusto? con un raggio più piccolo potrebbe darti quello che ti serve? –

risposta

2

Ecco un esempio di giocattolo, visto che è possibile estrarre solo 100 tweets al bando:

require(twitteR) 
require(plyr) 
URL = paste('http://search.twitter.com/search.atom? 
     q=','&geocode=39.724089,-104.820557,3mi','&rpp=100&page=', page, sep='') #Aurora,CO with radii of 3mi 
XML = htmlTreeParse(URL, useInternal=TRUE) 
entry = getNodeSet(XML, "//entry") 
tweets = c() 

for (i in 1:99){ 
    t = unlist(xpathApply(entry[[i]], "//title", xmlValue)) 
    tweets = c(tweets,t) 
} 

Questa soluzione non potrebbe essere troppo elegante, ma sono stato in grado di ottenere i tweet dato particolare geocodifica.

3

Ive armeggiare intorno con una funzione di R, si entra nel testo di ricerca, il numero di siti di ricerca, e il raggio intorno ad ogni sito. Per esempio twitterMap("#rstats",10,"10mi") Ecco il codice:

twitterMap <- function(searchtext,locations,radius){ 
require(ggplot2) 
require(maps) 
require(twitteR) 
#radius from randomly chosen location 
radius=radius 
lat<-runif(n=locations,min=24.446667, max=49.384472) 
long<-runif(n=locations,min=-124.733056, max=-66.949778) 
#generate data fram with random longitude, latitude and chosen radius 
coordinates<-as.data.frame(cbind(lat,long,radius)) 
coordinates$lat<-lat 
coordinates$long<-long 
#create a string of the lat, long, and radius for entry into searchTwitter() 
for(i in 1:length(coordinates$lat)){ 
coordinates$search.twitter.entry[i]<-toString(c(coordinates$lat[i], 
coordinates$long[i],radius)) 
} 
# take out spaces in the string 
coordinates$search.twitter.entry<-gsub(" ","", coordinates$search.twitter.entry , 
fixed=TRUE) 

#Search twitter at each location, check how many tweets and put into dataframe 
for(i in 1:length(coordinates$lat)){ 
coordinates$number.of.tweets[i]<- 
length(searchTwitter(searchString=searchtext,n=1000,geocode=coordinates$search.twitter.entry[i])) 
} 
#making the US map 
all_states <- map_data("state") 
#plot all points on the map 
p <- ggplot() 
p <- p + geom_polygon(data=all_states, aes(x=long, y=lat, group = group),colour="grey",  fill=NA) 

p<-p + geom_point(data=coordinates, aes(x=long, y=lat,color=number.of.tweets 
            )) + scale_size(name="# of tweets") 
p 
} 
# Example 
searchTwitter("dolphin",15,"10mi") 

example map

Ci sono alcuni grandi problemi che ho incontrato che non sono sicuro di come affrontare. In primo luogo, come ha scritto il codice cerca 15 luoghi diversi generati casualmente, queste posizioni sono generati da una distribuzione uniforme della massima longitudine est negli Stati Uniti al massimo ad ovest, e la latitudine più a nord al più a sud. Ciò includerà le posizioni non negli stati uniti, ad esempio appena ad est del lago del bosco del Minnesota in Canada. Mi piacerebbe una funzione che controlli a caso per vedere se la posizione generata è negli Stati Uniti e scartarla se non lo è. Ancora più importante, mi piacerebbe cercare migliaia di posizioni, ma a Twitter non piace e mi dà un 420 error enhance your calm. Quindi forse è meglio cercare ogni poche ore e lentamente costruire un database ed eliminare i tweet duplicati. Infine, se si sceglie un argomento diffuso a distanza, R restituisce un errore come Error in function (type, msg, asError = TRUE) : transfer closed with 43756 bytes remaining to read. Sono un po 'sconcertato su come aggirare questo problema.

+0

si prega di lavorare su di essa ... .e dopo quando il suo capito ... anche ho bisogno – juggernaut1996

+0

puoi dirmi come estrarre la longitudine e la latitudine dai tweet che vengono sottoposti a 'searchTwitter', quindi potresti usare [this] (http: //www.mapbox.com) – juggernaut1996

+0

Ricevo un messaggio di errore: In doRppAPICall ("search/tweets", n, params = params, retryOnRateLimit = retryOnRateLimit,: 15 tweet sono stati richiesti ma l'API può restituire solo 0 – Selrac

4

Vuol dire geocode longitudine e latitudine coordinate? Se sì, i seguenti comandi funzionano per me.

cat.tweets = searchTwitter("cats",n=1000) 
tweets.df = do.call("rbind",lapply(cat.tweets,as.data.frame)) 

Fonte: LINK

+0

Che bello che questo faccia sembra funzionare ... Grazie. – beroe