1.一种基于JEAN的软件代码推荐方法,其特征在于,包括如下步骤:S1、构建JEAN模型;
S2、从GitHub上收集带有描述的java代码段数据集,并对其预处理用作训练集,用来训练JEAN模型;
S3、构建代码库,使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量;
S4、开发人员进行在线搜索代码,输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量;
S5、使用余弦相似性计算查询向量和代码库中的所有代码向量之间的相似性,返回与查询向量最相关的向量的代码段。
2.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S1中,JEAN模型分为三个子模块:
S1.1、代码嵌入表示模块:用于表示代码段中Tokens、Method name、API sequence三个模态的向量,然后Attention机制为代码段中每个模态的不同部分赋予不同的权重,最后将注意向量融合成一个单独的向量;
S1.2、描述嵌入表示模块:用于将自然语言描述嵌入到向量中;
S1.3、余弦相似度模块:用于衡量代码段和描述之间的相似度。
3.根据权利要求2所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S1.1中的具体步骤如下:
S1.1.1、假设一个输入代码段M=[A,B,C],其中A={a1,a2,…,am}表示为Tokens序列,B={b1,b2,…,bm}表示为Method name序列,C={c1,c2,…,cm}表示为API sequence;
S1.1.1.1、对于Tokens,采用GRU网络嵌入向量:T T
其中,at是Tokens中at的词嵌入向量,ht 是隐藏层状态值,最终隐藏层状态值hm 代表Tokens模态表示;
S1.1.1.2、与嵌入Tokens序列相同,对于Method name,也是采用GRU网络嵌入向量:M M
其中,bt是Method name中bt的词嵌入向量,ht是隐藏层状态值,最终隐藏层状态值hm代表Method name模态表示;
S1.1.1.3、API sequence采用GRU网络嵌入向量:A A
其中,ct是API sequence中ct的词嵌入向量,ht是隐藏层状态值,最终隐藏层状态值hm代表API sequence模态表示;
S1.1.2、获得每个模态的嵌入表示后,由于每个模态中的不同部分对最终的语义表示的贡献度是不同的,引入Attention机制为每个模态的不同部分赋予不同的权重;
S1.1.2.1、对于Tokens,不同的Tokens对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的Tokens序列赋予更高的权重;Tokens的Attention分数计算公式如下:T
其中,fT是线性层,ht是第t个Tokens的隐藏层状态,cT是Tokens的上下文向量;
获得了Tokens的Attention分数后,得到Tokens的Attention向量:S1.1.2.2、对于Method name,不同的Method name对代码段的最终语义表示的贡献度是不同的,需要引入Attention机制为代码段中对语义有重要贡献的Method name序列赋予更高的权重;Method name的Attention分数计算公式如下:M
其中,fM是线性层,ht是第t个Method name的隐藏层状态,cM是Method name的上下文向量;
获得了Method name的Attention分数后,得到Method name的Attention向量:S1.1.2.3、对于API sequence,不同的API sequence对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的API sequence赋予更高的权重;API sequence的Attention分数计算公式如下:A
其中,fA是线性层,ht是第t个API sequence的隐藏层状态,cA是API sequence的上下文向量;
获得了API sequence的Attention分数后,就可以得到API sequence的Attention向量:
S1.1.3、在获得了每个模态的Attention向量后,将这三个模态的Attention向量通过一个线性层来融合为一个向量:
P=tanh(W[T;M;A]),其中,P为最终代码段的嵌入表示,W是Attention权值,[T;M;A]表示三个向量的连接。
4.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S2中训练模型的主要思想为:代码段和其对应的描述具有相似的语义,则它们在向量空间中的嵌入向量就彼此接近。
5.根据权利要求1或4所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S2中,训练模型使用的是Ranking Loss函数,Ranking Loss函数的目的是去预测输入样本之间的相对距离,也称之为度量学习;
在使用Ranking Loss的过程中,首先从输入数据中提取出特征,并且得到其各自的嵌入表达;然后,定义一个距离度量函数用以度量这些表达之间的相似度;最终,训练这个特征提取器,以对于特定的样本对产生特定的相似度度量。
6.根据权利要求1或4所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S2中,训+ ‑
练时,将每个训练实例构建为一个三元组
,对于每个代码段P,都有一个正确的的+ ‑ ‑ +
描述Q和一个错误的描述Q ,错误描述Q是从所有的描述中随机选择的,当在三元组
Q>训练集上进行训练时,首先预测两个
对和
对的余弦相似性d,其目标是代码‑ ‑ + +
段P和错误描述Q 间的余弦相似性d(P,Q)与代码段M和正确描述N间的余弦相似性d(P,Q)之差大于一个阈值m,最小化Ranking Loss:+ ‑ + ‑
其中,α代表模型参数,T代表训练数据集,P,Q ,Q 分别是P,Q ,Q 的嵌入向量,m取值为
0.05。
7.根据权利要求6所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S2中,训练+ ‑
过程中,三元组
,可能有三种情况:‑ +
S2.1、d(P,Q)>m+d(P,Q),在向量空间中,对比起正确的描述,错误的描述和代码段已经有足够的距离,此时loss为0,网络参数将不会继续更新;
‑ +
S2.2、d(P,Q)
+ ‑ +
S2.3、d(P,Q)
8.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S3的具体步骤如下:从GitHub上收集至少有25颗Star的Java项目,然后使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量,以构建代码库。
9.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S4的具体步骤如下:
开发人员输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量,描述嵌入表示模块具体如下:
描述嵌入表示模块将自然语言描述和查询嵌入到向量中,例如一个自然语言描述或者查询Q={q1,q2,…,qn}是由n个单词序列组成的,对于自然语言描述或者查询Q,使用GRU网络嵌入到向量中:
Q
其中,qt是自然语言描述或者查询中qt的词嵌入向量,ht是隐藏层状态值,最终隐藏层Q
状态值hn代表自然语言描述或者查询Q的嵌入表示。
10.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S5的具体步骤如下:
在获得代码嵌入向量P和查询向量Q后,使用余弦相似度来测量它们两个向量之间的相似度,其定义公式如下:
sim(P,Q)值越高,说明代码和自然语言描述或者查询的相关性就越高,然后返回与查询向量最相关的向量的代码段。