2012-07-26 10 views
11

Niedawno Edwin Chen opublikował świetną mapę regionalnego wykorzystania sody vs pop vs koksu stworzonego z geokodowanych tweetów umieszczających te słowa w kontekście picia. http://blog.echen.me/2012/07/06/soda-vs-pop-with-twitter/Jak wyodrębnić geokodowanie tweeta w pakiecie twitteR w R

Wspomina, że ​​kiedyś pakiet Twitter stworzony przez Jeffa Gentry w R. na pewno wystarczy, nie jest łatwo zebrać tweety, które używają danego słowa i umieścić je w dataframe:

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

dataframe (tweets.df) będzie zawierał identyfikator użytkownika, tekst tweet itp. dla każdego tweeta, ale nie zawiera geokodu. Masz pomysł, jak zdobyć go w R?

+0

Trzeba zapewnić 'geocode' dla' searchTwitter' użyć. Zobacz dokumentację biblioteki '? SearchTwitter'. –

+1

Widzę, że możesz podać geokodę i promień w 'searchTwitter', ale to nie generuje geokod dla każdego ściągniętego tweeta. – iantist

+0

ale będziesz mieć dostarczony geokod, prawda? z mniejszymi promieniami, które mogą dać ci to, czego potrzebujesz? –

Odpowiedz

2

Oto przykład zabawki, biorąc pod uwagę, że można wyodrębnić tylko 100 tweety na rozmowy:

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) 
} 

To rozwiązanie nie może być zbyt eleganckie, ale udało mi się dostać tweets zwrócić szczególną geocode.

3

Używałem funkcji R, wpisujesz tekst wyszukiwania, liczbę stron wyszukiwania i promień wokół każdej witryny. Na przykład twitterMap("#rstats",10,"10mi") oto kod:

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

Są duże problemy z jaką się spotkałem, że nie wiem, jak sobie poradzić. Po pierwsze, jak napisano, kod przeszukuje 15 różnych losowo wygenerowanych lokalizacji, te lokalizacje są generowane z jednolitego rozkładu od maksymalnej długości geograficznej na wschód w USA do maksymalnego zachodu i szerokości geograficznej najdalej na północ do najdalej na południe. Dotyczy to lokalizacji nie w Stanach Zjednoczonych, na przykład na wschód od jeziora w lesie Minnesota w Kanadzie. Chciałbym funkcji, która losowo sprawdza, czy wygenerowana lokalizacja jest w USA i odrzuć ją, jeśli nie jest. Co ważniejsze, chciałbym przeszukać tysiące lokalizacji, ale Twitter nie lubi tego i daje mi 420 error enhance your calm. Więc może najlepiej jest wyszukiwać co kilka godzin i powoli budować bazę danych i usuwać duplikaty tweetów. Na koniec, jeśli ktoś wybierze zdalny temat, R daje błąd, taki jak Error in function (type, msg, asError = TRUE) : transfer closed with 43756 bytes remaining to read. Jestem trochę zaskoczony, jak obejść ten problem.

+0

proszę o pracę nad nim ... i opublikuj, gdy zorientujesz się ... nawet ja tego potrzebuję – juggernaut1996

+0

czy możesz mi powiedzieć, jak wyodrębnić długość i szerokość geograficzną z tweetów, które są pobierane z 'searchTwitter', wtedy możesz użyć [this] (http: //www.mapbox.com) – juggernaut1996

+0

Otrzymuję komunikat o błędzie: W doRppAPICall ("szukaj/tweety", n, params = params, retryOnRateLimit = retryOnRateLimit,: 15 tweetów było żądanych, ale API może tylko zwrócić 0 – Selrac

4

Czy geokod to średnia długość i szerokość geograficzna? Jeśli tak, następujące polecenia działają dla mnie.

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

Źródło: LINK

+0

To fajne, że to robi wydaje się działać ... Dzięki. – beroe

Powiązane problemy