vlambda博客
学习文章列表

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

提要

GitHub 是最大的软件开发托管服务平台之一,拥有超过 4000 万用户和 1 亿个软件仓库。GitHub 提供了一个趋势页面,帮助软件开发人员在一段时间内发现潜在的存储库。此外,GitHub 引入了一个名为“Topic”的功能来标记仓库库。但是,GitHub 没有明确提供用户偏好信息。软件开发人员很难找到满足他们偏好的个性化 GitHub 趋势存储库。

在本文中,我们提出了一项名为 GHTRec 的服务,为软件开发人员推荐个性化的 GitHub 趋势存储库。首先,我们使用深度学习方法来预测 GitHub 存储库的主题。接下来,我们利用软件开发人员提交的历史存储库来推荐 GitHub 趋势存储库。然后我们评估我们的主题预测模型和推荐服务,结果表明我们的 GHTRec 服务可以推荐满足开发人员主题偏好的趋势存储库。



背景与创新点


在软件开发中,软件开发人员经常需要相互合作,复用其它代码库中的代码。这种需求推动了许多在线代码协作平台的出现,其中最著名的就是 GitHub,该平台上托管了超过 4000 万的开发人员和超过 1 亿个软件仓库。为了更好的依照软件开发者偏好进行软件仓库 的搜索,GitHub 提供了两个功能:一个是 GitHub Trending 页面,GitHub 列出了 Trending 页面上某个时间范围内项目体量和关注度增长最大的 25 个软件仓库,并每天更新。用户可以根据时间范围、软件仓库的编程语言等筛选出感兴趣其中感兴趣的Trending 软件仓库。相关研究表明,如果一个软件仓库在趋势页面中出现,其项目的托管团队也会得到相应的扩张,表明 GitHub Trending 仓库的选取在软件开发中发挥着重要的影响。另一个功能是Topic,它允许开发人员为自己的软件仓库分配主题标签。合适的主题 往往会帮助其它开发人员更容易找到和理解这个软件仓库。GitHub 提供的基于主题的搜索远非理想且GitHub 缺少针对软件开发者的个性化流行软件仓库推荐服务。基于以上背景和开发者遇到的难题,我们提出了一种面向软件开发者的个性化Trending软件仓库 推荐服务,并命名为“GHTRec”,用于向软件开发人员推荐个性化的GitHub流行软件仓库。本文主要贡献如下:


  • 训练了一个GitHub代码仓库的Topic预测模型。

  • 设计了为软件开发人员推荐当天或一段时间内的个性化的 GitHub 流行仓库的服务。

  • 已经将推荐服务实现为了Chrome浏览器扩展,以帮助软件开发者实际使用并获得推荐服务



方法


本文设计方法的架构如图所示,包含三个部分:(1)设计并训练了一个深度学习模型,为GitHub软件仓库预测Topic标签。需要预测的仓库包含GitHub的Trending仓库和软件开发者的历史提交仓库;(2)本文设计了一个根据软件开发者历史提交开源项目,计算用户主题向量的方法;(3)本文提出了一种为开发人员重排列 GitHub Trending软件仓库的方法。用户可以使用该服务提供的界面浏览个性化推荐的流行仓库。

图1:GHTRec服务的架构

(1)GitHub主题标签预测部分


在模型选择方面,本文选择了BERT的预训练模型,通过输入软件仓库的描述文本和readme文本,输出仓库的主题分布。模型结构如图所示。

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

图2:软件仓库主题预测模型的架构

(2)开发者主题偏好生成部分


获取开发者历史提交软件仓库并预测其主题向量,累加形成开发人员的主题偏好。

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

图3:开发者的主题偏好向量生成

(3)Trending仓库重排序部分


通过向量相似度计算方法对Trending软件仓库进行重排序。



验证


(1)主题预测模型验证


通过在数据集上训练不同的存储库主题预测模型,本文预测不同数量的存储库主题时显示每个模型的结果。随着预测主题数量的增加,模型的成功率和召回率增加,精度降低。


对于本文提出的BERT模型,可以发现其在保证精度的基础上成功率和召回率较其他方法有较大提升。因此可以认为,在GitHub存储库预测特征主题的情况下,用BERT方法是合适的。

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

表1:主题预测模型对比实验结果

(2)推荐服务验证


为了评估该服务的有效性,一个是评估该服务是否可以为软件开发人员推荐某一天的trending软件仓库。另一个是评估该服务是否可以为软件开发人员推荐一个时间段内的个性化trending仓库。在实验中,本文随机选择了 7 天进行服务验证。在这7天里,通过不同的相关性计算方法为软件开发者推荐GitHub趋势库,结果如表2所示。


在实验中我们也设置了无服务状态的实验,和使用仓库名的相似度进行推荐的启发式实验进行对比,这个实验证明了我们的服务在各项指标的效果都优于对比实验,其中用向量交集计算相似度的效果最优

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

表2:单日趋势仓库推荐服务对比实验结果

为了评估该服务是否可以在一段时间内为软件开发人员进行推荐服务。本文随机选择一天(以2021年1月3日为例)来探索推荐服务在不同时间段推荐仓库的能力。


在实验中,我们的服务可以为近50%的开发者提供便利,帮助他们在一周内维护与其主题偏好相匹配的流行仓库。以半个月为例,我们的服务仍然有接近30%的HitRatio。

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

图4:不同时间长度下趋势仓库推荐服务的对比实验结果

然后本文探索了预测仓库主题预测数量对推荐服务的影响,从实验结果可得,在增加预测主题数量的开始,越来越多的属于trending仓库的主题被预测,因此HR和MRR都在增加。由于仓库的真实topics数量较少,随着预测主题数量的进一步增加,trending仓库和开发者的主题偏好中杂质越来越多,导致MRR下降。可以预见,如果预测的话题数量进一步增加,HR也会开始下降。因此,选取合适数量的仓库预测主题对推荐服务的效果也起到了重要作用。

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

图5:仓库的不同主题预测数量对推荐服务的影响结果

最后,本文评估了 GHTRec 服务的稳定性。本文随机选取一天(以 2021 年 1 月 11 日为例),然后以五天为间隔选取几个连续的时间段进行评估,结果如图 6 所示。从结果中证明了推荐服务的在不同时间段内性能稳定。

回顾 | ghtrec:一个为开发者推荐github 趋势仓库的服务

图6:推荐服务的稳定性试验结果

GHTRec的系统实现中分为前端和后端,前端主要是Chrome插件,后端是一个flask服 务器项目。前端以以 Chrome 插件形式呈现,主要负责与用户进行交互,展示功能,实现的主要语言是 JavaScript、HTML和CSS。后端是一个flask项目,主要编程语言是Python,除去相应前 端请求的服务器项目之外,后端还包含一个日更的GitHub Trending仓库收集模块,主要为获取 GitHub Trending仓库, 按照时间存储在mongodb服务器中,此外还包含一个推荐模块,这个模块主要调用训练好的项目主体预测模型,对爬取的Trending仓库以及用户自己commit的仓库进行技术主题预测,由此得到仓库的偏重主题分布以及用户的偏好技术主题分布,基于两者的余弦相似度给出最终推荐。


编辑:孙通成