一种开源社区项目关系网络的构建方法及系统与流程

文档序号:19155888发布日期:2019-11-16 00:46阅读:271来源:国知局
一种开源社区项目关系网络的构建方法及系统与流程

本发明涉及计算机科学领域技术领域,尤其涉及一种开源社区项目关系网络的构建方法及系统。



背景技术:

随着软件产品的不断发展,开源软件逐渐成为软件发展史上的一支新兴力量,以github为代表的开源软件托管平台集成了很多开源应用程序,为开发人员提供了交流的平台。复杂的软件开发项目需要多个开发者共同完成,不仅开源社区中的开发人员之间需要更紧密的协同关系,而且开源项目之间也存在千丝万缕的关系。因此,有效识别项目之间的关系并构建项目网络,能够帮助开发人员更好的完成软件缺陷修复、新功能实现等工作。

lungu等人提出一种在源代码中通过提取外部方法及类的调用识别项目之间依赖关系的方法。然而,随着项目数量的增加,对源代码的分析就变得非常耗时。ossher等人介绍了一种通过分析java源代码中的引用包以解决项目间依赖关系的技术。但这项技术仍然需要处理大量的源代码,并且考虑到编程语言的多样性,该技术仍然无法满足人们的需求。

blincoe等人提出了一种检测项目之间技术依赖关系的方法,用于识别开源社区中的项目网络。这种方法利用在项目评论信息中出现的交叉引用来识别项目间的关系,而不依赖于源代码的分析。但是,由于没有充分考虑开发人员的行为习惯,忽略了交叉引用的多种匹配模式,导致识别的项目间关系有缺失。zampetti等人专注于研究开发人员对外部在线资源的引用链接,扩展了引用链接的多种匹配模式。但是,他们只考虑贡献请求的描述信息,忽视了引用出现的多种数据来源,同样会影响最终构建项目关系网络的完整性。

现有技术中识别开源社区项目之间关系的方法存在数据分析过程中的耗时问题和编程语言的多样性问题,同时忽略了引用出现的多种数据来源,使得工作效率低,精确度差。



技术实现要素:

鉴于上述的分析,本发明实施例旨在提供一种开源社区项目关系网络的构建方法及系统,用以解决现有数据分析过程中耗时问题、编程语言的多样性问题及因忽视多种数据来源而导致构建的项目关系网络不完整的问题。

本发明的目的主要是通过以下技术方案实现的:

一种开源社区项目关系网络的构建方法,包括以下步骤:

确定所述开源社区中可能发生链接的数据来源,根据链接的匹配模式,从数据来源中识别链接;

基于包含所述链接的项目和所述链接引用的项目构建项目数据集,依次爬取数据集中每一个项目的名称,判断所述项目是否发生重定向,对于发生重定向的项目,使用变更后的项目名称;

根据所述项目名称过滤项目内部的链接及不属于开源社区的链接,保留项目之间的链接;

基于项目之间的链接构建项目关系网络。

在上述方案的基础上,本发明还做了如下改进:

进一步,所述可能发生链接的数据来源包括问题报告、贡献请求、代码提交的描述信息和评论信息;

所述匹配模式包括num、sha和url;

所述根据链接的匹配模式,从数据来源中识别链接,包括:首先确定链接的数据来源,包括问题报告、贡献请求、代码提交的描述信息和评论信息;分别以num、sha、url三种链接的匹配模式从数据来源中匹配得到相应模式的链接。

进一步,若爬取到的项目名称与原有项目名称不相同,而且变更前后的项目名称均存在于项目数据集中,则项目发生重定向。

进一步,所述根据所述项目名称过滤项目内部的链接及不属于开源社区的链接包括:

使用爬虫技术依次爬取数据集中每一个项目的名称,在根据链接的匹配模式识别链接的同时,得到与链接相关的项目名称,若项目名称中有"用户/存储库",则属于该开源社区,否则不属于开源社区;

针对属于开源社区的项目,出现链接的项目定义为源项目,链接指向的项目定义为引用项目;当源项目与引用项目为同一项目时,该链接为项目内部链接,否则为项目之间的链接;

过滤项目内部的链接和不属于开源社区的链接。

进一步,所述基于项目之间的链接构建项目关系网络包括:

用节点xi和yi分别表示有链接关系的任意两个项目;如果由节点xi表示的项目链接到了由yj表示的项目,则构建从xi到yj的有向边;边的权重为一对项目节点xi和yi的链接次数;

依次构建开源社区中所有的有向边,得到所述项目关系网络。

