很是有趣的大数据应用——对QQ群资料进行用户画像

大数据学习

d3.js是一个近年来推出的基于javascript的数据展现库,全称为Data Driven Document, 在浏览器数据展现领域的地位相似于通用js框架里的jQuery。d3.js的官网是d3js.org,你们能够在上面看到不少例子和应用。d3.js也是图形数据库neo4j所内置的数据展现工具。javascript

说到图形数据库,其实正确的翻译应该是图数据库,图即所谓的Graph,来自于数学里的图论,好比四色定理和推销员过桥的问题(著名的NP问题之一)。图数据库着重于数据之间的关联和属性,对于关系错综复杂的关系分析效率很高。例如,我想知道谁是我朋友的朋友,而且他们有哪些朋友也认识我。对于这种问题,普通关系型数据库的计算复杂度是O(N^c)左右或者更高,N为选择范围的数据集合大小,你好友数量加上好友的好友的数量等,c为关系层数。图数据库的计算复杂度在O(N^2)左右或者更低,可是基本不会超过O(N^2)。html

图数据库对于复杂关系数据查询起来效率高的主要缘由是在数据输入的时候就已经对关系进行了处理和索引,这样作在查询的时候具备很高的效率,可是在数据导入的时候会很慢。QQ群的15亿个关系在向图数据库neo4j里导入的时候花了3天都没弄完,也没有进度提示,因此后来我直接放弃了。java

数据处理node

在QQ群和群成员关系里面,对于层数我是这么定义的:mysql

大数据学习

你们能够看出这样的查询是能够递归的,假设每一个QQ号所加入的群数量和每一个群的成员数量为N,那么查询3层数据时总计算量为N*N*N=n^3,因此当查询层数为c层的时候,计算复杂度是N^c。web

前面说过,图数据库的计算复杂度通常在N^2如下,因此当使用普通的关系型数据库的时候,若是查询的层数很少,效率和图数据库比起来差很少,加上关系数据库自带的便于管理和导入导出的属性,因此我仍是选择了mysql数据库。sql

对于QQ和QQ群之间的关系,每一个QQ号都能加入群,一个群里也有不少QQ,基本都在几十到几百人,因此两个QQ号在同一个群里不必定表明他们的关系很紧密,换句话说QQ和QQ群之间的关系相对于QQ好友而言相对较弱。可是这并不表明咱们从中不能分析出有用的资料,俗话说的好,大数据就像一座金矿,只有用力挖才能挖到金子。数据库

d3.js支持多种数据格式,好比JSON,XML,CSV,HTML等,由于PHP的数组能够很简单的转换为JSON格式,因此我选择用PHP写API来获取JSON数据。QQ和QQ群是一种典型的图数据的应用,QQ和QQ群做为节点(node),QQ加入了哪些群做为关系(link),d3.js内置了一个功能很强大的内建布局,叫作Force-Directed Graph(受力导向图),后面简称为force。force布局模拟了一些基本的物理粒子原理,好比引力和斥力(确切的说是模拟了电磁力和引力,在离的远的时候会互相吸引,在离的近的时候斥力急剧增长),而且能够调节力的大小和受力距离等等,能够说是自由度至关高。关于d3.js的force布局,在官网有详细的API和很多例子,这里我就不贴代码了。数组

在force布局里面,数据源的JSON能够有不少种不一样的格式和属性,可是基本格式以下:浏览器

大数据学习

其中nodes数组对应的是节点列表,links对应的是关系列表。

每一个节点能够有不少自定义属性,在d3.js能够针对每一个节点存取节点的属性,好比我定义num是QQ号或者群号,type表明节点是QQ仍是群,另外我在js里设定在type==‘qun’的时候显示群的图标,是qq的时候显示qq的图标。关系里面默认的属性有source和target,分别对应一个关系的两头,默认状况下关系里面的source和target对应的数字是节点在节点数组里面的位置index。可是我自定义成了qq号和群号。另外你也能够定义其余属性,好比auth表明这个QQ号在群里的权限,nick是群昵称。

对于QQ群这样的关系来讲,基本上在第4层和以上的QQ和群的关系就比较弱了,因此为了提升查询速度和减小节点数量,我只查询2层关系(少么?很多,要想一想有些群有超过500人……)。

首先,d3.js须要在浏览器里面运行,个人首选是Google Chrome,V8引擎的效率果真不错,在节点和关系很少的时候基本感受不到延迟,后来在FF和IE11里面测试了一次,FF比Chrome卡一半左右,IE的话我只能呵呵了……

先拿小马哥作个测试,QQ号是霸气的10001。当d3.js导入完数据JSON的时候,各类节点会在屏幕上乱飞几秒钟,直到他们的力达到一个稳定的平衡点。结果以下:

大数据学习

你们也能够看到,群主和管理员的关系线也比普通的群成员长一些,这是为了突出群内的重要成员的关系。

图标旁边自动标注了QQ号和群号,若是有的话还有群名。没有在QQ号旁边标注昵称是由于不少人加入不一样的群使用的是不一样昵称,因此把昵称放到了其余的地方显示。

在下图中你们能够隐约的看到,全部的关系都是以QQ 10001为起点的。

大数据学习

在图上节点是能够拖拽的,拖拽后会固定在你释放的地方。咱们把几个群稍微拖的分开一点,关系就一目了然了。

大数据学习

这个时候咱们能够看到在目标的QQ群里也有不少共同QQ号,好比有些QQ号同时加入了2,3个群。群名显示的都是各类产品开发讨论群,这些同时加入2,3个产品群的人估计不是产品经理就是主管吧……、

大数据学习

鼠标悬停到群图标上能够看到群的详细信息(若是有的话)

大数据学习

由于不少人在不一样群里的昵称不同,因此群内昵称等信息就只能放到link上面了,由于线比较细,因此鼠标比较难对准,这个功能还待修改。

这个家伙和小马哥一块儿同时在3个群里,好基友?

大数据学习

下面咱们来看看更加实际的应用,好比把某圈子里的人找出来。咱们先从某土豪大黑阔大牛的QQ号入手:

初始数据好多……此大黑阔加入的群够杂的,不过就是由于杂因此才能更深刻的了解一我的的全部喜爱。看看群名神马的,我好像看到了dota,XX国际俱乐部,web技术交流,XXsec等群……充分说明了此人……是个屌丝技术宅大黑阔,XX国际俱乐部又彷佛带着那么种高大上的感受……

图中错综复杂的各类关系组成了一朵朵怒放的菊花,向咱们诉说着他的历史……

大数据学习

为了理清他那不堪回首的过去和关系网,我特意把浏览器窗口拖到第二个屏幕上,而后把群挨个分开。为了保护当事人的隐私,这张图我打码了。

这张图比较宽,建议你们下载下来放大看

大数据学习

总结

假如把层数扩展到4层,不知可否筛选出中国全部黑阔的QQ号呢?至少我已经在这张图里看到了不少熟悉的名字和号码。 腾讯老是说漏洞早已修复,不存在问题了,广大网民放心,但实际上信息泄露这种事情,岂是你漏洞修复好了就结束了的事情?

做者: Anthr@X anthrax@insight-labs.org

2016企业革新方案大放送,慧都联合IBM为你量身打造大数据专属解决方案!详情请咨询在线客服>>>

相关文章
相关标签/搜索