一种基于启发式和神经网络的非API成员推荐方法技术

技术编号:19176551 阅读:24 留言:0更新日期:2018-10-17 00:13
本发明专利技术涉及一种基于启发式和神经网络的非API成员推荐方法,属于代码补全及代码推荐技术领域。本方法根据开源软件中赋值语句右侧的非API成员访问样例sample,收集该非API对象声明类型所包含的全部成员,包括继承得到的成员然后根据赋值语句所在类与非API对象声明类之间的关系,将不可访问的成员剔除,余下可访问的成员作为全部候选放入初始候选列表cdtList中,供后续步骤使用。对步骤1中的样例基于三种特定启发式规则进行预测。利用信息训练神经网络,得到一个能够过滤掉低可靠性预测结果的过滤器。当程序员在赋值语句右侧的非API实例对象后输入“.”时,预测可能访问的非API成员。本发明专利技术在相同数据集下推荐正确的成员个数明、正确的概率显高于现有方法和工具。

A non API member recommendation method based on heuristic and neural network

The invention relates to a non-API member recommendation method based on heuristics and neural networks, belonging to the technical field of code completion and code recommendation. This method accesses the sample according to the non-API member on the right side of the assignment statement in open source software, collects all the members contained in the non-API object declaration type, including the inherited members, and then eliminates the non-accessible members according to the relationship between the assignment statement class and the non-API object declaration class. Members are placed in the initial candidate list cdtList as all candidates for subsequent steps. The samples in step 1 are predicted based on three specific heuristic rules. Using information to train neural network, we get a filter that can filter out low reliability prediction results. When the programmer enters \.\ after the non-API instance object on the right side of the assignment statement, he predicts the non-API members that may be accessed. The invention recommends the correct number of members under the same data set, and the correct probability is obviously higher than the existing methods and tools.

【技术实现步骤摘要】
一种基于启发式和神经网络的非API成员推荐方法
本专利技术涉及一种基于启发式和神经网络的非API成员推荐方法,属于代码补全以及代码推荐

