一种基于LSTM的非API函数实参推荐方法转让专利

申请号 : CN201711202702.8

文献号 : CN107832047B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李光杰刘文美刘辉

申请人 : 北京理工大学

摘要 :

一种基于LSTM的非API函数实参推荐方法,属于代码补全以及代码推荐技术领域。本方法首先从开源软件中提取非API函数调用的实参及上下文信息,然后将上下文转变为段落向量输入到LSTM神经网络,将实参转变为段落向量作为预期输出训练神经网络,训练后得到一个神经网络模型。当用户进行新的函数调用时,本方法自动提取函数调用的上下文信息并转变为向量输入到训练好的神经网络模型中,模型的输出结果就是本方法推荐本次函数调用使用的实参。与现有基于相似度、基于k近邻和基于局部性特点的推荐方法相比,本方法在相同数据集下正确推荐的实参个数以及能够推荐的实参数量高于现有方法。

权利要求 :

1.一种基于LSTM的非API函数实参推荐方法,其特征在于:通过以下步骤实现:步骤1:根据开源软件的非API函数调用信息,提取函数调用的实参和上下文信息并存储到文件或数据库中;

其中,开源软件的非API函数为开源代码中所有不能找到函数定义的函数;实参包括函数调用中参数列表中的变量或函数名称;上下文信息包括:形参、函数名称和候选参数,候选参数又是指在函数调用的地方所有可以作为实参且类型兼容的变量和函数调用;

其中,实参中的变量、函数名称以及上下文信息中的形参、函数名称和候选参数统称为标识符;具体利用CDT工具提取开源软件的非API函数调用的实参Arg及上下文信息Context=

步骤2:将步骤1提取出来的实参和上下文信息转换为向量表示的训练数据;

其中,实参转换为的向量表示的训练数据称为实参向量,上下文信息转换为向量表示的训练数据称为上下文向量,具体为:步骤2.1将每个实参argName分割为一系列的单词,每个单词ti映射为一个向量,再将argName映射为向量argVec;

步骤2.2将每条上下文信息中形参parName分割为一系列的单词,每个单词pi映射为一个向量,再将parName映射为向量parVec;

步骤2.3将每条上下文信息中函数名称mName分割为一系列的单词,每个单词mi映射为一个向量,再将mName映射为向量mVec;

步骤2.4将每条上下文信息中每个候选参数分割为一系列的单词,每个单词ci映射为一个向量,再将候选参数映射为向量cdVec;

其中,步骤2.2至步骤2.4的向量组合成上下文向量CxtVec=

其中,所述方法要求考虑标识符中单词的顺序和语义关系,规定使用定长的段落向量表示;其中,段落向量的长度根据实参和上下文信息确定;

步骤3:初始化神经网络,将步骤2转换的向量表示的训练数据输入神经网络训练,得到网络模型model,具体为:步骤3.1初始化一个包括输入层InputLayer、隐含层HiddenLayer和输出层OutputLayer的LSTM神经网络;

步骤3.2将步骤2中得到的上下文向量CxtVec设定为步骤3.1构建网络的输入;

步骤3.3将步骤2中得到的实参向量argVec设定为步骤3.2网络输入的输出基准;

步骤3.4开始网络训练,训练后得到一个网络模型model;

步骤4:依据步骤1思路提取新的非API函数调用的上下文信息TContext;

具体为:当开发人员输入新的非API函数的调用名称时,利用CDT工具自动提取函数调用的上下文信息;

步骤5:将步骤4得到的上下文信息TContext转换为向量表示的待推荐数据TCxtVec;

步骤6:将步骤5得到的待推荐数据TCxtVec输入步骤3中得到的网络模型model中,网络模型将自动输出一个向量Rec作为待推荐数据TCxtVec的推荐实参。

说明书 :

一种基于LSTM的非API函数实参推荐方法

技术领域

[0001] 本发明涉及一种基于LSTM的非API函数实参推荐方法,属于代码补全以及代码推荐技术领域。

背景技术

