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

文档序号:15685220发布日期:2018-10-16 20:59阅读:158来源:国知局

本发明涉及一种基于启发式和神经网络的非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:利用启发式规则得到的待推荐成员及其上下文信息和预测过程中得到的信息训练神经网络,得到一个能够过滤掉低可靠性预测结果的过滤器。具体方法为:

步骤5.1:构建一个多模型的神经网络,其中,第一个模型是单层lstm网络,接受待推荐成员recommendation及其上下文组成的文本序列<ltype,lname,objname,recommendation>作为输入;第二个模型是单层全连接加归一化层网络,接受预测过程中得到的信息作为输入<rule,similarity,cdtnumber>,包括做出预测的规则rule(1或3),步骤4.1计算出来的相似度similarity(如果是基于样例预测则设similarity为1),和步骤1得到的初始候选数量cdtnumber;

将两个模型的输出合并后输入到第三个由三层全连接构成的模型,最终该模型输出0或1;

步骤5.2:将步骤1至4得到的待推荐成员recommendation及其上下文信息和预测过程中得到的信息转换为神经网络模型的输入模式,如果recommendation与实际访问的非api成员相同,该输入对应的输出为1,否则为0;

步骤5.3:使用步骤5.2得到的样本集合训练构建好的神经网络,最后得到一个能够判断待推荐成员可靠性的过滤器filter;

步骤6:当程序员在赋值语句右侧的非api实例对象后输入“.”时,预测可能访问的非api成员。具体方法为:

步骤6.1:按照步骤1至4中处理样例sample的方式为当前的非api实例对象预测可能访问的成员recommendation;

步骤6.2:将步骤6.1得到的待推荐成员recommendation及其上下文信息和预测过程中得到的信息转换为神经网络模型的输入模式,输入神经网络得到输出0或1,如果为0,则放弃推荐,如果为1,则待推荐成员非常可靠,值得推荐。

实施例

本实施例详细阐述了基于启发式和神经网络的非api成员推荐方法在9个开源项目下具体实施时的方法和效果。

在如表1所示的硬件环境下,对表2所示的开源软件进行训练和预测。

表1:硬件环境配置信息表

表2:开源软件基本信息表

步骤a:从表2所示的开源软件中提取赋值语句右侧访问的非api成员及其上下文信息,采用9折交叉验证方式生成数据的训练集和测试集。

其中,9折交叉验证是指依次将9个项目中的1个项目作为测试数据,另外8个作为训练数据,进行交叉验证;对第i个项目gi进行交叉验证时,gi作为测试集,将其他8个项目gj作为训练数据。

其中,图1中的提取数据部分采用jdt工具实现。

其中,gi作为图1中的新访问。

其中,gj作为图1中的样例程序。

步骤b:

给定每一个预测上下文,利用三条启发式规则选出预测成员,将预测成员及其上下文的标识符转换为可以输入神经网络的向量;

其中,本发明假定标识符遵循驼峰或蛇形命名规则,以此为依据为标识符分割单词。分割后的单词可以组成单词序列,使用word2vec工具将这些单词序列转换为向量序列,用作神经网络的第一个输入,输入的长度即标识符序列中全部单词的个数;

同时,根据预测过程中得到的信息,生成神经网络的第二个输入和训练集中的标签。

步骤c:初始化神经网络,将步骤b得到的训练数据向量输入神经网络进行训练,得到网络模型mymodel;

具体为:设置成员推荐网络的输入为两部分,如图2所示,第一部分是一系列100维向量,依次输入训练数据中的左侧表达式类型,左侧标识符名称,非api对象标识符名称,预测成员标识符名称;第二部分是3维向量,依次输入用于预测的规则,初始候选的个数,预测成员标识符与左侧标识符的相似度;

图2所示的神经网络左侧输入层输入维度为100,右侧输入层维度为3;

图2所示的神经网络由1个lstm层和一个归一化层合并后连接到三层全连接层组成,最后输出层利用sigmoid函数激活,表示预测正确的把握;

步骤d:将步骤a得到的测试集数据gi转换为向量tvec;

步骤e:将步骤d得到的测试集数据tvec输入步骤c中得到的网络模型mymodel,进行非api成员推荐。具体为:将测试集中的上下文向量输入网络,当网络输出的预测把握小于0.5,表示不推荐;否则表示推荐,然后将预测成员与测试集中相应的成员进行比较;如果相同,则表示推荐正确,否则推荐错误;推荐结果如表3所示;

表3:推荐方法的准确率和召回率

表3中的准确率=正确的非api成员推荐个数/推荐的非api成员个数;

表3中的召回率=正确的非api成员推荐个数/待推荐的非api成员总数;

结果表明:

1.平均准确率为83.36%,与现有方法相比,本发明的准确率提高70.68%;

2.平均召回率为61.16%,与现有方法相比,本发明的召回率提高25.23%。

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