微博提取关键词Rweibo
本文写于2013年
从Rweibo包发布就一直想折腾一下,这次总算是实现了一些想法,借助Rweibo可以在R里面调用微博api,获取微博上的数据,我要做的是对我发布过的微博文本提取关键词。
在Rweibo包的官方主页上有下载和安装包,并注册新浪微博应用的详细教程,然后就可以进行授权
roauth <- createOAuth(app_name = "Rfortest", access_name = "wengyjcz")
接下来获取指定微博名所发布的微博
Wtext <- rep(1:2000,0);
res <- statuses.user_timeline(roauth, screen_name = "wengyjcz", count = 100);
count
指获取微博的数量,api限制每次最多只能获取100条,想要获取全部微博只能多次调用
Wtext[1:100] <- lapply(res, function(x) c(x$text));
lmid <- rep(res[[100]]$idstr,times=13);
for (i in 1:12) {
res<-statuses.user_timeline(roauth, screen_name = "wengyjcz", max_id=lmid[i],count = 100);
Wtext[(i*100+1):(i*100+100)]<-lapply(res,function(x) c(x$text));
lmid[i+1]<-res[[100]]$idstr;
}
获取微博之后输出到文件
uWtext<-unique(Wtext);
uWtext<-as.matrix(uWtext);
write.table(uWtext,file="weibotext.txt",quote=FALSE,row.names=FALSE,col.names=FALSE,fileEncoding = "UTF-8");
接下来对微博文本进行整理,去除文本中的四类内容:
- 转发中别人微博里的内容
- @到的人的名称
- 话题
- 表情
- 链接
用下面代码(perl)进行处理
#! /usr/bin/perl
open(weibotext,"C:\\Users\\yj\\Desktop\\weibotext.txt");
@array=<weibotext>;
foreach(@array){
s/#.*#//;
s/\[.*\]//;
s/http.*\b//;
s/\/\/.*//;
s/@.*\b//;
s/@.*://;
s/@.*//;
}
open(weiboperl,"> C:\\Users\\yj\\Desktop\\weiboperl.txt");
print weiboperl @array
~~~perl
文本整理完之后,可以进行分词并提取频率最高的部分词语
library('Rwordseg');
library('stringr');
library('wordcloud');
data<-scan('C:\\Users\\yj\\Desktop\\weiboperl.txt',what=character());
segdata<-segmentCN(data,nature=TRUE);
segdata<-unlist(segdata);
idata<-unique(segdata);
textdata<-segmentCN(data);
textdata<-unlist(textdata);
alltext<-str_c(textdata,sep="",collapse="");
sn<-segmentCN(idata,nature=TRUE);
wordcou<-rep("",times=3806*3);
dim(wordcou)<-c(3806,3);
for (i in 1:3806){
wordcou[i,1]<-idata[i];
wordcou[i,2]<-str_count(alltext,idata[i]);
nsn<-names(sn[[i]]);
if(length(nsn)>0){
wordcou[i,3]<-nsn[1];
}
}
out<-wordcou[order(as.numeric(wordcou[,2]),decreasing=TRUE),];
show<-out[2:51,];
wordcloud(show[,1],as.numeric(show[,2]));
以上代码已经整理出出现频率最大的50个词,并画出可视化图像

感觉对结果不满意,似乎不能表现出我的微博中经常提起的主题,又剔除了虚词的部分
nkeep<-c("v","n","nr","a","t","s","ns","en","uv","vg","ng","j","b","ug","l","nz","z","o","vn","tg","ag","an","vd","i","g","vq","h","nt");
wordcou2<-rep("",times=12000);
dim(wordcou2)<-c(4000,3);
k=1;
for(i in 1:28){
for(j in 1:3806){
if(nkeep[i]==wordcou[j,3]){
wordcou2[k,]=wordcou[j,];
k=k+1;
}
}
}
out2<-wordcou2[order(as.numeric(wordcou2[,2]),decreasing=TRUE),];
show2<-out2[2:51,];
wordcloud(show2[,1],as.numeric(show2[,2]));
但是结果虽然有了变化,但似乎没什么改善。。。

现在的结果还没有达到预期的效果,下一步会引入其他词库并逐步解决现有的问题。
Note:
- user_timeline其实可以获取总微博数,但是这里循环次数没有用到总微博数,而是直接按接近微博总数取1200,这样会在运行过程中出现一点小错误,运行结果会有一些微博重复保存,因此用`unique`去除重复的,但这样又会损失一些重复的微博。
- perl代码其实没有很好地完成文本整理的几个目标,1)@后面的微博名如果是中英文都有,如@abc张三,只能去除到英文部分,2)@XX后面没有空格的,如@优酷网)……,由于@优酷网后面没接空格,后面的内容都会被删除。
- 本文中使用到的分词的词性是各个分词提取出来后,再用一次`segmentCN`得出来的词性,当词性不止一个时选取第一个,因而词的词性可能与处在原微博语言环境中的词性不同,而同一个词本来可能有不同词性,这里也没有区别开。
---------------------------------------------------
2014.12 用最新的微博文本数据并加载了新的词库,结果有所改进但并不明显。