最近在上Coursera的SNA社交网络分析,翻之前学生做的大作业压力好大,有做知识网络Network map of Knowledge and Art,有做俄罗斯选举的投票网络,还有类似的哲学的发展网络。按照哲学家网络的思路,我拿编程语言的网络来练个手,每种语言是一个节点,如果语言B受语言A的影响,则B向A连边,比如Java和Python都有受Smalltalk的OO影响,smalltalk又受Lisp,Logo影响。

数据获取
数据来自DBpedia语义数据库,简单的说,它收集的是维基百科的数据,然后经过一些处理得到结构化的语义web。互联网发明人蒂姆·伯纳斯-李曾在TED演讲"关联数据",互联网最初的设计只是想把文档放在一起而已,但是现在互联网还是有巨大的可释放潜力,我们从网上得到的数据不是我们想要的数据。在DBpedia如果你去找John McCarthy,会包含了与John McCarthy相关的信息,它们被联系到了一起,比如他的导师、他所带出来的学生、出生年、出生地、获得的成就等,下一代搜索引擎比如Wolfram|Alpha就是这么工作的。
然后用SparQL,它将Web2.0和Semantic web两种新的web技术联系起来,你可以直接在web页写类似sql语句进行查询编程语言以及该编程语言收到那些语言的影响(要翻墙):

SELECT * WHERE {
?p a <http://dbpedia.org/ontology/ProgrammingLanguage>.
?p <http://dbpedia.org/property/influencedBy> ?influencedBy.
}

拿到数据初始化/归一化,导出为csv。

数据可视化
使用Gephi进行数据可视化,这是个开源的复杂网络分析软件,没教程也能上手。这里生成了552 nodes, 1011 edges的网络,平均路径长度3.126,Force Atlas Layout,使用HITS算法提炼枢纽节点,可见Lisp, Smalltalk, C, Java, Scheme, Pascal在语言发展中的地位,不过ALGOL和Fortran不是很大,估计是太古老太传说了,新语言出度没有传递给这两者。
颜色按Community分类:绿色是functional language和logic language,橙色是object-oriented,淡蓝色Javascript,Pascal和Ada,ALGOL在一起,Lisp和Scheme分家了,看看就好。

network

节点大小按Degree设置,标出了一些有代表性的语言 比如R,Logo, Prolog, COBOL
network

如果把C语言和他的邻居受C语言影响和影响C语言的节点筛选出来,C的入度有54是所有节点里最大的,庞大的C家族一目了然:
红色表示出度,C的前身是B,原型是ALGOL 60,受Fortran和PL/I影响用= operator来表示赋值,而非ALGOL的:= operator。
蓝色入度表示C影响了C++, Python, Perl, JavaScript等语言,大部分都借鉴了C的语法。
network

Python,胶水语言,借鉴了Perl, C++, Lisp, Java, Haskell, C, ALGOL, Dylan, Icon等等等等
network

Haskell出度14是最大的,除了Lisp, Scheme, ML/Standard ML好多不认识的语言,冷艳高贵orz
network

我把Lisp, C++, Smalltalk, Java, R, javascript也做了图,放在了豆瓣相册

最后感觉编程语言网络好看有余营养不足:没有时间信息,层次也没有树状清晰。不过可以像豆瓣代码大爆炸一样按时间添加节点效果会很赞。除了分析枢纽Hub节点和平均路径长度应该还有可以挖掘的地方。