随着开源生态的迅猛发展,越来越多的开发者加入到开源社区中,以开放、共享、协同的软件开发模式构建开源项目。许多代码托管平台如GitHub上托管着海量的开源项目,涵盖各类技术领域,开发者可以通过关键字搜索自己感兴趣的主题或项目名称进行浏览探索、加入或者代码重用。然而,开发者往往需要花费大量的时间和精力,才能通过关键词准确地描述自身的兴趣与目标项目的特征,找到符合自身需求的开源项目。针对这一问题,本文提出了一种基于二分网络表示学习的开源项目推荐方法。该方法结合开发者在参与项目贡献时的不同参与方式,构建出基于活跃度模型的开源贡献二分网络,并融合开发者与项目之间的显式关系和隐式关系,学习开发者的兴趣和技术偏好,向开发者进行个性化开源项目推荐。实验结果表明,本文所提的方法在推荐20个候选项目时的正确率超过42.37%,能够有效地为开发者推荐其感兴趣的开源项目。 With the rapid development of the open source ecosystem, more and more developers have joined the open source community to build open source projects with an open, shared, and collaborative software development model. Many code hosting platforms, such as GitHub, host a large number of open source projects, covering various technical fields. Developers can search for topics or projects they are interested in by keywords to explore, contribute, or reuse code. However, developers often need to spend a lot of time and energy to accurately describe their interests and characteristics of target projects through keywords, and find projects that meet their own needs. To solve this problem, this paper proposes an open source project recommendation method based on bipartite network representation learning. This method combines the different participation methods of developers when participating in project contributions, constructs an open-source contribution bipartite network based on the activity model, and integrates the explicit and implicit relationships between developers and projects to recommend open source projects to developers. The experimental results show that the accuracy of the proposed method can achieve over 42.37% when recommending 20 candidate projects, which means it can effectively recommend closely correlated projects to developers.
随着开源生态的迅猛发展,越来越多的开发者加入到开源社区中,以开放、共享、协同的软件开发模式构建开源项目。许多代码托管平台如GitHub上托管着海量的开源项目,涵盖各类技术领域,开发者可以通过关键字搜索自己感兴趣的主题或项目名称进行浏览探索、加入或者代码重用。然而,开发者往往需要花费大量的时间和精力,才能通过关键词准确地描述自身的兴趣与目标项目的特征,找到符合自身需求的开源项目。针对这一问题,本文提出了一种基于二分网络表示学习的开源项目推荐方法。该方法结合开发者在参与项目贡献时的不同参与方式,构建出基于活跃度模型的开源贡献二分网络,并融合开发者与项目之间的显式关系和隐式关系,学习开发者的兴趣和技术偏好,向开发者进行个性化开源项目推荐。实验结果表明,本文所提的方法在推荐20个候选项目时的正确率超过42.37%,能够有效地为开发者推荐其感兴趣的开源项目。
开源项目,项目推荐,二分网络,表示学习
Haiming Lin1, Chunqi Tian1, Wei Wang2
1Department of Computer Science and Engineering, Tongji University, Shanghai
2School of Data Science & Engineering, East China Normal University, Shanghai
Received: Dec. 14th, 2021; accepted: Jan. 10th, 2022; published: Jan. 17th, 2022
With the rapid development of the open source ecosystem, more and more developers have joined the open source community to build open source projects with an open, shared, and collaborative software development model. Many code hosting platforms, such as GitHub, host a large number of open source projects, covering various technical fields. Developers can search for topics or projects they are interested in by keywords to explore, contribute, or reuse code. However, developers often need to spend a lot of time and energy to accurately describe their interests and characteristics of target projects through keywords, and find projects that meet their own needs. To solve this problem, this paper proposes an open source project recommendation method based on bipartite network representation learning. This method combines the different participation methods of developers when participating in project contributions, constructs an open-source contribution bipartite network based on the activity model, and integrates the explicit and implicit relationships between developers and projects to recommend open source projects to developers. The experimental results show that the accuracy of the proposed method can achieve over 42.37% when recommending 20 candidate projects, which means it can effectively recommend closely correlated projects to developers.
Keywords:Open Source Projects, Projects Recommendation, Bipartite Network, Representation Learning
Copyright © 2022 by author(s) and Hans Publishers Inc.
This work is licensed under the Creative Commons Attribution International License (CC BY 4.0).
http://creativecommons.org/licenses/by/4.0/
随着互联网的发展,软件开发工具与社交媒体 [
尽管开源社区发展迅速,但由于这些开发者来自于世界各地,性格特征、文化与专业知识背景各不相同 [
针对上述问题,本文提出一种基于二分网络表示学习的个性化开源项目推荐方法,该方法基于开源生态系统的演化过程中沉淀下来的海量的开发者贡献与协作行为数据,构建出基于活跃度模型的开源贡献二分网络,并对网络中的显式关系与隐式关系进行学习,为开发者推荐符合其软件开发活动偏好和兴趣的开源项目,从而提升大规模群体协同的效率,从而促进开源软件生态系统的良性发展。
随着开源软件和开源技术的蓬勃发展,对于开源生态系统的研究也成为近年来的热门研究领域。而开源生态系统中的项目推荐,是促进开源生态快速健康发展的实际需求 [
本节首先给出基于二分网络表示学习的个性化推荐方法框架,然后介绍如何基于活跃度模型构建开源贡献二分网络,接着详细描述了如何建模网络中的显式关系和隐式关系,最后给出了融合显式关系与隐式关系的个性化推荐算法。
推荐算法框架如图1所示。整体算法框架分为四个模块。第一个模块首先从GitHub获取开发者历史行为数据;第二个模块主要是基于活跃度模型,通过计算开发者对项目活跃度贡献值的大小,建立开源贡献二分网络;第三个模块对节点间的显式关系和隐式关系进行建模;第四个模块将显式关系和隐式关系的目标函数结合起来,得到网络节点的嵌入向量,计算开发者和项目的相关性得分,最后根据评分对开发者进行项目推荐。
图1. 开源项目推荐框架
首先,我们以开发者和项目作为两类节点,构建二分网络。定义开源贡献二分网络 G = ( U , V , E ) ,其中U和V分别表示开发者节点集和项目节点集, E ⊆ U × V 是网络中边的集合,且E仅存在于节点集U和V之间。每条边带有一个权重值 w i j ,表示节点 u i 和 v j 之间的连接强度,本文中我们将其定义为开发者对项目的活跃度贡献值大小。图2展示了一个开源贡献二分网络的示例。
图2. 开源贡献二分网络示例
具体地,我们通过统计分析开发者的行为数据来评估某开发者在某具体项目中的活跃情况。根据文献 [
指标 | 含义 | 描述 |
---|---|---|
c i c | Issue Comment | 参与到项目某一具体Issue下的讨论 |
c o i | Open Issue | 在项目中开启一个新的Issue |
c o p r | Open Pull Request | 提交一个新的Pull Request |
c p r r c | Pull Request Review Comment | 参与到项目某一具体Pull Request下的讨论 |
c p r m | Pull Request Merged | 提交的某一PullRequest被合入到项目代码仓库中 |
表1. 开源项目活跃度评测数据指标
基于上述开源项目活跃度评测数据指标,我们定义某开发者在某项目上一段具体时间内的活跃度计算方式为:
A d = ∑ w i c i
其中的 A d 为开发者活跃度,而 c i 为上述五种行为事件由该开发者触发的发生次数, w i 为该行为事件的加权比例。通过该公式,我们可以计算得到网络中开发者节点和项目节点之间连边的权重大小。
在开源贡献二分网络图中,如果开发者对项目产生过贡献,则开发者和项目之间即存在一条边。与BiNE [
开发者节点 u i 和项目节点 v j 之间的共现概率为:
P ( i , j ) = w i j ∑ e i j ∈ E w i j
其中 w i j 为边 e i j 的权重,公式表明,如果两个节点间连边的权重越大,即开发者与项目之间的联系越紧密,则它们共同出现的概率就越高。同时,我们采用重建分布的方法,用 u i 和 v j 嵌入向量的内积来定义相连接的两个节点之间的局部相似性,则开发者 u i 和项目 v j 之间的联合概率分布为:
p ⌢ ( i , j ) = 1 1 + exp ( − u i → ⋅ v j → )
为了在低维空间保持节点的显式关系,一种直接的方法是最小化这两种分布的目标函数。将两种分布之间的距离替换为KL散度,从而学习得到节点的表示向量,忽略无关约束后,得到:
O 1 = K L ( P | | P ⌢ ) = − ∑ e i j ∈ E w i j ln P ⌢ ( i , j )
在开源贡献二分网络中,相同类型的两个节点之间不存在直接相连的边。但如果相同类型的两个节点之间存在着路径,如图2中David和Marry都参与了elasticsearch项目的贡献,同时与该项目存在连接关系,则表明它们之间存在某种隐式关系,并且路径的数量和长度即表示隐式关系的强度 [
首先,将开源贡献二分网络转化成两个同质网络,即开发者网络和项目网络。根据Co-HITS [
w i j U = ∑ k ∈ V w i k w j k
上式表明两个开发者节点之间的关联程度由所有桥接这两个开发者的项目决定。同理可得项目网络的权重矩阵为:
w i j V = ∑ k ∈ U w k i w k j
因此我们可以使用对称矩阵 W U = [ w i j U ] 和 W V = [ w i j V ] 分别表示这两个同质网络的邻接矩阵。接着我们分别在这两个同构网络上执行有偏随机游走,将从每个节点开始的随机游走的数量与其中心度相关联,即节点的中心度越大,则从它开始的随机游走序列越多,最后得到开发者序列和项目序列两个语料库 D U 和 D V 。
接着我们在这两个语料库上使用skip-gram模型,学习节点的表示向量。具体地,给出开发者语料库 D U 中的一个节点游走序列 S ,令 C S ( u i ) 表示开发者节点 u i 的上下文节点,得到以下目标函数:
max f O 2 = ∏ u i ∈ S , S ∈ D U ∏ u c ∈ C S ( u i ) P ( u c | u i ; f )
同样,可以得到项目语料库 D V 的目标函数为:
max f O 3 = ∏ u j ∈ S , S ∈ D V ∏ v c ∈ C S ( v j ) P ( v c | v j ; f )
根据现有的网络嵌入方法,采用嵌入向量的内积和Softmax函数来表示中心节点 u i (或 v j )与它的上下文节点 u c (或 v c )的共现概率:
P ( u c | u i ) = exp ( u i → T θ c → ) ∑ k = 1 | U | exp ( u i → T θ k → )
P ( v c | v i ) = exp ( v j → T ϑ c → ) ∑ k = 1 | U | exp ( v j → T ϑ k → )
得到了开源贡献网络的显式关系和隐式关系后,将它们的目标函数结合起来,建立联合优化框架:
O = α ( ln O 2 + ln O 3 ) − β O 1
其中, α 和 β 为超参数,通过调节 α 和 β 的大小以适应不同的网络,如果 α 越大,则网络的隐式关系对节点表示学习的影响越大, β 越大,则表示显式关系的影响越大。
得到开发者节点和项目节点的嵌入表示 u i 和 v j 后。通过以下具体公式计算得到开发者和项目的相关度得分:
s c o r e ( u i , v j ) = u i → T × v j →
通过该公式,我们可以计算得到任意的某一开发者和某一项目的相关性得分。基于此,我们计算开发者与所有的候选推荐项目的得分,并根据分数排名得到Top-N的项目,最后将这些候选项目推荐给开发者。
本文采用GHTorrent (2016/10/6)的公开数据集。GHTorrent是一个离线的GitHub数据镜像,通过调用GitHub REST API接口来获取GitHub开放的公共事件流数据,归档记录GitHub平台所提供的问题讨论(Issue)、合并请求(Pull Request)等功能的用户历史行为数据,并以Json格式存储在MongoDB数据库中。在实验过程中,筛选出具有代表性的拥有至少10个仓库以上的1621位开发者,这些开发者每位都至少拥有10个仓库。对这些开发者的历史行为数据进行抽取,主要包括issue、issue comment、pull request、pull request comment、pull request review comment等,共涉及20367个项目。
考虑到本文推荐场景的特殊性,开发者由于时间和精力的限制,在一定时间内参与贡献的项目数量有限,因此我们选用正确率Accuracy指标来验证本文方法的有效性,具体定义公式如下所示:
Accuracy = | { u | u ∈ U , R ( u ) ∩ T ( u ) ≠ ∅ } | | U |
其中 U 表示测试集中的所有开发者集合, R ( u ) 表示向开发者 u 推荐的项目集合, T ( u ) 表示开发者 u 在测试集中实际参与贡献的项目集合。倘若 R ( u ) 与 T ( u ) 的交集不为空,则说明开发者实际至少参与了一个推荐的候选项目。
我们选取了基于项目的协同过滤推荐、基于用户的协同过滤推荐、基于用户行为和项目特性的推荐三个对比模型来验证本文所提方法的性能:
基于项目的协同过滤推荐:该算法基于开发者对已参与项目的评分,通过计算项目之间的相似度,将评分最高的若干个相似项目推荐给开发者。
基于用户的协同过滤推荐:该算法首先计算开发者和开发者之间的相似度,找到与目标开发者特征相似的若干开发者,然后获取这些开发者所参与的项目集合,并将集合中的目标开发者未参与的项目作为推荐项目列表。
基于用户行为和项目特性的推荐:该算法首先从项目的描述文档中提取项目之间的相似度,并从开发者历史行为数据中提取开发者的行为特征,然后使用模拟退火算法自动优化参数配置,为开发者推荐与其最为相关的Top-N个项目。
不同的推荐模型实验结果如表2所示。实验结果表明,本文提出的方法在推荐Top-5、Top-10、Top-15、Top-20个项目时的表现均优于其他推荐模型,说明本文的模型能更好地提取开发者在开源贡献过程中所表现出来的显式和隐式的兴趣偏好,从而提高推荐的准确性。
项目协同过滤(%) | 用户协同过滤(%) | 基于项目内容(%) | 本文的方法(%) | |
---|---|---|---|---|
Top-5 | 4.37 | 12.68 | 18.61 | 29.85 |
Top-10 | 6.31 | 19.46 | 24.94 | 34.16 |
Top-15 | 7.68 | 23.54 | 28.22 | 38.84 |
Top-20 | 8.95 | 29.74 | 30.96 | 42.37 |
表2. 实验结果表
在此基础上,我们将commit参数引入到活跃度模型中,在计算开发者对项目的活跃度贡献值时,考虑开发者在项目仓库上的提交数,得到的推荐正确率如下图3。
图3. 加入代码提交信息后的推荐结果比较
从图3中可以看出,加入commit参数后,推荐模型的性能得到了一定的提升,这是因为代码提交行为同样是开发者的开源贡献行为之一,是活跃度模型的补充。当模型越完整时,就越能体现开发者对项目的兴趣和参与开源贡献时的特征偏好,从而提高推荐模型的性能。
本文针对开源场景下的项目推荐问题,提出了一种基于二分网络表示学习的开源项目推荐方法,基于活跃度模型将开发者参与项目贡献的过程建模成开源贡献二分网络,并融合开发者与项目之间的显式关系和隐式关系得到开发者的兴趣偏好,从而向开发者进行个性化开源项目推荐。最后在实验数据集上将本文的方法与传统的项目推荐方法进行比较,实验结果表明,本文所提的方法综合考虑了开发者与项目之间的显式关系和隐式关系,能更好地表征开发者的兴趣偏好,从而有效地提升的推荐效果。
未来的工作可以关注如何更好的建模开源协作场景下的复杂交互关系,从而更好地从开发者的历史贡献记录中捕捉到开发者隐式的兴趣偏好,从而提高项目推荐任务的性能。此外,为了更精确地评估本文所提方法的真实效果,考虑将推荐的结果发送给部分GitHub中的开发者,基于开发者真实的反馈进一步提高方法的准确性。
国家自然科学基金(61772372),上海市大数据管理系统工程研究中心开放课题。
林海铭,田春岐,王 伟. 基于二分网络表示学习的开源项目推荐方法Open Source Project Recommendation Method Based on Bipartite Network Representation Learning[J]. 计算机科学与应用, 2022, 12(01): 54-62. https://doi.org/10.12677/CSA.2022.121007