社会网络分析:探索人人网好友推荐系统

最近四五年间,互联网行业似乎总是绕不开社交网络这个概念。无论是旗舰级别的传说中的facebook、LinkedIn,还是如雨后春笋般冒出来的各种团购和微博网站,全都或多或少地体现着SNS(社会网络服务)的特色。这些五花八门的产品,在丰富我们业余生活的同时,也为研究者提供了大量珍贵的数据。以往只能依靠有限的调研或模拟才能进行的社会网络分析(SNA),现在具备了大规模开展和实施的条件。国内著名而典型的SNS网站“人人网”,最近依靠上市新闻重新赢得了大家的关注。本文基于人人网的好友关系数据,应用统计分析软件R做了社会网络分析的一些尝试。

注:网络边界的确定,是社会网络分析的关键而困难的步骤。由于数据获取的限制,本文分析的对象限制于作者的好友。也就是说,本文分析的网络是作者自己的好友圈子,读者看了这些分析结果或许会觉得索然无味,感兴趣的同学可以分析一下自己的社交网络,看看是否会有类似的结果。

2013-03-23 做了相应的R包,分别用于新浪微博校内网,本文的脚本不再做更新。

一、读取数据

之所以选择人人网作为分析的对象,很重要的一点原因在于其数据获取较为便利。本文读取数据的过程借助了一款命令行浏览器cURL,这个浏览器在R中可以用RCurl包实现,简要的中文介绍建议参考medo的《R不务正业之RCurl》。通过RCurl的简单编程,我们可以在R中实现登录人人网、发布状态以及读取页面数据等功能。

人人网好友列表页面的url为http://friend.renren.com/GetFriendList.do?curpage=0&id=****,其中curpage为页码参数,id为相应的用户。通过对id与curpage做简单的循环,作者读取了自己(陈逸波)的所有好友以及好友的好友。(读取数据的R代码见文末附件。)

用上述代码读取到的数据集记为friend_all,该数据有如下的格式:

set.seed(13)
friend_all[sample(1:nrow(friend_all), 10), ]
                u0        id0     u1       id1
68282          沈叶  229657865 邢凤婷 238382560
19358        吴昊宸  115975869   吴玥 250106135
18406   叶敏佳MO小沫  222288430 官兴华  32503437
7782           李彬   54598688 鱼化石 323984442
57464          牛智 1411553595   谢諹 221389295
1833         马天云   23157153   张立 227738255
222150       刘雯欢  227317115   李嫣 334590411
278125       陈长虹  236145500 李利文 249059215
135239         高涛  248013976 宋阳阳 247196544
18214        蒋鸿章   35702214 华明明 226037245

其中,第一行数据表示“沈叶”与“邢凤婷”是好友关系,id0与id1为相应的用户id。需要注意的是人人网中不可避免地会出现同名用户的情况,因此id才是用户的唯一标识。

二、绘制简单的好友关系网络图

本文分析的焦点集中于作者的好友之间形成的网络,因此考虑做网络图来直观地展示网络的结构。

首先,从上述读取到的数据集中筛选出希望分析的子集。这个子集包含了两个条件:

(1)网络中没有作者自己(否则会呈现以作者为中心的分布,失去了分析的意义);
(2)网络中的用户都是作者自己的好友。

uid = "41021031"
## "41021031"是用户的uid,在读取数据的代码中可以自动获取
friend_all[, 2] = as.character(friend_all[, 2])
friend_all[, 4] = as.character(friend_all[, 4])
tmp1 = friend_all[friend_all[, 2] == uid, ]
tmp2 = friend_all[(friend_all[, 2] != uid) &
                  (friend_all[, 4] %in% tmp1[, 4]), c(2, 4)]
## tmp1 = tmp1[tmp1[, 4] %in% c(tmp2[, 1], tmp2[, 2]), ]
## 这句话本意是用来去掉那些孤立点。在后面用degree的方式做掉了。

然后就是直接利用igraph包的做图功能绘制相应的网络图。考虑前面提到的用户同名情况,直接用id来做后续的分析。

library(igraph)
people = data.frame(id = tmp1[, 4], name = tmp1[, 3])
gg = graph.data.frame(d = tmp2, directed = F, vertices = people)
is.simple(gg)
gg = simplify(gg)
## 去掉重复的连接
is.simple(gg)
dg = degree(gg)
gg = subgraph(gg, which(dg > 0) - 1)
## 去掉孤立点

## png("net_simple.png", width = 500, height = 500)
par(mar = c(0, 0, 0, 0))
set.seed(14)
plot(gg, layout = layout.fruchterman.reingold, vertex.size = 5, vertex.label = NA,
    edge.color = grey(0.5), edge.arrow.mode = "-")
## dev.off()

从图中可以直观地看出,作者的好友网络存在一定的人群分割,可以尝试对这个网络进行一些分析以提取出其中相对独立的子群(或者称为社群)。

三、子群分割

