Подтвердить что ты не робот

Как извлечь твитовую геокодировку в пакет twitteR в R

В последнее время Эдвин Чэнь опубликовал отличную карту регионального использования соды против поп-кокса, созданной из геокодированных твитов, в которой эти слова употребляются в контексте употребления алкоголя. http://blog.echen.me/2012/07/06/soda-vs-pop-with-twitter/

Он упоминает, что использовал пакет twitteR, созданный Джеффом Джентри в R. Конечно же, легко собрать твиты, которые используют данное слово и помещают их в кадр данных:

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

dataframe (tweets.df) будет содержать идентификатор пользователя, текст твита и т.д. для каждого твита, но не содержит геокода. Любая идея о том, как ее получить в R?

4b9b3361

Ответ 1

Указывает ли геокод координата долготы и широты? Если да, для меня работают следующие команды.

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

Источник: ССЫЛКА

Ответ 2

Я занимался функцией R, вы вводите текст поиска, количество поисковых сайтов и радиус вокруг каждого сайта. Например twitterMap("#rstats",10,"10mi") здесь код:

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

Есть некоторые большие проблемы, с которыми я столкнулся, что я не уверен, как с этим бороться. Во-первых, как написано, код ищет 15 разных случайно созданных местоположений, эти местоположения генерируются из равномерного распределения от максимальной долготы на восток в США до максимального запада и от широты к северу до самого дальнего юга. Это будет включать в себя места не в Соединенных Штатах, скажем, к востоку от озера миннесоты в Канаде. Мне нужна функция, которая случайно проверяет, создано ли сгенерированное местоположение в США и отбрасывает ее, если это не так. Что еще более важно, я бы хотел найти тысячи мест, но твиттер не любит этого и дает мне 420 error enhance your calm. Поэтому, возможно, лучше всего каждые несколько часов искать и медленно создавать базу данных и удалять повторяющиеся твиты. Наконец, если вы выбираете удаленно популярную тему, R дает ошибку, например, Error in function (type, msg, asError = TRUE) : transfer closed with 43756 bytes remaining to read. Я немного озадачен тем, как обойти эту проблему.

Ответ 3

Вот пример игрушки, учитывая, что вы можете извлечь только 100 твитов за звонок:

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

Это решение может быть не слишком изящным, но я смог получить твиты, заданные определенным геокодом.