本发明涉及软件开发领域,尤其涉及一种基于问题报告的软件语义摘要的自动生成方法。
背景技术:
软件复用技术是指在软件开发中,对现有资源的再利用从而避免重复劳动的解决方案。通过软件复用,可以极大的提高软件开发效率和质量。例如著名的手机照片分享应用instagram,在其发展之初只有5名技术人员,后端工程师不到3人,却利用了十多款开源软件,在仅仅8周时间内,打造了最初的instagram,并通过提供的稳定服务吸引了大批用户,软件复用的作用可见一斑。
同时,开源软件的发展为软件复用提供了丰富的资源。与商业软件不同,开源软件的代码是公开的,其他的软件开发者可以选择对整个软件或是软件中部分代码进行复用。但是开发者在复用之前,首先要了解其要复用的整个软件、目标文档或者某一段代码是如何工作的、有什么样的功能。对于整个软件来说,开发者可以从软件简介和文档中了解;对于细粒度的代码段来说,开发者可以通过代码段中的注释了解代码的实现过程。但是对于粗粒度的代码文件或者是规模大的代码,则很难从上述两种方式中进行了解,因为软件文档多是从整体功能和使用方式方面进行阐释,而注释又有很强的针对性,多个注释的拼接对了解大规模代码功能并没有帮助。人工通过读代码的方式效率又非常低,这与软件复用的初衷不符。因此对大粒度的代码文件或者代码段进行语义标注成为亟待解决的问题。
开源软件的项目托管平台(如github、gitlab等)已成为开源软件开发和维护过程中的重要角色,为开发者提供项目托管和开发进程管理的多项功能,极大的方便了开源软件的分布式开发。项目托管平台中存储着软件开发过程中产生的多种数据,如开发者的提交记录,pull-request数据,问题报告信息等,这些数据中包含大量的语义信息,本发明希望通过项目托管社区中存在的文本数据生成软件的语义摘要,方便开发者在大粒度的复用过程中迅速了解目标代码块或文件的功能。尤其是其中包含很多issue(问题报告),这些issue有详细的标题和描述信息。这些issue往往对应着某些功能的添加或者某些缺陷的修复。对于一个功能运转良好的软件项目,issue的提交、解决、关闭整体流程非常规范。其中核心规范在于开发人员在提交代码的时候会将解决的问题编号、或者问题内容写到commit的信息中。因此,这样的信息能够帮助我们将软件开发历史(如文件、模块、代码的修改)和问题报告中的语义信息关联起来,从而给软件模块的语义进行标注。
技术实现要素:
为实现上述目的,本发明提供一种基于问题报告的软件语义摘要自动生成方法,包括如下步骤:
s1、构建开源软件信息数据库,所述开源软件信息数据库包含问题报告数据表、代码变更记录数据表和软件语义摘要数据表;
s2、获取项目托管社区中的问题报告数据和代码变更记录数据,并将之存储在数据库的问题报告数据表和代码变更记录数据表中;
s3、使用正则表达式从代码变更记录中抽取其出现的问题报告id;
s4、问题报告与软件代码位置匹配:通过代码变更记录数据将问题报告中的描述信息和代码位置关联,具体包括:
s401、问题报告与代码变更记录匹配:使用代码变更记录中出现的#id寻找相关id的问题报告;
s402、语义信息合并:将问题报告中的标题和描述,以及代码变更记录的描述信息合并记作d,将其作为文件或代码片段f的原始语义信息,写入数据库的软件语义摘要数据表中;
s5、语义提取与聚类:对于原始描述信息d,使用文档主题生成模型生成若干主题词或短语,生成的主题词或短语作为文件或代码片段f的语义摘要存储在数据库的软件语义摘要数据表中。
进一步地,步骤s1中,问题报告数据表的存储格式为[标题,描述,#id],代码变更记录数据表的存储格式为[描述,变更信息,变更位置],软件语义摘要数据表的存储格式为[代码位置,原始语义信息,语义摘要]。
进一步地,步骤s2中,软件问题报告信息包括:问题报告的标题、描述和id;代码变更记录的信息包括:描述、变更信息和变更位置。
步骤s2中,社区问题报告和代码变更记录数据可通过官方api获得或通过通用的网络爬虫获取。
步骤s2中,开发人员在提交的代码变更记录的描述信息中注明此次代码变更相关的问题报告,以“close#id”或“fix#id”的形式记录。
进一步地,步骤s402中,将代码位置和原始描述信息以[代码位置,原始语义信息]的格式存储于数据库的软件语义摘要数据表。
进一步地,步骤s402中,语义摘要信息以[代码位置,语义摘要]的格式存储于数据库的软件语义摘要数据表。
本发明针对开源软件的项目托管平台中存在的大量开源软件的代码,可从项目托管平台中问题报告提取软件语义,自动生成代码文件语义摘要,为软件开发人员在选择复用资源时提供帮助,提高开发人员复用软件的效率。
附图说明
图1为本发明的方法流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,本发明提供一种基于问题报告的软件语义摘要自动生成方法,包括如下步骤:
s1、构建开源软件信息数据库,所述开源软件信息数据库包含问题报告数据表、代码变更记录数据表和软件语义摘要数据表。其中,问题报告数据表的存储格式为[标题,描述,#id],代码变更记录数据表的存储格式为[描述,变更信息,变更位置],软件语义摘要数据表的存储格式为[代码位置,原始语义信息,语义摘要]。
s2、获取项目托管社区中的问题报告数据和代码变更记录数据,并将之存储在数据库的问题报告数据表和代码变更记录数据表中。其中,社区问题报告和代码变更记录数据可通过官方api获得或通过通用的网络爬虫获取;软件问题报告信息包括:问题报告的标题、描述和id;代码变更记录的信息包括:描述、变更信息和变更位置;开发人员在提交的代码变更记录的描述信息中注明此次代码变更相关的问题报告,以“close#id”或“fix#id”的形式记录。
s3、使用正则表达式从代码变更记录中抽取其出现的问题报告id。
以项目托管平台github中rails项目为例,rails的代码变更记录中有一条记录的描述信息为:“maketimetravelworkwithsubclassesoftime/date/datetime.closes#27614.previouslywhencalling‘now’onasubclassofe.g.‘time’itwouldreturnaninstanceof‘time’insteadofreturninganinstanceofthesubclass.thisway,wealwaysreturenthecorrectclass.”。使用正则匹配提取该代码记录相关的问题报告编号#27614。
s4、问题报告与软件代码位置匹配:通过代码变更记录数据将问题报告中的描述信息和代码位置关联,具体包括:
s401、问题报告与代码变更记录匹配:使用代码变更记录中出现的#id寻找相关id的问题报告。将代码位置和原始描述信息以[代码位置,原始语义信息]的格式存储于数据库的软件语义摘要数据表。
下面结合具体事例阐释本步骤s401的实施过程。步骤s3中从一条代码变更记录中提取了相关的问题报告#27614.本步骤s401中,首先从rails项目的问题报告中找到编号为27614的问题报告,其标题为“timetravelusingtimehelpersbreakssubclassesoftime”。然后将该问题报告的标题和描述以及代码变更记录中的描述信息合并作为原始语义信息写入数据库的软件语义摘要数据表中。
s402、语义信息合并:将问题报告中的标题和描述,以及代码变更记录的描述信息合并记作d,将其作为文件或代码片段f的原始语义信息,写入数据库的软件语义摘要数据表中;语义摘要信息以[代码位置,语义摘要]的格式存储于数据库的软件语义摘要数据表。
s5、语义提取与聚类:对于原始描述信息d,使用文档主题生成模型生成若干主题词或短语,生成的主题词或短语作为文件或代码片段f的语义摘要存储在数据库的软件语义摘要数据表中。文档主题生成模型可以使用java语言的开源工具jgibblda实现。
综上所述,本发明通过软件的问题报告和代码变更记录为软件的代码文件或代码段自动标注语义信息,可提高开发人员复用软件的效率。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素”。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。