Zeqi Lin,Bing Xie,Yanzhen Zou, Junfeng Zhao,
Xuandong Li,Jun Wei, Hailong Sun,GangYin
1引用Journal of Computer Science and Technology 32(2): 242–249 Mar. 2017 DOI 10.1007/s11390-017-1718-y.

软件智能开发已成为软件工程中最重要的研究趋势之一。在文章中,作者首次提出了两个关键概念-智能开发环境(IntelliDE)和软件知识图谱。 IntelliDE是一个生态系统,它可以对软件大数据进行汇总,挖掘和分析,以在软件开发的生命周期中提供智能帮助。 文章介绍IntelliDE的架构,并讨论关键的研究问题和挑战。 软件知识图谱是一个软件知识表示和管理框架,在IntelliDE中起着重要的作用。 作者研究了它的概念,并介绍了一些具体的细节和示例来说明如何构建和利用它。
3 IntelliDE智能开发环境(IntelliDE)是一个生态系统,其中对软件大数据进行汇总,挖掘和分析,以在软件开发的生命周期中提供智能帮助。
图1展示了IntelliDE的架构,在这个生态系统中,软件智能开发经历了三个阶段:数据聚合,知识获取和智能协助。 从软件大数据中提取软件知识,然后将其用于提升软件开发环境的智能水平。
图1
3.1 数据聚合
软件大数据是Web规模,分布式,多源,异构,动态且快速增长的。因此,IntelliDE需要一个超大规模,最新且易于访问的软件数据存储库,以解决软件工程研究人员数据供应不足的问题。IntelliDE在数据聚合方面面临三个主要的研究挑战:数据收集,数据融合和数据更新。
1)数据收集。需要研究Internet上软件大数据的形式和功能,以便IntelliDE能够正确地感知它们,准确下载它们并将它们有机存储。
2)数据融合。软件的不同方面隐藏在多源和异构软件数据中。因此,需要研究如何发现不同软件数据源之间的关系,以便研究人员可以共同分析它们。
3)数据更新。由于软件大数据是动态且快速增长的,因此使软件数据存储库保持最新是一项重要的任务。因此,需要研究软件大数据更新策略(例如,增量更新和部分更新)。18.3.2 知识获取
复杂的软件知识隐藏在大规模软件数据中,软件知识是为软件开发提供智能帮助的关键。因此,IntelliDE需要知识获取的支持,即需要研究如何从软件数据存储库构建知识库。IntelliDE在知识获取方面面临两个主要的研究挑战:知识提取以及知识表示和管理。
1)知识提取。 IntelliDE需要从软件大数据中自动提取各种软件知识。因此,需要研究各种软件知识提取算法。这些提取算法主要基于程序分析,自然语言处理,数据挖掘,机器学习和信息检索等。
2)知识表示与管理。为了确保智能开发环境可以有效,系统地利用知识,需要研究如何统一表示软件知识,将其链接在一起并轻松查询。
3.3 智能协助
在IntelliDE中,利用从软件大数据中提取的软件知识为软件开发人员提供智能推荐服务和智能问答服务。 软件开发人员关注软件开发生命周期中不同阶段的各种任务,为不同任务提供智能帮助需要不同的软件知识和不同的知识处理策略。 因此,IntelliDE需要一系列智能开发服务,通过不同算法利用软件知识来智能地解决不同的软件工程任务。
IntelliDE中主要涉及的智能开发服务归纳为四个类别:
1)软件构造。 IntelliDE需要为不同的软件构建活动(例如,域分析,编程和软件重构)提供智能开发服务。这些服务包括软件项目知识的可视化和浏览,软件文档语义检索,智能代码合成和完成,软件重构推荐等。
2)测试和验证。 IntelliDE需要提供基于软件大数据的软件测试和验证技术和方法,包括测试用例生成,通过边界模型检查来检查代码,识别静态分析输出的警告,调试软件等。
3)团队协作。 IntelliDE需要分析开发人员的技能特征及其之间的潜在协作关系,利用软件知识(尤其是历史协作知识)来改进开发人员推荐,任务分配,资源推荐等。
4)操作,维护和发展。 IntelliDE需要解决整个软件生命周期范围内的问题,例如软件开发与系统维护之间的碎片化,无法快速适应不断变化的需求等相关智能开发服务,包括智能负载测试,异常分析,服务接口设计和进化等。
4软件知识图谱4.1定义
知识图谱是指由节点和有向边组成的图,用于表示领域知识。 软件知识图谱定义为表示软件领域,项目和系统中的相关知识的图。 在软件知识图谱中,节点表示软件知识实体(例如,类,问题报告和业务概念),有向边表示这些实体之间的各种关系(例如,方法调用和可追溯性链接)。 不同的节点和关系具有不同的属性来描述其内部特征。 例如,方法实体的属性包括其名称,返回类型,参数列表,访问修饰符和描述。
软件知识图谱中的知识分为两类:原始知识和派生知识。原始知识定义为通过数据结构解析添加到软件知识图谱中的软件知识。例如,解析源代码文件的抽象语法树(AST),然后将代码实体(例如类,方法和字段)及其之间的关系(例如方法调用和继承层次结构)添加到软件知识中。图形。衍生知识定义为通过挖掘其中的现有软件知识而添加到软件知识图谱中的软件知识。例如,可以通过处理软件文档实体中的自然语言句子来提取业务概念实体。
根据定义,从软件大数据中自动构建软件知识图谱。构建过程包括两个阶段:数据解析和知识提取。数据解析阶段通过解析各种软件数据将各种原始知识添加到软件知识图谱中。然后,知识提取阶段通过各种知识提取算法将各种衍生知识添加到软件知识图谱中。
4.2 软件知识图谱在IntelliDE的使用
图2展示了在IntelliDE中实现的软件知识平台图构建平台的逻辑概述。当前,该平台专注于为给定的软件项目构建软件知识图谱。
图2
1)数据解析
当软件开发人员想要为软件项目构建软件知识图谱时,他应通过其Web前端将相关的软件数据添加到平台中。所添加的软件数据被允许是大规模的,多源的和异构的。
当前,该平台支持的数据格式包括:1)源代码文件(例如Java); 2)版本控制系统(例如VCS,SVN和Git); 3)邮件列表(例如mbox); 4)问题追踪系统(例如JIRA和BugZilla); 5)Microsoft Office(例如DOC,DOCX)和PDF文档; 6)html格式的教程,API文档,用户论坛帖子和博客; 7)在线社交问答集(StackOverflow XML转储)。
在软件知识构建平台中提供了一个数据解析框架。该框架提供了一个数据解析插件接口,以便可以开发和集成不同的数据解析插件
2)知识提取
在数据解析阶段将原始知识平台添加到软件知识图谱中之后,使用各种知识提取算法将派生知识添加到软件知识图谱中。 软件知识图谱构建平台中存在一个知识提取框架。 它提供了一个知识提取界面,以便可以将不同的知识窗台提取算法开发为插件并集成在一起。 当前,该平台实现的知识提取插件包括:1)文档到代码的可追溯性链接恢复,2)文档到文档的词法相似性估计,3)问题到提交的链接恢复,4)利益相关者识别,5)潜在的源代码 主题建模,6)API使用量示例提取等。
3)存储和查询
平台使用流行的图形数据库Neo4j来存储软件知识图谱形。 Cypher是一种声明性查询语言,可用于表达和有效地查询图数据,用于查询软件知识图谱。 除了Cypher,平台还使用Neo4j提供的Java API来访问软件知识图谱。 Cypher比Java API更为简洁,但是Java API可以实现更复杂的图形算法
5 应用IntelliDE旨在为软件开发提供智能推荐和智能问答的支持。
5.1软件文本语义搜索
文本搜索被定义为一些自由文本用户查询与一组自由文本文档的匹配。由于文本是不同抽象级别(例如标识符,注释,文档,问题报告,提交消息,开发人员讨论和用户通信)之间各种软件工件之间信息表示的常见形式,因此文本搜索被广泛用于软件开发,维护和重复使用。但是,基于关键词匹配的文本搜索技术存在无法理解自由文本的语义的问题。因此,作者提出了一种基于软件知识图谱的软件文本语义搜索方法。允许开发人员输入自由文本查询。对于每个查询,返回与其语义相关的文本项(即,软件知识图谱中的文本属性)的已排序列表,对于列表中的每个文本项,将软件知识图谱的子图可视化以演示如何文本项在语义上与查询相关。
这种方法的基本思想是结构良好的源代码知识可以用作挖掘文本项之间语义相关性的桥梁。该方法包括三个阶段:
1)代码位置。通过特征定位技术将自由文本链接到软件知识图谱中的相关代码实体。
2)实体匹配。基于图嵌入技术TransR测量不同代码实体之间的结构相似性。结构相似性会重新排列文本搜索结果的排名。
3)子图提取。从软件知识图谱中提取一个子图,以可视化查询和相关文本项之间的关系。此阶段是基于最小生成树算法完成的.
5.2案例分析
为一个流行的开源软件项目Apache Lucene构建了一个软件知识图谱,以举例说明软件文本语义搜索方法。相关数据包括:源代码文件(800000+行),版本控制日志(1.2+ GB),电子邮件(244 000+),发布报告(5200+),官方网页(500+),博客(1200) +),StackOverflow Q&A(问题-答案)对(3800+)等。作者从这些软件数据中提取了64932个软件知识实体和276 065个关系。然后,提供了一个软件文本语义搜索引擎,并讨论了一个语义搜索示例。
示例为用户查询为“如何使用IndexReader类的名称获取所有字段”。语义搜索结果如图3所示。该图的左侧列出了与查询在语义上相关的文本项的排序列表。对于排名列表中的每个文本项,语义搜索引擎都会为其演示软件知识图谱的子图。例如,考虑排在第二位的文本项,它是“堆栈溢出”问答对。用户可以单击它,然后相应的子图将显示在语义搜索Web前端界面的右侧,如图3所示。在子图中,“查询”列中的节点代表查询和其中的一些关键字。同样,“文档”列中的节点表示问答对和其中的一些关键字。 “代码”列中显示的子图说明了通过软件知识图谱在语义上如何关联不同的关键字。例如,由于类AtomicReader是IndexReader类的超类,因此查询中出现的关键字“ IndexReader”与Q&A对中出现的关键字“ AtomicReader”在语义上相关。尽管查询和Q&A对共享的关键字很少,但是软件知识图谱在语义上将它们桥接起来。因此,返回此问答对以帮助用户.
图3
在这个例子中,可以看到软件知识图谱可以用来有效地帮助自由文本在软件中站立。它表明,软件文本语义搜索引擎是智能利用软件知识图谱谱以提高软件开发活动的效率和质量的良好开端。
6总结在文章中,作者首次提出了两个关键概念-IntelliDE和软件知识图谱。 IntelliDE是一个生态系统,旨在将当前的集成开发环境(IDE)引入智能开发环境(IntelliDE),其主要研究问题和挑战总结为:数据聚合,知识获取和智能协助。软件知识图谱是软件知识的表示和管理框架。它被提议作为IntelliDE中知识获取的基础结构。当前,作者的软件知识图谱不仅包含直接从数据源(例如源代码文件和问题跟踪系统)中提取的原始知识,还包含派生知识(例如可追溯性链接,API使用示例和潜在主题)。作者提供了一个软件文本语义搜索引擎作为示例应用程序,以展示软件知识图谱如何在IntelliDE中提供语义理解和推理的支持。作者希望本文对将来软件领域的智能问答有所贡献。
致谢本文由南京大学软件学院2019级硕士万家兵翻译转述。
感谢国家重点研发计划(2018YFB1403400)和国家自然科学基金(61690200)支持!