信息的分类和过滤是社会网络服务的一项特征,例如人人网对好友关系有一套自己的分类方式,用户可以自行对好友进行分组,从而对信息的收发做分组的管理。但是作为用户却未必能够养成并保持这种分组的习惯(例如作者自己就从来没有对好友做过分组)。与此同时我们揣测,作为真实关系的线上反映,人人网的好友网络是能够自动呈现出一定的人群分割的,而在社会网络分析中,对网络成分的分析也确实是一项重点。通过分析网络的结构,提取出其中的子群,能够让我们更好地理解这个网络的组成方式,从而更好地管理和利用信息流。

寻找子群的算法有很多,igraph包提供了若干函数以实现对网络子群的搜索,本文采用了其中的walktrap.community()函数,更多细节及其他算法可以查看帮助文档。

为了在网络图中展示这些子群,我们采用不同的颜色来标记他们。

com = walktrap.community(gg, steps = 5)
subgroup = split(com$labels, com$membership)
## subgroup
V(gg)$sg = com$membership + 1
V(gg)$color = rainbow(max(V(gg)$sg))[V(gg)$sg]
## png("net_walktrap.png", width = 500, height = 500)
par(mar = c(0, 0, 0, 0))
set.seed(14)
plot(gg, layout = layout.fruchterman.reingold, vertex.size = 5,
    vertex.color = V(gg)$color, vertex.label = NA, edge.color = grey(0.5),
    edge.arrow.mode = "-")
## dev.off()

从图中可以直观地看出好友网络已经被划分为若干相对独立的子群。这也与我们对人人网(尤其是其前身校内网)的直观理解相符合——人人网的好友关系基本都是真实线下关系的反映,很自然地可以划分为初中同学、高中同学、大学同学,等等(例如网络的上半部分为小学及中学的同学,下半部分为大学同学,而左侧的五个节点,那是统计之都的同学们。)。

具体地看一下划分得到的子群,就能够更好地理解子群的含义。作者挑出了比较典型的几个子群,其中包括:

“实验室同学”(子群9)

subgroup[[9]]
[1] "周莉"      "杨志昌"    "潘伟"      "卢进文"   "胡刚"

“校内论坛上某版版友”(子群7)

subgroup[[7]]
 [1] "曲文君"       "翟传鑫"       "梁玮"         "单广宇"
 [5] "花木马leeear" "王昉"         "李典"         "陈侃"
 [9] "王祎萍"       "牛智"         "郗旺"         "何志嵩"

“高中学弟学妹”(子群11)

subgroup[[11]]
 [1] "邹舒怡"      "封启云"      "何非"        "朱亚希"      "陈平"
 [6] "洪怡君"      "程功"        "李常然"      "朱燕^^Jue" "周飏 Ivy"

“统计之都”(子群8)

subgroup[[8]]
[1] "魏太云"   "邓一硕"   "吴云崇"   "高涛"     "统计之都"

其他子群还包括“大学同学(数学系)”、“大学同学(非数学系)”等等,不一而足(甚至能够区分高中的不同班级的同学)。因此可以认为上述算法得到的子群划分是合理且有意义的。

更进一步地,可以对照网络图来考察各个子群成员的分布情况。例如大学数学系同学(下方蓝色点)的链接较为紧密,而非数学系的大学同学(主要是校内论坛CC98上的朋友,下方红色点)的分布则相对分散。通过网络密度可以定量地印证这一点:

## 数学系
sg10=subgraph(gg,V(gg)[sg==10])
## 非数学系
sg1=subgraph(gg,V(gg)[sg==1])
graph.density(gg)
## [1] 0.06376068
graph.density(sg10)
## [1] 0.5883441
graph.density(sg1)
## [1] 0.1223607

四、起到中介作用的那些好友

在社会网络分析中,对节点的中介作用有一个经典的刻画叫做“中间度”。中间度衡量了节点作为中介的程度,当网络中某个个体的中间度较大时,我们认为它在很大程度上起到了中介和沟通的作用。常用的中间度的定义是$\sum(g_{ivj} / g_{ij}, i \neq j,i \neq v, j \neq v)$,其中$g_{ij}$表示联通i与j两个节点的捷径的条数,$g_{ivj}$则表示联通i与j两个节点且经过v的捷径的条数(所谓捷径,就是两个节点之间的最短路径)。在igraph包中,betweenness()函数能够简单地计算网络中各个节点的中间度。

V(gg)$bte = betweenness(gg, directed = F)
## png("net_betweenness.png", width = 500, height = 500)
par(mar = c(0, 2, 0, 0))
plot(V(gg)$bte)
## dev.off()

根据得到的中间度散点图,我们人为地选择了3000作为分界点,选取中间度高于3000的节点并在图形中利用节点的大小展示出来。

V(gg)$size = 5
V(gg)[bte>=3000]$size = 15
## 当然啦这里的3000换成分位数之类的会更合理
V(gg)$label=NA
V(gg)[bte>=3000]$label=V(gg)[bte>=3000]$name
V(gg)$cex=1
V(gg)[bte>=3000]$cex=2
## png("net_walktrap_betweenness.png", width = 500, height = 500)
par(mar = c(0, 0, 0, 0))
set.seed(14)
plot(gg, layout = layout.fruchterman.reingold, vertex.size = V(gg)$size,
    vertex.color = V(gg)$color, vertex.label = V(gg)$label,
    vertex.label.cex=V(gg)$cex, edge.color = grey(0.5),
    edge.arrow.mode = "-")