技术介绍
代码补全是指当程序员敲入部分字符时IDE(集成开发环境,IntegratedDevelopmentEnvironment)自动预测剩余代码的功能。如果代码补全功能可以正确预测用户要输入的语句,则可以有效提高编码效率。代码补全技术应用广泛,是Eclipse中最经常被程序员使用的10个命令之一。非API(ApplicationProgrammingInterface,应用程序编程接口)成员(包括方法和字段)推荐是一种常用的代码推荐。当程序员在非API实例对象后输入“.”时,IDE工具会自动检查可访问的非API成员,并以列表的方式展示给程序员可以使用的方法或者字段。然而,大部分主流的IDE工具都是将符合所需返回值类型的成员或者最常用的成员放在列表顶端进行推荐。当返回值类型不确定时,IDE工具只能将所有可访问的候选成员按字母顺序列出来,候选成员的数量可能会非常多,程序员从中选择正确的成员就需要很长的时间。为了提高API成员推荐的效果,有人提出利用k近邻算法(k=1)为API对象推荐方法或字段,这种方法基于代码库中的API成员访问样例计算相同上下文情况下被调用次数最多的API方法或字段进行推荐;有人利用API成员访问的有序性提出了基于有向图的推荐方法,这种方法利用API对象所访问的所有成员以及对象间的数据依赖关系生成API成员访问图,基于代码库中的访问图计算出最常见的图,用其中的API成员进行推荐;也有人提出基于统计语言模型进行API成员的推荐,这种方法利用程序语言的高度重复性和可预测性,将程序语言视为连续文本序列进行推荐。虽然现有方法能够很好地推荐API成员,但是这些方法在进行推荐时都依赖于被推荐API的丰富样例信息。对于非API而言,由于这些成员只在当前项目中出现,样例信息不丰富,因此现有方法不适合对非API成员进行推荐。另一方面,成员访问中非API成员的比例又非常高。通过对9个知名的开源Java项目进行统计分析,结果发现约60%的成员访问都是基于非API对象,这说明对非API成员访问进行推荐是迫切必要的。本专利技术主要针对赋值语句右侧的非API成员访问进行推荐。赋值语句是很常见的语法结构,根据对9个知名Java项目的统计分析,发现赋值语句右侧的非API成员访问占所有非API成员访问数量的20%,因此提出一种适用于赋值语句中非API成员访问的推荐方法是非常有意义的。另外,赋值语句具有的特殊语法结构可以为推荐提供丰富的上下文信息,比如赋值语句左侧的表达式类型,标识符名称,非API对象类型及标识符名称等,充分利用这些信息可以很大程度提高推荐的准确率,从而达到减轻程序员编程负担的效果。
技术实现思路
本专利技术的目的在于针对目前适用于赋值语句中右侧非API成员访问推荐方法较少的现状,提出了一种基于启发式和神经网络的非API成员推荐方法。本专利技术所述方法包括以下步骤:步骤1:根据开源软件中赋值语句右侧的非API成员访问样例sample,收集该非API对象声明类型所包含的全部成员,包括继承得到的成员。然后根据赋值语句所在类与非API对象声明类之间的关系,将不可访问的成员剔除,余下可访问的成员作为全部候选放入初始候选列表cdtList中,供后续步骤使用;步骤2:对步骤1中的样例sample基于样例进行预测。步骤3:对步骤1中的样例sample基于类型进行预测。步骤4:对步骤1中的样例sample基于相似度进行预测。步骤5:利用启发式规则得到的待推荐成员及其上下文信息和预测过程中得到的信息训练神经网络,得到一个能够过滤掉低可靠性预测结果的过滤器。步骤6:当程序员在赋值语句右侧的非API实例对象后输入“.”时,预测可能访问的非API成员。有益效果本专利技术所述方法,与现有最佳效果的基于统计语言模型推荐方法SLP和最流行的Eclipse工具相比,具有如下有益效果:在相同数据集下,本方法推荐正确的成员个数明、正确的概率显高于现有方法和工具。附图说明图1是一种基于启发式和神经网络的非API成员推荐方法的工作原理示意图;图2是一种基于启发式和神经网络的非API成员推荐方法的神经网络模型示意图。具体实施方式下面结合附图和实施例对本专利技术方法做进一步说明和详细描述。如图1所示,本专利技术所述方法包括以下步骤:步骤1:根据开源软件中赋值语句右侧的非API成员访问样例sample,收集该非API对象声明类型所包含的全部成员,包括继承得到的成员。然后根据赋值语句所在类与非API对象声明类之间的关系,将不可访问的成员剔除,余下可访问的成员作为全部候选放入初始候选列表cdtList中,供后续步骤使用;步骤2:对步骤1中的样例sample使用第一条启发式规则,即,基于样例进行预测。具体为:步骤2.1:提取该样例所在开源项目中位于其之前的所有赋值语句右侧的非API成员访问样例samples,包括该样例sample。从这些样例中提取被访问的非API成员member及其上下文,包括赋值语句左侧的表达式类型lType,左侧标识符名称lName和右侧非API对象标识符名称objName。本步骤需要从源代码中提取语法元素,实际使用JavaDevelopmentTools(JDT)提供的抽象语法树解析器解析Java源文件,能够获取赋值语句及其中元素的语义和语法信息。步骤2.2:挑选出和目标样例sample具有相同上下文的样例作为预测依据,即lType、lName、objName相同。如果没有挑选出可用的预测样本,直接进入步骤3;步骤2.3:统计经步骤2.2挑选出的样例中非API成员member出现的频率,最高的成员被预测为待推荐成员recommendation,并跳过步骤3和4,直接进入步骤5;步骤3:对步骤1中的样例sample使用第二条启发式规则,即,基于类型过滤初始候选列表cdtList,将列表中与赋值语句左侧的表达式类型相等或兼容的候选保留,其余剔除,得到新的候选列表cdtList。本步骤不推荐非API成员,但可以在很大程度上降低候选数量,提高最终推荐准确率。根据实际统计分析发现,赋值语句右侧访问的非API成员与左侧表达式类型相等或兼容的比例高达82%,考虑到步骤2有很高的准确率,因此步骤3出错的概率很低。即使出错,最后的神经网络过滤器也可以排除掉错误的推荐结果,保证准确性。步骤4:对步骤1中的样例sample使用第三条启发式规则,即,基于相似度进行预测。具体方法为:步骤4.1:计算候选列表cdtList中的候选成员标识符名称cdtName与待推荐赋值语句样例sample左侧标识符名称lName的相似度similarity。计算方法如下:其中,Lev(cdtName,lName)是两个标识符名称间的Levenshtein距离(即编辑距离),len(lname)是标识符名称中的字符长度。步骤4.2:根据4.1计算出来的相似度为候选成员排序,相似度最高的成员被预测为待推荐成员recommendation。步骤5:利用启发式规则得到的待推荐成员及其上下文信息和预测过程中得到的信息训练神经网络,得到一个能够过滤掉低可靠性本文档来自技高网
...