[0002] 代码补全是指当程序员敲入部分字符时IDE自动预测剩余代码的功能。如果代码补全功能可以正确预测用户要输入的语句,则可以提高编码效率。代码补全技术应用广泛,是Eclipse软件中最经常被程序员使用的10个命令之一。
[0003] 函数调用时的实参推荐是一种特殊的代码推荐。当程序员进行函数调用时,IDE工具会自动检查可选的参数,并推荐程序员最可能使用的参数或者参数列表。然而,大部分主流的IDEs工具都是根据候选实参和形参的类型进行参数推荐的,当类型兼容的候选参数很多时,IDEs工具就会生成一个长长的候选参数列表,程序员从中选择正确的参数就需要很长的时间。
[0004] 为了提高参数推荐的效果,有人提出利用k近邻算法为API函数推荐参数。这种方法基于被调用API函数的最近k次调用信息进行参数推荐;有人利用API参数推荐的局部性特点对基于k紧邻的API参数推荐方法进行了改进,这种方法利用函数调用之前的几行代码信息对API函数调用的参数进行推荐;也有人提出基于统计语言模型进行API函数及参数的推荐,这种方法利用API函数调用的顺序及相关参数进行推荐。
[0005] 虽然现有方法能够很好地为流行的API函数推荐参数,但是这些方法在进行参数推荐时都依赖于被推荐方法的丰富历史调用信息。而对于非API函数或不流行的API函数而言,由于这些方法被调用的次数有限,调用历史信息不丰富,因此现有方法很难对非API进行参数推荐。另一方面,非API函数调用或不流行的API调用又非常常见。我们对85个流行的开源C项目进行统计分析,结果发现49%的方法调用是非API调用,48%的API调用仅被调用一次。这说明对非API函数进行参数推荐又是迫切必要的。
[0006] 本发明主要针对非API函数调用中的实参进行推荐。我们做了一项调查问卷,发现开发人员不用查看方法的被调用历史信息,仅根据被调用方法的声明就可以从候选参数列表中选出正确的参数。因此我们假设基于大量的开源项目真实数据,深度学习技术也可以学习从候选参数列表中选择正确参数的通用规则,因为神经网络和深度学习技术的特点就是从大量数据中选择有用的特征自动构建从输入到输出的复杂映射关系。本发明选用LSTM技术进行参数推荐,因为LSTM是最有效的深度学习模型之一,这种模型尤其适用于自然语言处理。

发明内容

[0007] 本发明的目的在于针对现有参数推荐方法中对非API函数参数推荐效果较差的现状,提出了一种基于LSTM的非API函数实参推荐方法。
[0008] 本发明一种基于LSTM的非API函数实参推荐方法,通过以下步骤实现:
[0009] 步骤1:根据开源软件的非API函数调用信息,提取函数调用的实参和上下文信息并存储到文件或数据库中;
[0010] 其中,开源软件的非API函数为开源代码中所有不能找到函数定义的函数;实参包括函数调用中参数列表中的变量或函数名称;上下文信息包括:形参、函数名称和候选参数,候选参数又是指在函数调用的地方所有可以作为实参且类型兼容的变量和函数调用;
[0011] 其中,实参中的变量、函数名称以及上下文信息中的形参、函数名称和候选参数统称为标识符;
[0012] 步骤1,具体利用CDT工具提取开源软件的非API函数调用的实参Arg及上下文信息Context=
[0013] 步骤2:将步骤1提取出来的实参和上下文信息转换为向量表示的训练数据;
[0014] 其中,实参转换为的向量表示的训练数据称为实参向量,上下文信息转换为向量表示的训练数据称为上下文向量;步骤2,具体为:
[0015] 步骤2.1将每个实参argName分割为一系列的单词,每个单词ti映射为一个向量,再将argName映射为向量argVec;
[0016] 步骤2.2将每条上下信息中形参parName分割为一系列的单词,每个单词pi映射为一个向量,再将parName映射为向量parVec;
[0017] 步骤2.3将每条上下信息中函数名称mName分割为一系列的单词,每个单词mi映射为一个向量,再将mName映射为向量mVec;
[0018] 步骤2.4将每条上下信息中每个形参cd分割为一系列的单词,每个单词ci映射为一个向量,再将cd映射为向量cdVec;
[0019] 其中,步骤2.2至步骤2.4的向量组合成上下文向量CxtVec=
[0020] 其中,本发明要求考虑标识符中单词的顺序和语义关系,规定使用定长的段落向量表示;
[0021] 其中,段落向量的长度根据实参和上下文信息确定;
[0022] 步骤3:初始化神经网络,将步骤2转换的向量表示的训练数据输入神经网络训练,得到网络模型model;
[0023] 具体为:
[0024] 步骤3.1初始化一个包括输入层InputLayer、隐含层HiddenLayer和输出层OutputLayer的LSTM神经网络;
[0025] 步骤3.2将步骤2中得到的上下文向量CxtVec设定为步骤3.1构建网络的输入;
[0026] 步骤3.3将步骤2中得到的实参向量argVec设定为步骤3.2网络输入的输出基准;
[0027] 步骤3.4开始网络训练,训练后得到一个网络模型model;
[0028] 步骤4:依据步骤1思路提取新的非API函数调用的上下文信息TContext;
[0029] 具体为:当开发人员输入新的API函数的调用名称时,利用CDT工具自动提取函数调用的上下文信息;
[0030] 步骤5:将步骤4得到的上下文信息TContext转换为向量表示的待推荐数据TCxtVec;
[0031] 步骤6:将步骤5得到的待推荐数据TCxtVec输入步骤3中得到的网络模型model中,网络模型将自动输出一个向量Rec作为待推荐数据TCxtVec的推荐实参;
[0032] 至此,经过步骤1到步骤6,完成了一种基于LSTM的非API函数实参推荐方法。
[0033] 有益效果
[0034] 一种基于LSTM的非API函数实参推荐方法,与现有基于相似度、基于k近邻和基于局部性特点的推荐方法相比,具有如下有益效果:
[0035] 1.在相同数据集下,本方法正确推荐的实参个数明显高于现有方法;
[0036] 2.在相同数据集下,本方法能够做推荐的实参高于现有方法;

