发明内容
本发明的内容是提供一种代码搜索方法,其能够克服现有技术的某种或某些缺陷。
根据本发明的一种代码搜索方法,其包括以下步骤:
一、输入带描述的代码;
二、分别对代码和描述进行单独的嵌入;
三、对代码特征跟描述特征做交互计算得到一个细粒度相似矩阵,用构建好的CNN网络对矩阵进行学习;
四、分别为代码和描述构建全连接图,通过一定的规则更新节点向量;
五、对代码和描述分别用注意力机制做加权求和操作;
六、预测每个候选代码片段的分数,使用分数对所有候选代码片段进行重新排序。
作为优选,代码部分用code tokens、methodname、API sequence作为特征进行嵌入,其中code tokens表示为T=t_{1},...,t_{N_{t}},methon name表示为M=m_{1},...,m_{N_{m}},API sequence表示为A=a_{1},...,a_{N_{a}};
通过一个多层感知器MLP嵌入,以获得初始的特征信息:
其中ti∈Rd,mi∈Rd,ai∈Rd分别表示令牌ti,mi,ai的嵌入式表示,Wt,Wm,Wa为MLP中可训练的参数矩阵;
在将三个代码特征嵌入到三个矩阵中之后,最终将它们合并成一个矩阵V∈Rk×d作为代码的特征矩阵:
作为优选,描述特征用MLP对其进行嵌入:
其中ei∈Rd表示描述词t=ei的嵌入式表示,We为MLP中可训练的参数矩阵。
作为优选,步骤三中,首先计算代码特征V和描述特征E之间的相似度,相似度sij衡量每个代码特征对应于每个描述特征:
sij表示第i个代码特征和第j个描述特征之间的细粒度交互关系,即相似度,k表示代码特征数,n表示描述特征数;
然后,使用细粒度匹配矩阵作为代码-描述关系CNN网络的输入,使用多层CNN来捕获代码和描述之间的局部相关性和长期依赖关系;
接着,对每个描述构造注意代码级特征,对每个代码特征构造注意描述级特征,以测量代码-描述相似度;
对于第i个代码特征,在S′上使用逐列注意操作来计算每个描述特征到第i个代码特征的权重;然后,通过描述特征表示的加权求和提取相应的参与描述级向量:
其中,λ为softmax函数的逆温度;同样,通过对S′进行行注意力操作得到第j个描述特征对应的参与的代码特征级向量:
作为优选,CNN网络中,引入四种不同的卷积核来扩展区域和单词的感知域;第一个卷积层用2个大小为1×1的内核过滤n×k输入;第二个卷积层具有2个大小为1×3的内核;第三卷积层具有2个大小为3×1的内核;第四个卷积层有2个大小为3×3的内核;ReLU非线性应用于每个卷积层的输出;每层的操作情况如下:
St=RELU(Conv(St-1))
用一个1×1的卷积核对第三个卷积层的输出进行滤波,得到最终的矩阵
作为优选,步骤四中,为每个代码特征构造一个无向全连接图G1=(V1,E1);使用矩阵A来表示每个节点的相邻矩阵,并添加自循环;边权值表示为矩阵Wa,表示节点之间的相互依赖关系:
利用所构造的图节点和边,通过更新节点和边来得到新的代码特征表示:
同样的,为每个描述特征构造一个无向全连接图G2=(V2,E2);使用矩阵B来表示每个节点的相邻矩阵,并添加自循环;边权值表示为矩阵Wa,表示节点之间的相互依赖关系:
利用所构造的图节点和边,通过更新节点和边来得到新的描述特征表示:
作为优选,步骤五中,每个代码特征节点的权重计算如下:
其中Wa是代码注意参数矩阵,ca是代码计算的上下文向量:
利用注意力权值,计算最终代码表示的加权平均值:
同样的,应用注意机制来学习每个描述节点的权重,计算方式如下:
其中,cb为查询的上下文向量,计算方法为:
利用注意力权值,我们计算节点嵌入向量的加权平均值来表示整个描述:
本发明从代码特性和描述特性中提取代码和查询信息。然后将提取的代码特征与描述特征进行细粒度相似度计算,可以探索每个代码特征和每个描述特征之间的交互匹配。接着分别为代码特征以及描述特征构造图结构,这可以获取各自特征之间的前后依赖关系,从而实现更加复杂的联合交互匹配工作。
具体实施方式
为进一步了解本发明的内容,结合附图和实施例对本发明作详细描述。应当理解的是,实施例仅仅是对本发明进行解释而并非限定。
实施例1
如图1所示,本实施例提供了一种代码搜索方法(FsgCS的深度模型),其包括以下步骤:
一、输入带描述的代码;
二、分别对代码和描述进行单独的嵌入;
三、对代码特征跟描述特征做交互计算得到一个细粒度相似矩阵,用构建好的CNN网络对矩阵进行学习;
四、分别为代码和描述构建全连接图,通过一定的规则更新节点向量;
五、对代码和描述分别用注意力机制做加权求和操作;
六、预测每个候选代码片段的分数,使用分数对所有候选代码片段进行重新排序。
代码部分用code tokens、methodname、API sequence作为特征进行嵌入,考虑一个输入代码片段C=[T,M,A],其中code tokens表示为T=t_{1},...,t_{N_{t}},methonname表示为M=m_{1},...,m_{N_{m}},API sequence表示为A=a_{1},...,a_{N_{a}};将所有token信息标记分解为子标记,例如ArrayList可以细化为Array和List,这可以让不同token获取更加显式的区分;对于描述部分则表示为E=e_{1},...,e_{N_{e}}。
通过一个多层感知器MLP嵌入,以获得初始的特征信息:
其中ti∈Rd,mi∈Rd,ai∈Rd分别表示令牌ti,mi,ai的嵌入式表示,Wt,Wm,Wa为MLP中可训练的参数矩阵;
在将三个代码特征嵌入到三个矩阵中之后,最终将它们合并成一个矩阵V∈Rk×d作为代码的特征矩阵:
对于描述特征,为了跟代码特征做后续的细粒度短语匹配操作,描述特征同样用MLP对其进行嵌入:
其中ei∈Rd表示描述词t=ei的嵌入式表示,We为MLP中可训练的参数矩阵。
基于代码特征V和描述特征E,需要捕获代码-查询细粒度对应关系。首先计算代码特征V和描述特征E之间的相似度,如图2所示,相似度sij衡量每个代码特征对应于每个描述特征:
sij表示第i个代码特征和第j个描述特征之间的细粒度交互关系,即相似度,k表示代码特征数,n表示描述特征数;
然后,使用细粒度匹配矩阵作为代码-描述关系CNN网络的输入,使用多层CNN来捕获代码和描述之间的局部相关性和长期依赖关系。
这里,需要捕捉潜在的代码-描述对应关系。受卷积神经网络的启发,可以有效地提取像素之间的关系,并分层构建表达性表示。因此,目标是使用多层CNN来捕获代码和单词之间的局部相关性和长期依赖关系。与现有的将CNN应用于图像处理或文本处理不同,输入的每个元素表示一个像素或单词之间的相关性,每个元素意味着每个代码特征-单词特征的交互信息。
CNN网络中,引入四种不同的卷积核来扩展区域和单词的感知域;第一个卷积层用2个大小为1×1的内核过滤n×k输入;第二个卷积层具有2个大小为1×3的内核;第三卷积层具有2个大小为3×1的内核;第四个卷积层有2个大小为3×3的内核;ReLU非线性应用于每个卷积层的输出;每层的操作情况如下:
St=RELU(Conv(St-1))
用一个1×1的卷积核对第三个卷积层的输出进行滤波,得到最终的矩阵
请注意,这里删除了降采样操作为了避免信息丢失,并保持匹配矩阵的维度。通过分层卷积操作,可以捕获从代码-描述之间潜在的对齐关系。
借助学习到的代码-描述特征之间细粒度的对齐关系,可以更准确的度量代码-描述相似性。
接着,对每个描述构造注意代码级特征,对每个代码特征构造注意描述级特征,以测量代码-描述相似度;
对于第i个代码特征,在S′上使用逐列注意操作来计算每个描述特征到第i个代码特征的权重;然后,通过描述特征表示的加权求和提取相应的参与描述级向量:
其中,λ为softmax函数的逆温度;同样,通过对S′进行行注意力操作得到第j个描述特征对应的参与的代码特征级向量:
为了实现更全面的相似性匹配,构建了一个推理图,在局部和全局各级可能的对齐之间传播相似性消息。更具体地说,将所有经过细粒度匹配模块得到的代码以及描述向量作为图节点分别构建全连接图。
为每个代码特征构造一个无向全连接图G1=(V1,E1);使用矩阵A来表示每个节点的相邻矩阵,并添加自循环;边权值表示为矩阵Wa,表示节点之间的相互依赖关系:
利用所构造的图节点和边,通过更新节点和边来得到新的代码特征表示:
同样的,为每个描述特征构造一个无向全连接图G2=(V2,E2);使用矩阵B来表示每个节点的相邻矩阵,并添加自循环;边权值表示为矩阵Wa,表示节点之间的相互依赖关系:
利用所构造的图节点和边,通过更新节点和边来得到新的描述特征表示:
步骤五中,每个代码特征节点的权重计算如下:
其中Wa是代码注意参数矩阵,ca是代码计算的上下文向量:
利用注意力权值,计算最终代码表示的加权平均值:
同样的,应用注意机制来学习每个描述节点的权重,计算方式如下:
其中,cb为查询的上下文向量,计算方法为:
利用注意力权值,我们计算节点嵌入向量的加权平均值来表示整个描述:
模型训练
如果代码片段和描述具有相似的语义,那么它们的嵌入式向量应该彼此接近。换句话说,给定任意代码片段C和任意描述D,如果D是对C的精确描述,我们希望它能够预测具有高相似性的距离,否则则有点相似性。我们将每个训练实例构建为一个$<C,D_{+},D_{-}>$用于监督训练。对于每个代码片段C,都有一个积极的描述$D_{+}$(正确的描述)和一个由其他D+集合中随机选取的负的描述D-(错误的描述)。在训练过程中,搜索模型都预测了<C,D+>和<C,D->的余弦相似性,并将排序损失最小化,定义如下:
其中θ表示模型参数,P表示训练语料库,∈为恒定边距,将其设置为1.0。c,d+和d-分别为C,D+和D-的嵌入式向量。函数L(θ)会增加代码片段与其正确描述之间的相似性,而代码片段与其错误描述之间的相似性则会减少。
代码搜索的模型预测
经过模型训练后,可以通过嵌入一个大规模的代码库来部署模型在线进行代码搜索,其中每个代码都由一个向量c表示。对于开发人员的搜索查询,模型将描述嵌入为一个向量q。然后,描述q和代码c之间的语义相似性可以通过它们的余弦相似性来衡量;最后,该模型推荐了与代码搜索查询高度相关的top-k个代码:
数据集
Hu等人的数据集是从GitHub从2015年至2016年创建的Java存储库中收集过来的。为了过滤掉低质量的项目,Hu等人只考虑了那些有超过十颗星的项目。然后,他们从这些Java项目中提取了Java方法及其相应的Javadoc。Javadoc的第一句话被认为是查询。然而,这个数据集中的一些代码片段有无用的注释,例如,只有参数描述的注释。因此,过滤掉查询语句未超过两个单词的代码片段。经过过滤后,得到了一个包含69k注释函数对的训练集,一个包含8k注释函数对的测试集和一个包含8k注释函数对的验证集,详细的统计数据见表1。
表1统计数据
Training set |
Testing set |
Validation set |
69687 |
8712 |
8714 |
对比
本实施例比较了最先进的模型DeepCS、UNIF、MPCAT、CARLCS-CNN和FsgCS模型之间的代码搜索有效性。结果表明,FsgCS优于四种基于DL的模型(即DeepCS、UNIF、MPCAT、CARLCS-CNN)。
DeepCS,这是由Gu等人提出的第一个将深度学习用于代码搜索的模型。DeepCS使用LSTM和max-pooling来编码代码特性和查询。实验结果表明,DeepCS的性能优于基于信息检索的模型。
CARLCS-CNN,最近由Shuai等人提出的CARLCS-CNN是一种使用共同注意机制的最先进的模型。它利用CNN和LSTM学习代码和查询的嵌入表示并且引入了一种协同注意机制来学习代码标记和查询标记之间的内部语义关联。
UNIF,Cambronero等人提出了一种先进的监督代码搜索模型UNIF。UNIF对代码token以及查询token都用fastText嵌入初始化。再分别使用注意力机制和平均法将代码嵌入和查询嵌入组合起来。
MPCAT,一种使用分层遍历方法编码代码抽象语法树并合并文本匹配模型BiMPM的模型。
为了评估模型FgsdCS,使用了两个常见的评估指标SuccessRate@k和MRR。具体来说,对于测试数据集中的每一对代码片段和描述,将描述作为查询,并将相应的代码片段与测试集中的其他代码片段一起作为代码检索任务的候选对象。用这两种常用于信息检索的评估指标来衡量我们的模型和基线模型的性能。
SuccessRate@k(SR@k)相关代码方法可以在排名前k的列表中找到的查询的比例。具体计算方法如下:
其中Q是我们测试集中的8712个查询,S是一个指示函数。如果可以在排名前k的列表中找到第i个查询(Qi),则返回1,否则返回0。我们分别评估SuccessRate@1,SuccessRate@5和SuccessRate@10。
MRR测试查询结果的倒数秩的平均值,计算方法如下:
其中,
是第i个查询的结果列表中正确代码片段的排名位置。与SuccessRate@k不同,MRR使用倒数秩作为测量的权重。换句话说,当Q
i的排名超过10时,那么
等于0。
所有的实验都是在服务器上进行的,有16核CPU的CPU和GPU加速。该框架构建在python3.6和CUDA9.0以上。所有的词嵌入大小都是128。为了训练我们的FgsdCS模型,使用了ADAM[9]优化器,学习率为0.0003,批处理大小为32。CNN的详细设置参考上面模型描述部分。
对于Hu等人的数据集,如表2所示,FsgCS实现了MRR为0.5048,SR@1/5/10为0.4214/0.6204/0.6812。FsgCS在MRR方面分别优于基线模型DeepCS、UNIF、MPCAT和CALCS-CNN 21.69%、10.96%、9.24%和7.01%;在SR@1/5/10方面分别超过16.12%/22.90%/16.25%,11.12%/11.07%/10.26%,4.36%/7.72%/8.98%和3.59%/4.67%/6.00%。
表2对比表
Model |
SR@1 |
SR@1 |
SR@1 |
MRR |
DeepCS |
0.2602 |
0.3914 |
0.5187 |
0.2879 |
UNIF |
0.3102 |
0.5097 |
0.5786 |
0.3952 |
MACAT |
0.3688 |
0.5432 |
0.5914 |
0.4124 |
CALCS-CNN |
0.3765 |
0.5737 |
0.6212 |
0.4347 |
FsgCS |
0.4214 |
0.6204 |
0.6812 |
0.5048 |
以上示意性的对本发明及其实施方式进行了描述,该描述没有限制性,附图中所示的也只是本发明的实施方式之一,实际的结构并不局限于此。所以,如果本领域的普通技术人员受其启示,在不脱离本发明创造宗旨的情况下,不经创造性的设计出与该技术方案相似的结构方式及实施例,均应属于本发明的保护范围。