【技术保护点】
1.一种基于启发式和神经网络的非API成员推荐方法,其特征在于,包括以下步骤:步骤1:根据开源软件中赋值语句右侧的非API成员访问样例,收集该非API对象声明类型所包含的全部成员,包括继承得到的成员,然后根据赋值语句所在类与非API对象声明类之间的关系,将不可访问的成员剔除,余下可访问的成员作为全部候选放入初始候选列表中,供后续步骤使用;步骤2:对步骤1中的样例基于样例进行预测;步骤3:对步骤1中的样例基于类型进行预测;步骤4:对步骤1中的样例基于相似度进行预测;步骤5:利用启发式规则得到的待推荐成员及其上下文信息和预测过程中得到的信息训练神经网络,得到一个能够过滤掉低可靠性预测结果的过滤器;步骤6:当程序员在赋值语句右侧的非API实例对象后输入“.”时,预测可能访问的非API成员。

【技术特征摘要】
1.一种基于启发式和神经网络的非API成员推荐方法,其特征在于,包括以下步骤:步骤1:根据开源软件中赋值语句右侧的非API成员访问样例,收集该非API对象声明类型所包含的全部成员,包括继承得到的成员,然后根据赋值语句所在类与非API对象声明类之间的关系,将不可访问的成员剔除,余下可访问的成员作为全部候选放入初始候选列表中,供后续步骤使用;步骤2:对步骤1中的样例基于样例进行预测;步骤3:对步骤1中的样例基于类型进行预测;步骤4:对步骤1中的样例基于相似度进行预测;步骤5:利用启发式规则得到的待推荐成员及其上下文信息和预测过程中得到的信息训练神经网络,得到一个能够过滤掉低可靠性预测结果的过滤器;步骤6:当程序员在赋值语句右侧的非API实例对象后输入“.”时,预测可能访问的非API成员。2.如权利要求1所述的一种基于启发式和神经网络的非API成员推荐方法,其特征在于,所述步骤2的实现方法为:步骤2.1:提取该样例所在开源项目中位于其之前的所有赋值语句右侧的非API成员访问样例samples,包括该样例sample;从这些样例中提取被访问的非API成员member及其上下文,包括赋值语句左侧的表达式类型lType,左侧标识符名称lName和右侧非API对象标识符名称objName;本步骤需要从源代码中提取语法元素,实际使用JavaDevelopmentToolsJDT提供的抽象语法树解析器解析Java源文件,能够获取赋值语句及其中元素的语义和语法信息;步骤2.2:挑选出和目标样例sample具有相同上下文的样例作为预测依据,即lType、lName、objName相同;如果没有挑选出可用的预测样本,直接进入步骤3;步骤2.3:统计经步骤2.2挑选出的样例中非API成员member出现的频率,最高的成员被预测为待推荐成员recommendation,并跳过步骤3和4,直接进入步骤5。3.如权利要求1所述的一种基于启发式和神经网络的非API成员推荐方法,其特征在于,所述步骤3的实现方法为:对步骤1中的样例sample使用第二条启发式规则,即,基于类型过滤初始候选列表cdtList,将列表中与赋值语句左侧的表达式类型相等或兼容的候选保留,其余剔除,得到新的候选列表cdtList。4.如权利要求1所述的一种基于启发式和神经网络的非API成员推荐方法,其特征在于,所述步骤4的实现方法...

【专利技术属性】
技术研发人员:姜林刘辉
申请(专利权)人:北京理工大学
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1