另一方面,本发明实施例提供了一种开源社区项目关系网络的构建系统,包括识别单元、爬取单元、过滤单元和网络构建单元;

所述识别单元,用于确定所述开源社区中链接的数据来源,根据链接的匹配模式,从数据来源中识别链接;

所述爬取单元,基于包含所述链接的项目和所述链接引用的项目构建项目数据集,依次爬取数据集中每一个项目的名称,判断所述项目是否发生重定向,对于发生重定向的项目,使用变更后的项目名称;

所述过滤单元,用于根据项目名称过滤项目内部的链接及不属于开源社区的链接,保留项目之间的链接;

所述网络构建单元,基于项目之间的链接构建项目关系网络。

进一步,所述识别单元,用于确定所述开源社区中链接的数据来源,根据链接的匹配模式,从数据来源中识别链接具体包括:

所述可能发生链接的数据来源包括问题报告、贡献请求、代码提交的描述信息和评论信息;

所述匹配模式包括num、sha和url;

所述根据链接的匹配模式,从链接的数据来源中识别链接,包括:首先确定链接的数据来源,包括问题报告、贡献请求、代码提交的描述信息和评论信息;分别以num、sha、url三种链接的匹配模式从数据来源中匹配出链接。

进一步,所述爬取单元通过爬虫技术爬取数据集中每一个项目的名称,对比爬取到的项目名称与原有项目名称是否相同,若不相同,而且变更前后的项目名称均存在于项目数据集中,则项目发生重定向;对于发生重定向的项目,使用变更后的项目名称。

进一步,所述过滤单元过滤项目内部的链接及不属于该开源社区的链接包括:

根据链接的匹配模式依次爬取数据集中每一个项目的名称,项目名称中有"用户/存储库",则属于该开源社区,否则不属于开源社区;

针对属于开源社区的项目,出现链接的项目定义为源项目,链接指向的项目定义为引用项目;当源项目与引用项目为同一项目时,该链接为项目内部链接,否则为项目之间的链接;

过滤项目内部的链接和不属于开源社区的链接。

进一步,所述网络构建单元,基于项目之间的链接构建项目关系网络,具体包括如下步骤:

用节点xi和yi分别表示有链接关系的任意两个项目;如果由节点xi表示的项目链接到了由yj表示的项目,则构建从xi到yj的有向边;边的权重为一对项目节点xi和yi的链接次数;

依次构建开源社区中所有的有向边,得到所述项目关系网络。

与现有技术相比,本发明至少可实现如下有益效果之一:

1、根据链接的匹配模式,从数据来源中识别链接,解决了数据分析过程中的耗时问题和编程语言的多样性问题,提高了工作效率,减小了误差;

2、通过综合考虑开源社区中的软件活动,基于不同的数据来源识别更多的链接,实现了挖掘更多项目之间的关系,在提高识别更多链接可能性的同时,增强了项目关系网络的完整性。

3、针对开源社区中发生重定向的项目,统一使用变更后的项目名称,解决了名称变更对构建项目关系网络的影响,减小了误差,提升了系统运行的精确度。

本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其他特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过说明书以及附图中所特别指出的内容中来实现和获得。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为一个实施例中一种开源社区项目关系网络的构建方法流程图;

图2为另一个实施例中一种开源社区项目关系网络的构建系统结构图。

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。

本发明的一个具体实施例,公开了一种开源社区项目关系网络的构建方法。如图1所示,包括以下步骤:

确定开源社区中链接的数据来源,根据链接的匹配模式,从数据来源中识别链接;

基于包含链接的项目和链接引用的项目构建项目数据集,依次爬取数据集中每一个项目的名称,判断项目是否发生重定向,对于发生重定向的项目,使用变更后的项目名称;

根据项目名称过滤项目内部的链接及不属于开源社区的链接,保留项目之间的链接;

基于项目之间的链接构建项目关系网络。

根据链接的匹配模式,从数据来源中识别链接,解决了数据分析过程中的耗时问题和编程语言的多样性问题,提高了构建项目关系网络的工作效率,减小了误差。

优选的,链接的数据来源包括问题报告、贡献请求、代码提交的描述信息和评论信息;匹配模式包括num、sha和url;根据链接的匹配模式,从数据来源中识别链接,包括:首先确定链接的数据来源,包括问题报告、贡献请求、代码提交的描述信息和评论信息;然后分别结合常见的num和sha链接形式和用户同时使用的url超链接方式匹配数据来源中的链接。由于项目中的每个issue和pullrequest都有对应的序号,因此匹配到的"user/project#num"链接来源于引用项目中问题报告(issue)和贡献请求(pullrequest)的描述信息和评论信息;代码提交中由于存在校验信息,因此匹配到的"user/project@sha"链接来源于引用项目中代码提交(commit)的描述信息和评论信息;而以"github.com/user/project/*"和"api.github.com/repos/user/project/*"匹配到的url超链接则来源与引用项目的任何数据来源。即以num、sha、url三种链接的匹配模式从数据来源中匹配链接。

