如何在R中使用twitteR包提取推文地理编码

11

最近,Edwin Chen发布了一张很棒的地图,显示了使用soda、pop和coke这些词汇的区域分布情况,该地图是通过对涉及饮用情境下这些词汇的地理编码推文进行创建的。http://blog.echen.me/2012/07/06/soda-vs-pop-with-twitter/

他提到他在R中使用了Jeff Gentry创建的twitteR包。确实,很容易收集使用给定单词的推文并将它们放入数据框中:

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

数据框(tweets.df)将包含每个推文的用户ID、推文文本等内容,但似乎不包含地理编码。有没有办法在R中获得它?

您需要提供一个“geocode”给searchTwitter使用。请参阅库文档?searchTwitter - mindless.panda
1
我看到你可以在 searchTwitter 中提供地理编码和半径,但这并不会为每个拉取的推文生成地理编码。 - iantist
但是您有提供的地理编码,对吗?使用较小的半径可能会给您所需的结果吗? - mindless.panda
好主意,我明白你的意思。我可以遍历给定地图上的点网格。感谢您的建议。 - iantist
1
当你解决问题后,你应该回答自己的问题,这样其他人就可以看到你是如何解决的。我真的很喜欢你链接的帖子,但他们没有发布任何代码。=( - mindless.panda
我会继续努力并尝试制作一个软件包,同时我一定会发布代码。 - iantist
3个回答

4

地理编码是否意味着经度和纬度坐标?如果是,以下命令适用于我。

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

Source : LINK


3

我一直在研究一个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")

示例地图

我遇到了一些大问题,不太确定如何处理。首先,按照现在的代码编写方式,代码会搜索15个随机生成的位置,这些位置是从美国东部最大经度到最大西部、从最北端到最南端的均匀分布中生成的。这将包括不在美国范围内的位置,比如在加拿大明尼苏达州湖的东边。我希望能有一个函数来随机检查生成的位置是否在美国范围内,如果不在,则将其丢弃。更重要的是,我想搜索数千个位置,但Twitter不支持这样的操作会出现420错误增强您的冷静。因此,也许最好每隔几个小时搜索一次,并慢慢建立数据库并删除重复的推文。最后,如果你选择了一个非常受欢迎的主题,在R中会出现类似于Error in function (type, msg, asError = TRUE) : transfer closed with 43756 bytes remaining to read的错误。我有点不知道如何解决这个问题。


请努力解决这个问题,并在解决后发布...我也需要它。 - juggernauthk108
你能告诉我如何从通过 searchTwitter 获取的推文中提取经度和纬度吗?然后也许可以使用 这个 - juggernauthk108
我收到了一个错误信息:在doRppAPICall(“search/tweets”,n,params = params,retryOnRateLimit = retryOnRateLimit,:)中: 请求了15条推文,但API只能返回0。 - Selrac

2

这里有一个玩具示例,假设您每次只能提取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)
}

这个解决方案可能不太优雅,但是我能够根据特定的地理编码获取推文。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接