1.一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:包括如下步骤:S1:构建代码搜索模型,该代码搜索模型由五部分堆叠而成:该五部分分别是数据预处理模块、特征表示网络模块、细粒度共注意力网络模块、语义特征融合网络模块和余弦相似度计算模块;
S2:选取公开Java数据集,该数据集包括若干个代码查询对,每个代码查询对包括一个Java代码片段和相应的自然语言查询令牌;
S3:数据预处理模块采用现有特征提取方法将数据集中所有的代码片段和查询令牌分别进行处理得到代码特征和查询特征,其中代码特征包括:方法名特征、API序列特征、代码令牌特征和语句树序列特征;
S4:特征表示网络模块将方法名特征、API序列特征、代码令牌特征和语句树序列特征分别经过WordEmbedding词嵌入技术处理后对应的得到方法名特征嵌入矩阵MethodName、API序列特征嵌入矩阵Api、代码令牌特征嵌入矩阵Token和语句树序列特征嵌入矩阵StatementTree;
方法名特征嵌入矩阵:MethodName=(m1,m2,mi,...,mp),其中,mi表示方法名中第i个词向量;
API序列特征嵌入矩阵:Api=(a1,a2,ai,...,aq),ai表示API序列中第i个API词向量;
代码令牌特征嵌入矩阵:Token=(t1,t2,ti,...,Tn),ti表示代码令牌中第i个代码词向量;
语句树序列特征嵌入矩阵:StatementTree=(staTree1,staTree2,staTree i,...,staTrees),staTree i表示第i个语句树向量;
将方法名特征嵌入矩阵MethodName、API序列特征嵌入矩阵Api、代码令牌特征嵌入矩阵Token和语句树序列特征嵌入矩阵StatementTree输入到注意力网络中,得到对应的特征矩阵,用M表示方法名特征矩阵、A表示API特征矩阵、T表示代码令牌特征矩阵、staTree表示语句树序列特征矩阵和Q表示查询特征矩阵,Q={q1,q2,qi,...,qo},qi表示查询中第i个查询词向量;
S5:细粒度共注意力网络模块将构成代码特征矩阵的M、A、T、staTree分别和查询特征矩阵Q通过细粒度共注意机制进行对齐;
S6:语义特征融合网络模块计算代码向量VC和查询向量VQ;
S7:余弦相似度计算模块计算代码向量VC和查询向量VQ的余弦相似度,表达式如下:其中,sim表示代码向量和查询向量之间的余弦相似度;
S8:对代码搜索模型进行训练,具体步骤如下:
S81:采用S2获得的数据集构建训练样本集,训练样本集中每个训练样本为一个实例三+ ‑ + ‑ +元组
+ ‑
S82:采用S2‑S6的方法将代码c表示成代码向量Vc,将代码c的查询q 和查询q分别表示成查询向量 和通过步骤S7的方法计算向量间的余弦相似度 和
S83:预设边缘约束参数β,将训练样本中代码的余弦相似度 和作为输入,通过损失函数计算L(θ),并采用梯度下降法反向更新代码搜索模型进中的所有参数,损失函数计算如下:其中θ表示模型中所有的参数,G表示训练样本集;
S84:当训练达到最大迭代次数时停止训练,并将当前代码搜索模型作为最优搜索模型,否则返回S82;
S80:对于一个待查询代码,将其输入最优搜索模型,同时在最优搜索模型中预设查询输出结果个数为N,最优搜索模型计算待查询代码与代码库中的各个代码向量计算余弦相似度,将余弦相似度自大到小排序,输出前N个余弦相似度对应的代码,该N个代码即为待查询代码的的查询结果。
2.如权利要求1所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S3中语句树序列特征的提取步骤如下:
S31:将代码片段中的语句按行标记为S1,S2,S3,…Sn;
S32:根据代码片段构建相对应的AST结构,并将该AST结构分解为n个部分,每个部分对应每行代码语句;
S33:利用深度优先遍历算法遍历每个语句树,从而将每个语句树表示成序列形式得到n个语句树序列SubTreei,其中i=1,2,…,n;
S34:将n个语句树序列SubTreei拼接成一个序列,得到语句树序列特征StatementTree。
3.如权利要求1或2所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S4中计算方法名特征矩阵、API特征矩阵、代码令牌特征矩阵、语句树序列特征矩阵和查询特征矩阵的步骤如下:S41:计算MethodName中每个方法名词嵌入的注意力权重αmi,mi表示MethodName中第i个词向量,计算表达式如下:αmi=SoftMax(tanh(Wmi+b)) (1);
其中,W为可训练参数矩阵,b为可训练偏差;
S42:对方法名词向量进行注意力加权处理,并通过连接算子 将多个词向量拼接成最终的方法名特征矩阵,计算表达式如下:k*p
其中M∈R 为方法名特征矩阵,k为词嵌入向量的维度,p为方法名中单词的个数;
S43:S41‑S42中的方法,计算得到API特征矩阵A,代码令牌特征矩阵T,语句树序列特征矩阵staTree和查询特征矩阵Q。
4.如权利要求3所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S5中将M、A、T、staTree分和查询特征矩阵Q进行对齐的具体步骤如下:S51:计算方法名特征嵌入矩阵与查询特征嵌入矩阵之间相互关联的方法名关联矩阵,具体表达式如下:T
B=tanh(MUQ) (3);
T p*o
其中,M表示方法名特征嵌入矩阵的转置矩阵,B∈R 表示方法名关联矩阵,其中p为方k*k法名单词个数,o为查询单词个数;U∈R 表示可训练的参数矩阵;Q表示查询特征嵌入矩阵;
S52:通过卷积神经网络沿着方法名关联矩阵B的行方向提取方法名特征嵌入矩阵与查M询特征嵌入矩阵相关的方法名语义特征矩阵B ,通过卷积神经网络沿着方法名关联矩阵BQ的列方向提取查询特征嵌入矩阵与方法名特征嵌入矩阵相关的查询语义特征矩阵B;
S53:定义:VM表示为方法名特征嵌入矩阵与查询特征嵌入矩阵相关的方法名语义特征向量,VQM表示为查询特征嵌入矩阵与方法名特征嵌入矩阵相关的查询语义特征向量,计算方法名语义特征向量VM和相对应的查询语义特征向量VQM;
S54:使用相同方法计算API序列语义特征向量VA和相应的查询语义特征向量VQA,代码令牌语义特征向量VT和相应的查询语义特征向量VQT,语句树序列语义特征向量VstaTree和相应的查询语义特征向量VQstaTree,得到代码语义向量Code={VM、VA、VT、VstaTree}和查询语义特征向量Query={VQM、VQA、VQT、VQstaTree}。
5.如权利要求4所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S52中所使用的神经网络为CNN,具体计算步骤如下:k*h
其中,W∈R 表示滤波器,bi,j表示语义关联矩阵B中的元素,FC表示完全连接的层,ave‑pooling表示平均池策略。
6.如权利要求5所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S53中计算方法名语义特征向量VM和相对应的查询语义特征向量VQM的具体步骤如下:M p Q o
S531:计算VM的注意力权重a∈R和VQM的注意力权重a∈R,计算表达式如下:M Q
其中, 是a的第i个元素, 是a的第i个元素, 表示方法名语义特征矩阵中的第j个元素, 表示查询语义特征矩阵的第i个元素;
S532:通过对方法名特征嵌入矩阵和对应的注意力权重进行点积运算,得到VM和VQM,计算表达式如下:M
VM=M·a (8);
Q
VQM=Q·a (9);
M Q
其中,a表示VM的权重,a表示VQM的权重;M表示方法名特征嵌入;Q表示查询特征嵌入。
7.如权利要求6所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S6中计算代码向量VC和查询向量VQ,具体步骤如下:S61:计算代码向量权重αvc和查询向量权重αvq,具体计算表达式如下:αvc=SoftMax(tanh(Wvc+b)) (10);
αvq=SoftMax(tanh(Wvq+b)) (11);
其中,W为可训练参数矩阵,b为可训练偏差,vc∈Code,vq∈Query;
S62:根据权重将语义特征进行融合,计算代码向量VC和查询向量VQ,具体计算表达式如下:其中,vc表示代码语义向量中的元素,vq表示查询语义向量中的元素。
8.如权利要求7所述的一种基于细粒度共注意机制的语义代码搜索方法,其特征在于:所述S83中损失函数中的边缘约束参数β设置为值0.05。