通过综合考虑开源社区中的软件活动,基于不同的数据来源识别更多的链接,实现了挖掘更多项目之间的关系,在提高识别更多链接的可能性的同时,增强了项目关系网络的完整性。

具体地,num:用户/存储库#序号("user/project#num")

sha:用户/存储库@校验码("user/project@sha")

url:域名/用户/存储库("github.com/user/project/*"和"api.github.com/repos/user/project/*")。

数据来源:问题报告(issue)、贡献请求(pullrequest)、代码提交(commit)是开源社区中常见的软件活动。通过问题报告用户可以报告软件缺陷,建议开发新功能等,其他人可以参与讨论,或给出反馈意见。当开发人员完成了缺陷修复或新功能实现后可以提交贡献请求,感兴趣的开发人员可以参与评论,交流意见。评审人员可以通过对提交贡献请求的评估决定是否合并到存储库中。针对代码修改,他们同样可以交换意见并讨论。因此,问题报告(issue)、贡献请求(pullrequest)、代码提交(commit)的描述信息和评论信息是识别链接的数据来源。

匹配模式:项目的全名遵循"user/project"模式,其中"user"是指开源社区的注册用户,"project"是指存储库的名称。项目中的每个issue和pullrequest都有对应的序号表示,"sha"是存储库中提交内容的校验和,也被称为commitid。因此,使用"user/project#num"和"user/project@sha"可以指向明确的项目的问题报告(issue)、贡献请求(pullrequest)或代码提交(commit),这也是现有方法中常见的链接形式。除此之外,我们通过对用户的行为习惯进行分析,发现用户同样会通过url超链接的方式("github.com/user/project/*"或"api.github.com/repos/user/project/*")引用项目,但是链接的这种表现形式目前并没有在任何方法中使用。

匹配过程具体包括:以"user/project#num"匹配来源于问题报告(issue)和贡献请求(pullrequest)的描述信息和评论信息中的链接,因为每个项目中的每个issue和pullrequest都有对应的序号,故可得到num模式的链接;以"user/project@sha"匹配来源于代码提交(commit)的描述信息和评论信息中的链接,得到sha模式的链接,以"github.com/user/project/*"和"api.github.com/repos/user/project/*"匹配来源于用户引用指定项目所使用的url超链接,得到url模式的链接。因此,我们综合考虑链接的多种表现方式,使用"user/project#num"、"user/project@sha"、"github.com/user/project/*"和"api.github.com/repos/user/project/*"模式匹配用户使用的链接。

优选的,开源社区中的一些项目会更换项目名称,我们称之为项目重定向。由于项目名称的更改,使得该项目会被识别为两个相互独立的项目,以至于在识别链接时会对两个项目分别进行计算,同时会将两个项目之间的链接认定为两个独立项目之间的链接。这会直接影响最终构建项目关系网络的结果。因此,若爬取到的项目名称与原有项目名称不相同,而且变更前后的项目名称均存在于项目数据集中,则项目发生重定向。对于发生重定向的项目,统一使用变更后的项目名称。

通过对开源社区中发生重定向的项目,统一使用变更后的项目名称,解决了名称变更对构建项目关系网络的影响,减小了构建项目关系网络的误差,提升了系统运行的精确度。

优选的,根据项目名称过滤项目内部的链接及不属于开源社区的链接包括:

使用爬虫技术依次爬取数据集中每一个项目的名称,在根据链接的匹配模式识别链接的同时,得到与链接相关的项目名称,若项目名称中有"用户/存储库",则属于该开源社区,否则不属于开源社区;识别项目名称的步骤如下:若用户在项目a的讨论中引用了项目b,认为源项目a和引用项目b之间存在相关关系,并把这次引用称之为链接;使用3种匹配模式识别链接,使用的3种链接模式中都包含“用户/存储库”的信息,而“用户/存储库”即是项目全称,是开源社区中项目的唯一标识;因此,在识别链接的同时,确定了引用项目的名称;

针对属于开源社区的项目,出现链接的项目定义为源项目,链接指向的项目定义为引用项目;当源项目与引用项目为同一项目时,该链接为项目内部链接,否则为项目之间的链接;

