加入收藏 | 设为首页 | 会员中心 | 我要投稿 宿州站长网 (https://www.0557zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

文本挖掘:社交网络、社群划分

发布时间:2021-11-12 04:17:36 所属栏目:大数据 来源:网络整理
导读:副标题#e# 作者:Matt ? 自然语言处理实习生 http://blog.csdn.net/sinat_26917383/article/details/51444536 回复此公众号 “ 社交网络 ”获取word版原文查看。向小编咨询问题,联系 微信:hai299014 一、关系网络数据类型 关系网络需要什么样子的数据呢?
副标题[/!--empirenews.page--]

文本挖掘:社交网络、社群划分


作者:Matt ?

自然语言处理实习生

http://blog.csdn.net/sinat_26917383/article/details/51444536

回复此公众号社交网络”获取word版原文查看。向小编咨询问题,联系微信:hai299014




一、关系网络数据类型

关系网络需要什么样子的数据呢? ? ?笔者接触到了两种数据结构,擅自命名:平行关系型、文本型。根据数据关联,也有无向数据、有向数据。

并且关系网络生成之后,R里面就不是用真实的名字来做连接,是采用编号的。例如(小明-小红)是好朋友,在R里面就显示为(1-2),所以需要单独把名字属性加到序号上。


1、平行关系型

(1)无向平行数据。直接上例子比较直观,社交网络中的好友关系,你-我,我-他。这样排列,是无向


  1. id1?di2??

  2. 小明??小红??

  3. 小张??小白??

  4. 小红??小胖??

  5. 小胖??小蓝??

  6. 小白??小明??

  7. 小白??小张??

  8. 小明??小胖??

很简单的两列数据,说明了小明-小红、小张-小白的社会关系。当然需要注意,重名问题,名字可能有重叠,可以给每个人一个编号,这样就不会出现重名。


实战中,一般是拿编号作为输入变量,拿名字作为编号的标签,加入到关系网络中。


(2)有向平行数据。举一个书(《R语言与网站分析》)上的例子。解读一下这个图,这是一条微博的转发情况,“老牛”用户这个微博号转发,让“晴”、“四眼看八方”两个用户看到了。

“老牛”用户发出,“晴”、“四眼看八方”用户分别接收到。


文本挖掘:社交网络、社群划分


2、文本型

文本型主要针对的是文本数据,笔者在参赛时就用到这个。文本型也有两种情况:有向型以及词条-文本矩阵。这部分内容跟文本挖掘相关,关于分词内容可以参考中文分词包Rwordseg。


(1)有向型就如同平行关系型有向数据结构一样,人名-词条两个


(2)词条-文本矩阵

文本挖掘中,一般都能获得这个矩阵,可以看一下tm包,文档-词频矩阵。tm包中用DocumentTermMatrix函数可以获得。

跟上面的对比一下就了解,变成了一个稀疏矩阵,相关的关联规则、随机森林中中也会用到这个矩阵。tm包可以实现,也可以通过reshape包中的cast函数,构造这个函数。

需要原来的数据框调整为以每个词作为列名称(变量)的数据框。也就是一定意义上的稀疏矩阵(同关联规则),也就是将long型数据框转化为wide型数据框。转换可以用的包有reshape2以及data.table。

其中,data.table里的`dcast`函数比reshape2包里的`dcast`好用,尽管他们的参数都一样,但是很多人还是比较喜欢老朋友reshape2包,然而这一步需要大量的内存,本书在服务器上完成的,如果你的电脑报告内存不足的错误,可以使用data.table包里的`dcast`函数试试。转化为稀疏矩阵,1表示访问,0表示未访问。


二、构造关系网络

1、自编译函数init.igraph

看到了数据类型,大概知道其实需要两样东西,一个起点数据列、一个终点数据列。那么构造数据就只需要调用一下函数,在这里选用《R语言与网站分析》书中第九章关系网络分析中,李明老师自己编译的函数来直接构造。

在使用之前需要library调用igraph包,该函数的好处就是直接帮你打上点标签以及线标签。


  1. init.igraph<-function(data,dir=F,rem.multi=T){??

  2. ??labels<-union(unique(data[,1]),unique(data[,2]))??

  3. ??ids<-1:length(labels);names(ids)<-labels??

  4. ??from<-as.character(data[,1]);to<-as.character(data[,2])??

  5. ??edges<-matrix(c(ids[from],ids[to]),nc=2)??

  6. ??g<-graph.empty(directed?=?dir)??

  7. ??g<-add.vertices(g,length(labels))??

  8. ??V(g)$label=labels??

  9. ??g<-add.edges(g,t(edges))??

  10. ??if?(rem.multi){??

  11. ????E(g)$weight<-count.multiple(g)??

  12. ????g<-simplify(g,remove.multiple?=?TRUE,??

  13. ????????????????remove.loops?=?TRUE,edge.attr.comb?=?"mean")??

  14. ??}??

  15. ??g??

  16. }??

这个函数有这么几个参数:


data,是两列关系数据,前面已经讲过了,只能两列,而且要同等长度;

dir,逻辑值,T代表有向图,F无向图;

rem.multi,逻辑,T删除重复变量并更新线权重weight,F不删除并且线权重为1。
使用方法直接init.igraph(data,dir=T,rem.multi=T)即可。


2、文本型数据

一般数据结构都可以套用上面的函数,包括平行关系型的有向、无向;文本型。其中对于文本矩阵型数据还有一个办法,参考于统计词画番外篇(一):谁共我,醉明月?

利用igragh包中的graph_from_adjacency_matrix函数。


  1. adjm?<-?matrix(sample(0:1,?100,?replace=TRUE,?prob=c(0.9,0.1)),?nc=10)??

  2. g1?<-?graph_from_adjacency_matrix(?adjm?,weighted=TRUE,mode="undirected")??

  3. ??

  4. ???##?给稀疏矩阵行列进行命名??

  5. rownames(adjm)?<-?sample(letters,?nrow(adjm))??

  6. colnames(adjm)?<-?seq(ncol(adjm))??

  7. (编辑:宿州站长网)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读