一、背景
利用R呈现《水浒传》人物关系网络图
二、技术路线
思路:以在同一段出现的共现关系,绘制人物关系网络图
工具:R
三、过程
1. 预定义函数
#读取文件内容函数
get.content<-function(file.path){
return (scan(file.path,sep='\n',what='character'))
}
#从termlist中筛选出words,返回词项列表
get.intersect.terms<-function(termlist,words){
heros<-list()
heros<-lapply(1:length(termlist),function(i) heros[[i]]<-intersect(termlist[[i]],words))
hero.clean<-list()
j<-1
for (i in (1:length(heros))){
if(length(heros[[i]]>1)){
hero.clean[[j]]=heros[[i]]
j=j+1
}
}
return (hero.clean)
}
#获取输入向量元素间的两两关系
get.relationship<-function(termvector){
a<-NULL
len<-length(termvector)
if(len>1){
for (i in 1:(len-1))
for (j in (i+1):len)
a<-append(a,c(termvector[i],termvector[j]))
}
return (a)
}
2. 实现:
library(tm)
library(Rwordseg)
words<-get.content('水浒人名.txt')
insertWords(words) #作为临时分词词项使用
sh.data<-get.content('水浒传.txt')
segwords.list<-segmentCN(sh.data)
co.heros<-get.intersect.terms(segwords.list,words)
co.heros<-lapply(co.heros,function(i) get.relationship(i))
co.heros<-unlist(co.heros)
co.matrix<-matrix(co.heros,ncol=2,byrow=TRUE)
write.csv(co.matrix,'水浒.csv',row.names=FALSE)
也可以将上述过程封装成一个函数:
#读取文件,返回words参数中定义的词项间共现关系列表
auto.getrls<-function(file.path,words){
file.data<-get.content(file.path)
file.term<-segmentCN(file.data) #分词
file.terms<-get.intersect.terms(file.term,words) #获取交集
file.terms.rls<-lapply(file.terms,function(i) get.relationship(i)) #获取词项间关系
file.terms.rls<-unlist(file.terms.rls) #将列表转换为向量
return (file.terms.rls)
}
3. 得到CSV关系数据,利用社会网络分析工具Gephi进行网络可视化