过滤项目内部的链接和不属于开源社区的链接。

通过过滤项目内部的链接及不属于开源社区的链接,避免了因项目内部的链接及不属于开源社区的链接存在而造成的误差,提高了构建项目网络关系的精度,减小了误差。

优选的,基于项目之间的链接构建项目关系网络包括:

用节点xi和yi分别表示有链接关系的任意两个项目;如果由节点xi表示的项目链接到了由yj表示的项目,则构建从xi到yj的有向边;边的权重为一对项目节点xi和yi的链接次数;

依次构建开源社区中所有的有向边,得到项目关系网络。

通过根据有向边的权重衡量两个项目之间关系的紧密程度,实现了开源社区项目关系网络的构建,简单易行,易于实施。

具体地,把构建的项目关系网络定义为一个有向图gd=<v,e>,v表示节点的集合,是涉及至少一个链接的开源社区中的项目。e表示一组节点对e(v)={(xi,yi)|xi,yi∈v},如果由节点xi表示的项目链接到了由yi表示的项目,则存在从xi到yi的有向边。边的权重是一对项目的链接次数,权重越高,表明两个项目之间的关系越紧密。

本发明的另一个具体实施例,如图2所示,提供了一种开源社区项目关系网络的构建系统,包括识别单元、爬取单元、过滤单元和网络构建单元;识别单元,用于确定开源社区中链接的数据来源,根据链接的匹配模式,从数据来源中识别链接;爬取单元,基于包含链接的项目和链接引用的项目构建项目数据集,依次爬取数据集中每一个项目的名称,判断项目是否发生重定向,对于发生重定向的项目,使用变更后的项目名称;过滤单元,用于根据项目名称过滤项目内部的链接及不属于开源社区的链接,保留项目之间的链接;网络构建单元,基于项目之间的链接构建项目关系网络。

通过识别单元,根据链接的匹配模式,从可能发生链接的数据来源中识别链接,解决了数据分析过程中的耗时问题和编程语言的多样性问题,提高了系统的工作效率,减小了误差。

优选的,识别单元,用于确定开源社区中链接的数据来源,根据链接的匹配模式,从数据来源中识别链接具体包括:

链接的数据来源包括问题报告、贡献请求、代码提交的描述信息和评论信息;匹配模式包括num、sha和url;根据链接的匹配模式,从数据来源中识别链接,包括:首先确定链接的数据来源,包括问题报告、贡献请求、代码提交的描述信息和评论信息;分别以num、sha、url三种链接的匹配模式从数据来源中匹配出链接。

通过识别单元,完成了基于不同的数据来源识别更多的链接,实现了挖掘更多项目之间的关系,提高识别更多链接的可能性的同时,增强了项目关系网络的完整性。

优选的,爬取单元通过爬虫技术爬取数据集中每一个项目的名称,对比爬取到的项目名称与项目数据集中的原有项目名称是否相同,若不相同,而且变更前后的项目名称均存在于项目数据集中,则项目发生重定向;对于发生重定向的项目,使用变更后的项目名称。

通过爬取单元,实现对开源社区中项目发生重定向的识别,统一使用变更后的项目名称,解决了名称变更对构建项目关系网络的影响,减小了构建项目关系网络的误差,提升了系统运行的精确度。

优选的,过滤单元过滤项目内部的链接及不属于该开源社区的链接包括:根据链接的匹配模式依次爬取数据集中每一个项目的名称,项目名称中有"用户/存储库",则属于该开源社区,否则不属于开源社区;针对属于开源社区的项目,出现链接的项目定义为源项目,链接指向的项目定义为引用项目;当源项目与引用项目为同一项目时,该链接为项目内部链接,否则为项目之间的链接;过滤项目内部的链接和不属于开源社区的链接。

通过过滤单元,完成了项目内部链接及不属于开源社区链接的过滤,避免了因项目内部的链接及不属于开源社区的链接存在而造成的误差,提高了构建项目网络关系的精度,减小了误差。

优选的,网络构建单元,基于项目之间的链接构建项目关系网络,具体包括如下步骤:用节点xi和yi分别表示有链接关系的任意两个项目;如果由节点xi表示的项目链接到了由yj表示的项目,则构建从xi到yj的有向边;边的权重为一对项目节点xi和yi的链接次数;依次构建开源社区中所有的有向边,得到所述项目关系网络。

通过根据有向边的权重衡量两个项目之间关系的紧密程度,实现了开源社区项目关系网络的构建,简单易行,易于实施。

本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1