## dev.off()

从图中也可以直观地看出,中间度最高的5个节点,确实位于中介的地位。

具体看这5个节点:

V(gg)[bte>=3000]
Vertex sequence:
[1] "邱元杰" "娄谦之" "王子涵" "刘波"   "顾鑫"

对这5个节点,基本上都有比较合理的解释,其中有三个人是“高中校友”兼“大学校友”,而另外两个则沟通了“网络好友”与“大学好友”。

五、基于好友关系的一种简单的推荐

最后,我们也做了基于好友关系的好友推荐,推荐的逻辑与人人网自身的推荐逻辑相同:根据共同好友的数量来进行推荐。在具体实现的时候,仍然需要考虑用户同名的情况。

tmp3 = friend_all[!(friend_all[, 4] %in%
        friend_all[friend_all[, 2] == "41021031", 4]), ]
listall = sort(table(tmp3[, 4]), dec = T)
top = names(listall[1:20])
tmp4 = tmp3[tmp3[, 4] %in% top, 3]
top20 = sort(table(tmp4), dec = T)
top20
周科  邹碧筠Phoebe       査小狮       韩晶磊       陆丽娜
55           49           42           41           41
焦丽萍       蔡锡真         高晨       鲁锦彪         张洁
40           39           39           38           38
张明珠       范莉悦       钱咏邠   薛俊波悟空         周迪
38           37           37           37           37
陈素         蒋莹         唐甜         费逸       王丽涵
36           36           36           35           35

这个推荐的结果与人人网的推荐基本一致(因为逻辑相同嘛),以下是人人网的一些推荐截图:

上述推荐的机制较为简单,但是在拥有大量真实关系的网络中,推荐的效率还是比较高的。当然,我们也可以开展对文本与行为的挖掘,以得到超越真实线下关系的推荐,但本文尚未做这方面的尝试。

附件2的代码,最新做的图片,统计之都立功啦。