附图说明

[0037] 图1是一种基于LSTM的非API函数实参推荐方法的工作原理示意图;
[0038] 图2是一种基于LSTM的非API函数实参推荐方法的标识符向量表示方法示意图;
[0039] 图3是一种基于LSTM的非API函数实参推荐方法的神经网络模型示意图。

具体实施方式

[0040] 下面结合附图和实施例对本发明做进一步说明和详细描述。
[0041] 实施例1
[0042] 本实施例详细阐述了本发明基于LSTM的非API函数调用方法在85个开源项目下具体实施时的方法和效果
[0043] 在如表1所示的硬件环境下,我们对表2所示的开源软件进行训练和预测。
[0044] 表1:硬件环境配置信息表
[0045]
[0046] 表2:开源软件基本信息表
[0047]
[0048] 步骤A:从表2所示的开源软件中提取非API函数调用的实参及其上下文信息,采用10折交叉验证方式生成数据的训练集和测试集;
[0049] 其中,10折交叉验证是指将数据随机分成数量相等的10组,然后对每组数据进行交叉验证;对第i组数据Gi进行交叉验证时,Gi作为测试集,将其他9组数据Gj作为训练数据;
[0050] 其中,图1中的提取数据部分采用CDT工具实现;
[0051] 其中,Gi作为图1中的新调用;
[0052] 其中,Gj作为图1中的实例程序;
[0053] 步骤B:
[0054] 利用图2所示段落向量神经网络,将训练数据的每个实参、函数名称、形参以及每个候选参数转换为一个30维的向量表示;
[0055] 其中,本发明假定标识符遵循驼峰或蛇形命名规则,因此以下划线和大写字母作为分割单词的依据;
[0056] 其中,段落向量网络根据标识符矩阵D及其先序单词预测下一个单词,段落向量利用梯度下降算法训练神经网络,训练结束后每个标识符名称映射为一个30维的向量;
[0057] 图1中的向量转换采用Paragraph2Vec工具实现;
[0058] 图2中D代表标识符矩阵,用于将每个标识符映射为一个向量;
[0059] 图2中W代表单词矩阵,用于将每个单词映射为一个向量;
[0060] 步骤C:初始化神经网络,将步骤B得到的训练数据向量输入神经网络进行训练,得到网络模型myModel;
[0061] 具体为:设置参数推荐网络(如图3所示)的输入为一系列30维向量,依次输入训练数据的函数名称、形参、5个与形参文本相似度最高的候选参数以及实参;
[0062] 图3所示的神经网络输入层输入维度为30;
[0063] 图3所示的神经网络由4个隐含层由3个LSTM网络和一个全连接层组成,其中全连接层利用Softmax函数激活,保证网络只输出一个候选参数;
[0064] 其中,为了降低神经网络预测的错误率,本发明规定利用随机梯度下降算法进行网络模型训练;
[0065] 图3所示的神经网络输出维度设定为6,
[0066] 每维向量值非0即1:当前5维中的某一维为1时,表示推荐位置的候选参数作为实参,当最后一维值为1时,表示实参不在候选参数列表中,推荐失败;
[0067] 步骤D:将步骤A得到的测试集数据Gi转换为段落向量TVec;
[0068] 步骤F:将步骤E得到的测试集数据TVec输入步骤C中得到的网络模型myModel,进行实参推荐;
[0069] 具体为:将测试集中的上下文向量输入网络,然后将网络输出向量与测试集中相应的实参向量进行比较;如果网络输出的向量与实参向量相同,则表示推荐正确,否则推荐错误;推荐结果如表3所示;
[0070] 表3:推荐方法的准确率和召回率
[0071]
[0072]
[0073] 表3中的准确率=正确的参数推荐个数/推荐的参数个数;
[0074] 表3中的召回率=正确的参数推荐个数/待推荐的参数总数;
[0075] 结果表明:
[0076] 1.平均准确率为90.9%,与现有方法相比,本发明的准确率提高14.1%;
[0077] 2.平均召回率为48.67%,与现有方法相比,本发明的召回率提高6.2%;
[0078] 以上所述为本发明的较佳实施例而已,本发明不应该局限于该实施例和附图所公开的内容。凡是不脱离本发明所公开的精神下完成的等效或修改,都落入本发明保护的范围。