OpenRank 和 OpenGalaxy

2020-10-30

「加权 PageRank 下的 GitHub 全域项目活跃度分析」一文中,我详细介绍了一种基于 WPR 的全域项目活跃度分析方法,本文将据此进行深入并进一步形式化,使其成为一种更加通用的全域项目分析方法,我将其命名为 OpenRank,而基于 OpenRank 的图构建方法,可以进一步引申出一种图网络可视化方法,我将其称之为 OpenGalaxy,即开源星系。

opengalaxy_2019

OpenRank

我们将基于上一篇博客的内容,提出 OpenRank 这样一种基于行为数据的全域项目中心度计算方法。我们先给出一种较为宽泛的形式化表示。

在所有开源项目及其行为日志上,我们定义某开发者在某具体项目上的活跃度 $A = f(B)$,其中 $A$ 为该开发者在该项目上一段时间内的活跃度;$B$ 为该开发者在该项目上一段时间内的所有行为的集合;$f$ 为一个函数映射,将该开发者在项目上的行为映射为一个活跃度的值,且 $f$ 满足对于 $B$ 的数量而言是严格递增的,即开发者的行为数量越多,则认为该开发者的活跃度越高。

基于活跃度 $A$ 的定义,我们定义两个项目的相关度 $R = \sum_{dev}{g(A_1, A_2)}$,其中 $R$ 为两个项目的相关度;$A_1$ 为项目 1 中某开发者的活跃度,$A_2$ 为项目 2 中对应开发者的活跃度;$g$ 为一个函数映射,即通过某开发者在两个项目上的活跃度来计算该开发者对项目相关度的影响,且 $g$ 满足对于 $A_1$,$A_2$ 是对称的,并对于 $A_1$, $A_2$ 的偏导均严格大于 0,即开发者在任意项目上的活跃度增加,则两个项目的相关度增加。

基于上述定义,我们给出 OpenRank 的定义,即 OpenRank 为基于上述项目集合与相关度 $R$ 构建一个图网络,其节点为项目,若两个项目的相关度大于 0,则两个项目间存在一条边,且改边的权值为 $R$。在上述图中,我们应用 Weighted PageRank 算法,所得到的每个节点的 PageRank 值我们称之为 OpenRank 值,上述的图构建与运算方法,我们称之为 OpenRank。

那么上一篇博客的内容事实上是 OpenRank 的一个特定实现,具体可以看为:

  • 对于活跃度 $A = f(B)$,我们将 $B$ 中 Issue comment、Open Issue、Open PR、PR review comment、Merge PR 这五个行为的权重设置为 1-5,而其他所有行为的权重为 0,且 $f$ 的定义为:每种行为的活跃度计算为权重与次数相乘,最终所有行为的活跃度累加后开方,得到整体活跃度。
  • 对于相关度 $R = \sum_{dev}{g(A_1, A_2)}$,我们定义 $g$ 为调和平均和,其满足对称且偏导严格大于 0。

则在上述给定的特殊实现下,我们就得到了一个 OpenRank 的实现。

OpenRank 的创新性

在传统的代码协作的研究中,仓库挖掘是一种极为重要的手段,主要以提交内容为主体进行研究,包含对代码的深入分析。而 OpenRank 则采用了完全不同的思路,这种思路事实上是社交网络研究中的方式,即通过行为与关系构建价值网络,而无需知道具体协作的内容。

事实上由于 OpenRank 是 PageRank 的一种衍生算法,故拥有与 PageRank 类似的特征,即整个价值网络的计算完全是根据网络拓扑结构进行的,而不关心具体的内容。例如 PageRank 仅根据网页的出入链关系来计算而不关心网页的具体内容,同样 OpenRank 仅根据协作关系来计算而不关心代码仓库的具体内容。

但与此同时,在 OpenRank 中,因为特殊的构建方式,并不会面临 PageRank 中的两个问题:

  • 自链接问题,即如果一个网页包含指向自己的出链,则会产生问题。但显然在 OpenRank 的图构造方式下,不会出现自己指向自己的边。
  • PageRank 黑洞问题,即如果有一组网页仅有链入它们的入链,而没有出链,则这一组网页会不断吞噬 PageRank 值而不会向外输出,导致最终 PageRank 值被完全吸入。但由于 OpenRank 中是无向图(或认为是每条边都有对应的另一个方向的有向边),故不存在这种黑洞。

即便如此,我们依然保留了经典 PageRank 算法中的阻尼系数,并未直接去掉。

由此可以看出,OpenRank 可以脱离代码仓库的具体内容,而仅通过全域开发者在不同仓库中的活跃情况来判断项目的影响力,具有极大的创新价值。

OpenGalaxy

在上述图网络构造下,我们可以对所有的项目与其关系进行可视化,并得到一副开源世界的全景图,我们将其称为 OpenGalaxy——开源星系。

而在进行可视化之前,我们可以使用聚类算法对项目进行聚类,从而从协作层面观察项目的分类情况,可以使用 Louvain 这样的经典社区发现算法对项目进行聚类。之后可以进行部分裁剪从而使可视化具有可行性,并将规模较大的一些项目群落标注出来。

结果

关于 OpenRank 的结果可以参见上一篇文章,关于 OpenGalaxy 可以参见下图:

opengalaxy_2019

本图是对 2019 年全域项目在 WPR 和 Louvain 下计算后进行部分节点和边的裁剪后生成的图像,裁剪规则为节点的 OpenRank 值大于 1 且边的关联度大于 2,在该裁剪规则下,剩余了项目共计 171141 个,剩余边 2811489 条。

其中最大的项目群分别为 TypeScript 与前端、云原生、AI 类库、工具、PHP、微软、系统、生物技术、区块链等,这些领域一共包含了近 10W 个项目。

而我在周边也标注了一些小的项目群落,主要是认为这些开源项目群落有较好的自组织特征,在没有大型技术企业支撑的情况下可以完成较活跃的社区建设和项目维护,是开放组织中应该被深入研究的对象。

遗留问题

接下来我们看一下之前遗留的一些问题:

图网络构建方式是否唯一?

显然不是的,图网络构建的方式是多种多样的,我们可以通过图降维的方式将异质信息网络降维为同质网络后进行分析,也可以直接在异质信息网络上直接进行分析,而且降维的方式也是多种多样的,并不一定就是本文中所使用的方法,故我们会在 OpenRank 中对图网络构建方式进行泛化。

活跃度的计算方式是否唯一?

不是的,开发者在项目上的活跃度的计算方法并不唯一,但秉承的原则是利用开发者的行为数据进行计算,而不关注代码本身的内容。在开发者活跃度计算中,选用哪些行为,这些行为的权重以及是否包含例如边际收益递减等经济学相关的内容,都是可以探讨的,故我们会在 OpenRank 中对活跃度计算方式进行泛化。

如何区分 WPR 计算前的活跃度与计算后的活跃度?

在上一篇博客中,我没有刻意区分开发者在项目上的活跃度与项目网络在 WPR 下计算得到的 PageRank 值的名称,导致容易产生误解和混淆。由于 PageRank 算法本身是一种中心度算法,其最初在网页计算中也被认为是计算网页重要性或影响力的算法,事实上在项目网络中,PageRank 值收敛后,其代表的意义为该项目在整个网络中的中心度,故我们将其称为 OpenRank 值,也在这里定义为开源项目在 Open Galaxy 中的影响力。