社会网络分析:探索人人网好友推荐系统》有213个想法

  1. 很赞!
    下载文档最好改成utf8编码.
    循环有些慢,直接用api调取数据可能更快一些.

    1. 循环是真的慢,主要我代码写得不好。如果有空读更多数据来做分析的话也会考虑api之类的呀,不过现在还完全没接触过。

      1. 这个,推荐看一下“链路预测”相关的内容,很有意思,比人人的算法好多了……

    2. 没听说过直接用API调用数据 吴同学是否能写个帖子介绍一下呢

  2. 刚才我打算用igraph生成一个10000+个顶点、300000+条有向边的图,发生
    Error in graph(t(el), directed = directed) :
    At vector.pmt:409 : cannot reserve space for vector, Out of memory
    看来igraph只能小打小闹啊……

      1. 这个还真不知道……应该跟电脑配置有关吧,我就是图人家漂亮而已。

  3. 哦,另外提一点建议:出于隐私保护,建议把上述图片中涉及人名ID的都抹掉!
    国外social network的data都是特别隐私的,用户名ID之类的全部匿名化处理,就算是拿到数据,也是要在受限制的情况下使用,主要考虑大概就是隐私保护吧。虽然人人本身隐私保护不咋地,但是还是建议在这里考虑一下大家的隐私问题,改一下吧,不影响表现效果的。

      1. 呃,匿名化处理(一个汉字映射函数就可以了),或者采用中国文学的惯用伎俩“笔名”,哈哈~

    1. 怎么处处都是隐私保护啊?有那么多隐私吗?我觉得太畏手畏脚了,我反正很无所谓。

      这个发之前我们也讨论了一下,作者本人和我都支持放出来。要不然全是A、B、C的完全没有意义。

      此外,这个文章中出现的还都不是名人,匿名不匿名的影响不是太大。如果是经济合作圈等,那么如果匿名化了,那就失去了200%的价值。干巴巴的一串字符,谁都不知道是啥东西,令读者浪费感情~

      1. ……既然不是名人,那么叫什么名字,又有什么所谓呢?
        既然是名人,他已经先选择了公布自己,比如咱们在网上都是实名的,说明咱们不在乎,那么自然不用匿名化。
        我觉得要点是,未经人家同意就曝露人家的信息,那就不好了。总得问过……

      2. 这个,我定义“名人”的时候指的是在网上搜真名能搜到的。。。

    2. 既然网上都搜不到。那么这些名字别人看了能有什么用。如果读者能认识其中的人,说明读者是作者的朋友了,算是作者的圈内人士了。

      诚如你说“……既然不是名人,那么叫什么名字,又有什么所谓呢?”,那放上去真名也就是无所谓了,但放上真名的一个好处是读者的朋友看了会觉得比较有意思、很好玩,至少有八卦的乐趣。如果是纯粹匿名化,那么和随机生成一个网络贴上去,说说拓扑关系,然后画几张图也就没甚区别了。但这样的文章估计没人乐意看,反正我是不感兴趣的;当然这种随机数据的文章可以来论述理论,但对于像本文一样应用性的文章,如果没有真实数据和真实物理背景,那写还不如不写。

      至于你说的征求上面名字的意见,我觉得也很值得商榷。首先,对文章出现的名字来说,上面能说明的信息其实不多,除了真实姓名之外,也就几个联系边而已,这个算不得什么隐私吧(至少在国内,国外的标准不考虑)。其次,如果我们每个人写(不涉及到褒贬性的)文章时提到自己朋友时,都去征求一下朋友的意见,看他允许不允许出现自己的真名,那么这个工作量是非常大的,更重要的是这样会很腐朽很荒谬:因为如果连不涉及到褒贬,仅仅陈述客观事实的文章都需要自己朋友来许可的话;那么我们岂不是做什么事情,只要提到朋友的名字都需要事先征求一下朋友的意见?如果真是这样,那么我很怀疑朋友之间的默契和信任。难道姓名真的如此神圣而不可高攀?

      我觉得保护隐私的注重走得过分远了点,尤其在国外。国内应该适当学习,不应该矫枉过正。

      我的观点比较非主流,并且比较偏激,见谅,哈哈~

    1. 呃,在这边你是绝对不可能从网上轻易搜到成绩单的,这属于绝对的个人隐私问题……至于国内的境况,大家都知道……唉。

      1. 其实我真不觉得匿名化会对(社会网络)研究带来阻碍,反而是一种对于被调查者的尊重。名字不过是一个映射、一个代号,关键在于大家想不想在网上被搜到了。
        至于隐私有多重要……看看最近iphone闹得沸沸扬扬的地理位置记录事件吧:我自愿公布是我的事儿,你管不着;只是你不应该不告诉我就擅自记录(虽然其实可能我可能不在乎)。
        这个没法默认为人家同意吧?尤其是牵扯到“链路预测”,连链路还没形成呢,估计八成是不认识,那么就擅自用人家的信息?当然照片名字之类的或许无什么大碍,更多于我来说是一种“过程”问题吧。

  4. Loading required package: bitops
    错误于strsplit(hh[iii], “:talkto[(]”)[[1]] : 下标出界
    >
    这个是什么意思呢?

    1. 这个函数我当时写的时候也遇到不少类似的问题,可能还是不够稳健。如果可能的话麻烦你帮忙看一下是在什么情况下出现的这个错误。谢谢~~

      1. 如果没有填完整的UID,用户名,密码,就会出现这个问题。另外如果要读取好友的好友,应该怎么操作呢?

      2. 您好,没有找到附件,请问可以把源代码发我邮箱一份么?诚谢,邮箱hansoar@126.com

    2. uid,账号,密码,是必须的。
      参数N=0,是读取我的好友。参数N=1,是读取我的好友的好友。N>=2的时候类推,但是只是简单的迭代所以没考虑效率问题。

      1. uid在程序的哪里输入啊 函数不是只能输入name pwd 和N么?

      2. 大神,要是想提取好友的好友的好友信息,该如何设置哩,N=2不行吧、

      1. 神马问题啊。话说我这两天在linux下面做了一下确实有点问题还没热情去改,windows下面昨天做还没问题呢。

      2. 错误于strsplit(hh[grep(“的好友”, hh)], “的好友”)[[1]] :
        下标出界

      3. 错误于strsplit(hh[grep(“的好友”, hh)], “的好友”)[[1]] :
        下标出界
        谢谢楼主!大赞

      4. 具体情况具体分析,但是目前常见的原因是账号密码输错、不明原因的验证码

      5. 就是 这个函数提供的只是账户 密码
        然而现在登录人人,还得输入验证码。那这就没法进去了啊

      6. 不清楚具体神马原因,我也是前几天换了操作系统然后就需要验证码。但是后来换了台电脑又不需要了。如果真的要硬破验证码那就不是我力所能及了。。。

  5. [3] “Thu Apr 28 21:49:03 2011”
    [1] “15” “374”
    [3] “Thu Apr 28 21:50:00 2011”
    [1] “16” “978”
    [3] “Thu Apr 28 21:52:28 2011”
    错误于strsplit(hh[iii], “:talkto[(]”)[[1]] : 下标出界
    在N=0时正常,N=1时,固定在这个地方出错~

    1. 那得找到这第17个好友然后看看他的那个页面是不是有啥异常的状况。方便的话把隐私数据处理掉发给我瞧瞧呗?

      1. 第16个和第17个人重名,这样应该就是问题了,不然您亲自上我校内看也行,我刚申请你人人好友了,你随意。

    2. 你好,我也是运行的时候,在N=0时正常,N=1时,出现这样的错误:错误于strsplit(hh[grep(“的好友”, hh)], “的好友”)[[1]] :
      下标出界
      请问,该如何处理?多谢

  6. 想问下,出现了这样错误信息,数据量太大造成的么?
    ‘memory.limit()’ is Windows-specific

      1. 尝试了下把这个去掉就好了 memory.limit(4000)
        另外,我无法读取,自己好友的好友列表,只读取了自己的好友列表,再看看。。

      2. 你说得对,这个函数的确是Windows专有的。*nix系统不需要用这种方式增大内存。

      1. 版主大人,最近又开始想试试您的那个人人网社交分析的程序,发现用igraph做图,跑以下程序library(igraph) gg = graph.data.frame(d = ff, directed = F) ## png(“net.png”, width = 500, height = 500) par(mar = c(0, 0, 0, 0)) set.seed(14) plot(gg, layout = layout.fruchterman.reingold, vertex.size = 5, vertex.label = NA, edge.color = grey(0.5), edge.arrow.mode = “-“) ## dev.off() 报错,说symbols作的轴错,min(x),max(x)的参数错误,为什么啊

      2. 错误于symbols(x = coords[, 1], y = coords[, 2], bg = vertex.color, :
        符号座标不对
        此外: 警告信息:
        1: In min(x) : min里所有的参数都不存在; 回覆Inf
        2: In max(x) : max里所有的参数都不存在;回覆-Inf
        3: In min(x) : min里所有的参数都不存在; 回覆Inf
        4: In max(x) : max里所有的参数都不存在;回覆-Inf
        怎么会出这个悲剧……

      3. 版主,经过本任反复看了您的论文,发现出现我上述的问题,是对N=0,N=1,N=2分别提取了数据(果然等了半天),直接串联成了矩阵……我再试试看,看看能否再现您的方法

      4. 我也遇到这个问题 请问任同学是怎么解决的?

  7. 请问陈同学,cc.txt中内容的格式是怎么样的呀,麻烦赐教!

  8. R里这个igraph只能”小打小闹” +1
    几百就不行了 10000顶点300000条边则纯属幻想了 。。。

    gephi主攻图形展示 其他方面一般 自带那几个布局算法很不错 性能上 画CRAN所有包的依赖关系网络没什么问题 大概是2000顶点6000条边? 10000顶点300000条边也许可以? 没试过 。。。你需要一个好的布局算法 。。。

    Cytoscape试用过n次 每次都是感觉不好用 可能还是更适合生物方面的研究吧

  9. 陈同学
    我在两台机子上都试过附件里的程序
    但是在跑完里面的代码后
    输入res=f.renren.friend(“**”,”****”,”***”)后,都全报错,
    错误提示:
    in if (!is.na(i) && (last <- isBinaryContent(, i, textTypes))) return(TRUE) :
    missing value where TRUE/FALSE needed

    求教!

      1. 没有用过win7系统,不清楚会不会是系统的原因。能不能换一个系统试做一下呢?谢谢!

      2. 最后那条评论没办法点回复。
        你的RCurl是不是1.6-0.1?如果是这个版本可能会导致你这个问题,具体原因不明。

      3. RCURL的版本我倒真没注意
        是直接用R下载过来的

        在哪里看?

      4. 解决了 是PACKAGE的问题
        1.5是会出现这样的问题
        降到1.4就好了

      5. 我勒个去……好吧,我去“降级”试试,按理来说应该更新下代码才对,等有时间再仔细研究……

    1. 这个错误还从来没有见到过,看不懂具体含义。能不能试着看看是那一条语句遇到错误呢?谢谢!

      1. 系统应该是可以的 因为我同学成功过
        然后他用的是FIREFOX的 但是我用的是CHROME
        我在想是不是浏览器的问题

        错误我迟会儿贴给你看一下 稍微~

      2. > ttt=postForm(“http://passport.renren.com/PLogin.do”,httpheader=myH,
        + .params=pinfo,curl=cH,style=”post”)
        错误于if (!is.na(i) && (last <- isBinaryContent(, i, textTypes))) return(TRUE) :
        需要TRUE/FALSE值的地方不可以用缺少值

        问题出在这一句

  10. 最新的RCurl可以连到新浪微博,但是用类似的代码却没办法连到人人,不清楚具体是什么原因。希望对此有研究的同学给点参考。人人网的登录过程算是比较简单的,新浪微博的好复杂。

  11. 2011-06-20 增加了新的代码,可以直接获取“共同好友”。如果只需要分析好友的群组关系(而忽略好友推荐功能),可以直接运行这段代码,大幅度提高效率,几分钟就能搞定,同时绕过好友同名的问题。欢迎试用,如需修改参数麻烦自行操作。=”=
    相关的RCurl版本为1.5-0.1,1.6的版本仍然没有搞清楚,仍然请教各位。

      1. 我也不清楚 直接运行f4(“email”,”pass”),图也画出来了,但是内存长啊长啊 一直到了“无法分配6m的。。。”

  12. RCurl 没有windows下的版本,需要自己编译吗?
    呵呵 我是菜鸟,刚刚接触R,不好意思了~

    1. 请问你R-curl在windows下面安装是怎么处理的?我也很想跑一下这个程序,谢谢!

  13. 想运行一下博文中的代码 看看效果
    出现了这样的错误
    Error in strsplit(hh[grep(“的好友”, hh)], “的好友”)[[1]] :
    subscript out of bounds

    1. 咦,这里貌似没有这样的代码呀。原来的代码里面是u0=strsplit(hh[grep(“的好友“,hh)],”的好友“)[[1]][1],用来取个名字的。我刚才跑了一遍,没发现这样的错误。
      话说,这种代码的一个问题是如果目标网站的脚本变了,我的代码就跑不动了,这个应该怎么处理呢?

      1. 这个真不明白了,就是想看看博主的代码运行效果
        我把代码中的 id 和 password 写成我的,其他的都没有变动

        但 还是上面的错误···求指导~

    2. 我怀疑是你把id和密码写错了,我自己测试了一下,写错id或密码是会出现这样的错误~~~之前也有同学出现这样的错误,因为我的代码写得不好,参数name其实不是“名字”。

      1. name 的意思 是id吧 就是url后面的那几位数字吧
        然后就是password了,
        我不知道理解对不对。
        我就是这样写的哈。

      2. 博主 我知道了
        您的name值 就是人人登录时候的用户id,比如邮箱啊什么的,我用了自己的邮箱以后可以了。正在调试···

      3. 执行了到了第一步,然后报错了。
        Error in graph.data.frame(d = tmp2, directed = F, vertices = people) :
        Some vertex names in edge list are not listed in vertex data frame
        In addition: Warning messages:
        1: In graph.data.frame(d = tmp2, directed = F, vertices = people) :
        In `d’ `NA’ elements were replaced with string “NA”
        2: In graph.data.frame(d = tmp2, directed = F, vertices = people) :
        In `vertices[,1]’ `NA’ elements were replaced with string “NA”
        3: In `[<-.factor`(`*tmp*`, is.na(vertices[, 1]), value = c(71L, 53L, :
        invalid factor level, NAs generated

    3. 你好,我现在运行这段也是出现和你一样的问题,你解决了不?

      1. 同学,你这处的问题解决了不,我也陷入这里了。求解救。。gg = graph.data.frame(d = tmp2, directed = F, vertices = people)

      1. 上述仁兄应该陆续解决了相关问题。所以还是邮件讨论吧~~~这不是个大众的题目,老是评论来评论去的也比较麻烦哦

  14. RCurl configuration fail for package RCurl

    提示以上错误
    我是在windows上安装的

      1. 是的呀。我是下载那个zip包装的。待会也放到附件里吧。

      1. 我把那个zip文件放在附件了,我也还是不知道1.6的版本为啥不能用。方便的话,你用06-20那个代码做做试试看吧,有结果或者有错误欢迎分享哦 ^_^

      1. 这个临时文件会被删掉的。。。要不你加我QQ或者msn或者旺旺具体探讨吧~~~

  15. 版主你好,看了你的大作,实在佩服。而且你细心地回答大家的问题,就更加的佩服了。我也是来打扰你一下的。因为你给的代码里面注释比较少,有些地方不知道该怎么做。我现在已经将我的好友的列表抽取出来了,但是没能抽取到我的好友的好友,哪一个地方要修改一下?我用的是你最新的那个代码的。另外,我是刚初学R的,你说把数据集保存到net.1去,该怎么操作?

    1. 好友的好友,需要用第一个代码附件。就是类似net.1=f.renren.friend(uid0=”****”,name=”****”,pwd=”******”,N=0)这样的。这个耗时比较长的,因为是一个一个地抓取,不知道有什么方便的做法没。

  16. 现在发现了另外的一个问题。我总共有133个人人好友,按照你的代码运行之后能抽出133个好友。但是奇怪的是,在列出133个好友之后,会单独的列出两个好友的名字
    [1] “132” “蔡鸿培” “1” “Tue Oct 11 18:50:29 2011”
    [1] “133” “周郁霖” “1” “Tue Oct 11 18:50:29 2011”
    [1] “宋元璟” “赖智辉”
    就是这个样子。然后我执行命令 justfriend的时候,列出的一下subgroup,这两个同学是我们班上比较活跃的,一个还是班长,都加了大家人人的,可是他们两个却均独立为一个subgroup,这是为什么呢?

    1. 最后列出两个名字,是中间度位于前1%的人的名字。至于为什么这两个人会被算法做成独立的子群,这个就得看具体算法啦,你可以调整参数试试看,数据的话就是最后结果里面的friend

      1. 非常感谢版主那么及时的回复!暂时遇到了比较多的问题。我运行第二个附件的代码,数据是抽取出来了,图像也画出来了。但是我输入friend,显示的结果四个都是0,只有一行。不知道哪里出错了。
        而运行第一个附件的代码,运行过程没有出错,但是没有打印出任何的信息,不知道是哪里的问题。
        我想如果运行第二个附件的代码,要将数据集赋给net.1应该是
        net.1<-friend 只是我这里的friend出问题了。打扰你了,可能还要再打扰你

  17. 请问楼主:
    我使用
    《附件:2011-06-20的R代码》
    读出了数据,可不是不能画图,要怎么办呢?
    我的好友有877人。

      1. 果然是图已经出来,我昨天没看到。
        哈,惭愧。。
        谢谢大师啊!

  18. 我刚接触好友的数控挖掘,博主发个igraph 和rcurl1.5-0.1的安装包给我嘛 ,或是发个下载的链接地址
    我都没找到!!拜谢了

  19. 我刚接触好友的数控挖掘,博主发个igraph 和rcurl1.5-0.1的安装包给我嘛 ,或是发个下载的链接地址
    我都没找到!!拜谢了

    邮箱 378029367@qq.com

    1. 朋友能不能把rcurl的包也发给我一个 我一直没找到windows版本,wwabww@sina.com

      1. 您好请问 您那有Rcurl的 包么 能不能发我一下 拜谢

  20. 我在运行6-20的代码后。出现的是这样的好友关系:
    Loading required package: bitops
    [1] “1” “刘钊”
    [3] “1” “Thu Dec 15 17:21:31 2011”
    [1] “2” “郭陆”
    [3] “15” “Thu Dec 15 17:21:31 2011”
    [1] “3” “张靖”
    [3] “1” “Thu Dec 15 17:21:31 2011”
    [1] “4” “孙博”
    [3] “1” “Thu Dec 15 17:21:32 2011”
    [1] “5” “贺庆”
    刚接触RCURL,请问这是什么意思呢,没看懂?

    1. 是我想要关注一下运行过程中的状况,就打印出这些东西。基本上是读一个好友出一条记录,第三个数字是这个好友与我的共同好友数量。

  21. 博主,我运行了第一个附近,没有出任何结果,是怎么回事呢?

  22. 刚才有跑了一遍

    + ll=nrow(friend0)
    +
    + if(N=1){
    错误: 意外的’=’ 于

    if(N=”
    >
    > for(num in 1:ll){
    +
    + userid=friend0$id1[num]
    + username=friend0$u1[num]
    + if((userid %in% tmp$id0)==F){
    + friend1=f0(uid=userid)
    + tmp=rbind(tmp,friend1)
    + print(c(num,username,nrow(friend1),date()))
    + rm(friend1)
    + gc()
    + }
    + }
    错误: 找不到对象’ll’
    > }
    错误: 意外的’}’在”}”里
    >
    > return(tmp)
    错误: 找不到对象’tmp’
    >
    > }
    错误: 意外的’}’在”}”里
    >

  23. 楼主可否把windows 版本的安装包发我一份,tuhkjet@gmail.com非常感谢

  24. 博主:你收集的数据集让我很是兴奋,我一直苦苦再找关于社交网络中现实的数据集,因为本人对网络编程不是很懂,所以没有进展。能否将您说的igraph软件和你做程序的windows安装包给我发一个,太感谢了。急用呀!!!!

  25. 不好意思,我是初学着,这个怎么解决
    > friend_my=f_renren_friend(name=””,pwd=””,N=0)
    错误于library(RCurl) : there is no package called ‘RCurl’
    >
    > friend_all=f_renren_friend(name=””,pwd=””,N=1)
    错误于library(RCurl) : there is no package called ‘RCurl’

  26. 上面问题已经解决了了,出现了找不到library()这个东西

  27. 弱弱的问一下,windows里面出现这个问题,应该怎么去确定这个包的位置???
    当我将 library(RCurl)去掉后,程序正常执行,但是看不见结果??
    急用呀!!!!谢谢啦
    there is no package called ‘curl’

  28. 弱弱的问一句这个library(RCurl)怎么使用。提示错误为
    错误于library(RCurl”) :
    there is no package called ‘Rcurl’
    急用呀,谢谢

    1. 你得先安装这个软件包的。有什么问题可以先去论坛查查,google也行。解决不了再过来问。

  29. 博主,上面的问题都解决了,出现奇怪的bug了,帮帮忙啦
    前几次运行friend获取时,结果很正常,但过了5分钟运行出现
    Loading required package: bitops
    错误于strsplit(hh[grep(“的好友”, hh)], “的好友”)[[1]] :
    下标出界

  30. 博主,我们进行了以下测试(用户名密码都正确,我们使用的是win7系统):
    1、使用两个只有10以下朋友的帐号运行是正常的
    2、使用两个都超过150人的帐号运行,出现
    Loading required package: bitops
    错误于strsplit(hh[grep(“的好友”, hh)], “的好友”)[[1]] :
    下标出界
    谢谢

      1. 我怀疑是因为内存的原因,32位机器里面只有4G内存地址空间

  31. 刚才提出问题我们又进行了验证,只要不超过100个好友,程序没问题。经分析跟物理机的内存大小有关,32位的机器只能是4G,所以造成数据溢出????

    1. 请问你们那个小组成果是为哪个比赛准备的?!到过很多地方展示?!

  32. 请问,下标出界的情况怎么解决,总是卡在那里。换了新版主页会不会对url信息的提取产生影响啊?

  33. 陈师兄,我想试试抓取自己的好友,请问需要在您的第一个附件中在哪加入自己的信息就可以了呢???新手,还请见谅,感谢。

  34. 请问陈师兄,在你的第一个附件中,需要在哪填上自己的信息,就可以抓出自己人人的信息了呢?学习中,多谢。

  35. 求问。。。install.packages(‘RCurl’) 总会出错。。。不能安装rcurl…求教 跟选择的镜像有关吗?谢谢!

      1. In getDependencies(pkgs, dependencies, available, lib) :
        package ‘RCurl’ is not available
        还是有这个错误。。。

      1. 额,谢谢,那是我的问题了……
        如果我的文件是UTF-8编码的是不是需要更改源码,我看到里头有用iconv,但去掉还是登录不上,返回用户名或密码错误页面。
        如果直接用您的源文件直接不允许有多字节字符……

  36. LZ 刚刚拜读了您的大作 我是第一次接触R和数据挖掘这方面 但是我要做的一个项目需要挖掘人人网的数据 能否跟你进一步交流一下这方面的问题呢? 比如说我想得到我好友更多的信息 比如年龄和学历 这可以做到么? 还有就是怎么能够获得好友的好友的信息呢 ? 我的QQ313652063 邮箱313652063@qq.com 万分感谢LZ

  37. 当时人人网并不是单纯按照共同好友数量来推荐。设想一个场景,如果你进了一个新公司,而公司的同事大部分是玩人人网的。假设你所在部门的不少人都把你加成了好友,这样很多你不认识的同事跟你的共同好友很容易就变得很多,这样你的推荐位就被这些人占着,这样的结果显然是用户不想得到的。人人网当时就采用其他的方法解决了这个问题。

  38. 我是个菜鸟,就像爬下好友关系,但是运行报错——错误于nchar(str) : 多字节字符串1有错。还有那个name是什么啊?

  39. 你好,你这块有没有做两个人关系强弱的分析,用一个参数来表示,值这两人的关系就越强,反之越小。

  40. 比如这个人发表的日志、状态、照片,另外一个人会去评论,或者这个人经常互相@的人,考虑到这些因素来衡量两个人的关系强度,不知道有什么现有的方法或者逻辑,我们可以邮件交流吗?邮箱为:moyuan87@163.com

    1. 原来如此这个不是很通用啊不过可以考虑一下 我最近应该没时间做这个啦 我的邮箱是chenyibo.zjumath gmail.com

  41. 这篇文章很多启发,我想做一下人人网的好友分析,理论模型都差不多了..就差这个…但是运行的时候显示错误于nchar(str) : 多字节字符串1有错…这个有什么指点吗?

  42. 请问楼主,我下了您的人人包,把它安装好了,可是却加载不了
    local({pkg <- select.list(sort(.packages(all.available = TRUE)),graphics=TRUE)
    + if(nchar(pkg)) library(pkg, character.only=TRUE)})
    错误于library(pkg, character.only = TRUE) :
    不存在叫‘renren’这个名字的程辑包

    或者
    library(renren)
    错误于library(renren) : 不存在叫‘renren’这个名字的程辑包
    这是为什么额···

  43. 发现subgroup = split(com$labels, com$membership) 这一句话似乎会报错……com$labels是NULL……似乎membership(com)就会显示所有信息了捏……所以我就把上句话去了,不知道是不是因为包升级了之类的……

  44. 发现
    [code]subgroup = split(comlabels,commembership) [/code]
    这一句话似乎会报错……com$labels是NULL……似乎membership(com)就会显示所有信息了捏……所以我就把上句话去了,不知道是不是因为包升级了之类的……

  45. 老师您好,我们希望得到您的数据,因为我们希望写一篇关于小世界的论文,但我们又不会R语言等,所以无法获得数据。所以希望能得到老师的数据,谢谢老师!

  46. 你好,能把这个Renren这个包发我一下吗?753023400@qq.com 非常感谢

  47. 老师,你好!这学期学习了network,很想运行您的程序,我看到了你给的github的网址,里面有介绍Renren软件包,已经打不开了,能麻烦你发给我一份吗?真的非常非常感谢!我的邮箱是baiyang1988@gmail.com。麻烦您了!

  48. plot中的“vertex.color = V(gg)$color”是赘述,com$membership + 1的作用是避免彩虹色带的大红色,rainbow(max(V(gg)$sg))[V(gg)$sg]要改为:rainbow(max(V(gg)$sg + 1))[V(gg)$sg]。。。。窃以为。。。

  49. 请问楼主该如何解决错误于fromJSON(content, handler, default.size, depth, allowComments, :
    invalid JSON input

  50. 楼上有用R下载人人数据的代码吗,为什么我找不到附件,,,急求,,,我的邮箱是gamma120@163.com

  51. > renren_sns <- f_renren_sns(cH=ch0, topk=3)
    Error in fromJSON(content, handler, default.size, depth, allowComments, (from f_renren_sns.r#18) :
    invalid JSON input

    a_id <- unname(sapply(a1, function(x){fromJSON(x)$id}))

  52. 您好!我的是Mac,在画图的时候中文显示为一个框框,在画其他图的时候也会,但是设置family=’STKaiti’这个参数后就可以正常显示了,但是使用igraph包画图的时候中文还是无法正常显示,请问有解决方法吗

      1. 你好,我的图形main里的中文可以显示,vertex.label节点上的中文显示为框框,我也尝试使用family设置其他字体格式,但是依然没起作用!
        谢谢!

  53. 老师,您好,我正在学习关于社交网络相关知识,能否让你割爱提供原始数据以及附件,万分感谢,万分感谢!

dick7_love进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注