[发明专利]一种基于JEAN的软件代码推荐方法有效
申请号: | 202110368686.X | 申请日: | 2021-04-06 |
公开(公告)号: | CN112966095B | 公开(公告)日: | 2022-09-06 |
发明(设计)人: | 文万志;王仕强;周杰;陆晓虹;梁文栋;赵甜;程实 | 申请(专利权)人: | 南通大学 |
主分类号: | G06F16/335 | 分类号: | G06F16/335;G06F8/71 |
代理公司: | 北京科家知识产权代理事务所(普通合伙) 11427 | 代理人: | 宫建华 |
地址: | 226019 *** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 jean 软件 代码 推荐 方法 | ||
1.一种基于JEAN的软件代码推荐方法,其特征在于,包括如下步骤:
S1、构建JEAN模型;
S2、从GitHub上收集带有描述的java代码段数据集,并对其预处理用作训练集,用来训练JEAN模型;
S3、构建代码库,使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量;
S4、开发人员进行在线搜索代码,输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量;
S5、使用余弦相似性计算查询向量和代码库中的所有代码向量之间的相似性,返回与查询向量最相关的向量的代码段;
步骤S1中,JEAN模型分为三个子模块:
S1.1、代码嵌入表示模块:用于表示代码段中Tokens、Method name、API sequence三个模态的向量,然后Attention机制为代码段中每个模态的不同部分赋予不同的权重,最后将Attention向量融合成一个单独的向量;
S1.2、描述嵌入表示模块:用于将自然语言描述嵌入到向量中;
S1.3、余弦相似度模块:用于衡量代码段和描述之间的相似度;
步骤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网络嵌入向量:
,
其中,at是Tokens中的词嵌入向量,htT是隐藏层状态值,最终隐藏层状态值hmT代表Tokens模态表示;
S1.1.1.2、与嵌入Tokens序列相同,对于Method name,也是采用GRU网络嵌入向量:
,
其中,bt是Method name中的词嵌入向量,htM是隐藏层状态值,最终隐藏层状态值hmM代表Method name模态表示;
S1.1.1.3、API sequence采用GRU网络嵌入向量:
,
其中,ct是API sequence中的词嵌入向量,htA是隐藏层状态值,最终隐藏层状态值hmA代表API sequence模态表示;
S1.1.2、获得每个模态的嵌入表示后,由于每个模态中的不同部分对最终的语义表示的贡献度是不同的,引入Attention机制为每个模态的不同部分赋予不同的权重;
S1.1.2.1、对于Tokens,不同的Tokens对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的Tokens序列赋予更高的权重;Tokens的Attention分数计算公式如下:
,
其中,fT是线性层函数,htT是第t个Tokens的隐藏层状态,cT是Tokens的上下文向量;
获得了Tokens的Attention分数后,得到Tokens的Attention向量:
;
S1.1.2.2、对于Method name,不同的Method name对代码段的最终语义表示的贡献度是不同的,需要引入Attention机制为代码段中对语义有重要贡献的Method name序列赋予更高的权重;Method name的Attention分数计算公式如下:
,
其中,fM是线性层函数,htM是第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分数计算公式如下:
,
其中,fA是线性层函数,htA是第t个API sequence的隐藏层状态,cA是API sequence的上下文向量;
获得了API sequence的Attention分数后,就可以得到API sequence的Attention向量:
;
S1.1.3、在获得了每个模态的Attention向量后,将这三个模态的Attention向量通过一个线性层来融合为一个向量:
,
其中,P为最终代码段的嵌入表示,W是Attention权值,[T;M;A]表示三个向量的连接;
步骤S2中,训练模型使用的是Ranking Loss函数,Ranking Loss函数的目的是去预测输入样本之间的相对距离,也称之为度量学习;
在使用Ranking Loss的过程中,首先从输入数据中提取出特征,并且得到其各自的嵌入表达;然后,定义一个距离度量函数用以度量这些嵌入表达之间的相似度;最终,训练特征提取器,以对于特定的样本对产生特定的相似度度量;
步骤S2中,训练时,将每个训练实例构建为一个三元组P,Q+,Q-,对于每个代码段P,都有一个正确的描述Q+和一个错误的描述Q-,错误的描述Q-是从所有的描述中随机选择的,当在三元组 P,Q+,Q-训练集上进行训练时,首先预测两个 P,Q+对和 P,Q-对的余弦相似性d,其目标是代码段P和错误的描述Q-间的余弦相似性d(P,Q-)与代码段M和正确的描述Q+间的余弦相似性d(P,Q+)之差大于一个阈值0.05,最小化Ranking Loss:
,
其中,α代表模型参数,T代表训练数据集;
步骤S2中,训练过程中,三元组P,Q+,Q-有三种情况:
S2.1、d(P,Q-)0.05+d(P,Q+),在向量空间中,对比起正确的描述,错误的描述和代码段已经有足够的距离,此时loss为0,网络参数将不会继续更新;
S2.2、d(P,Q-) d(P,Q+),错误的描述比起正确的描述更接近代码段,此时loss为正值并且比0.05大,网络参数可以继续更新;
S2.3、d(P,Q+) d(P,Q-) 0.05+d(P,Q+),在这种情况下,错误的描述到代码段的距离比起正确的描述来说,虽然是大于后者,但是并没有大于设定的阈值0.05,此时loss仍然为正值,但是小于0.05,此时网络参数可以继续更新;
步骤S4的具体步骤如下:
开发人员输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量,描述嵌入表示模块具体如下:
描述嵌入表示模块将自然语言描述和查询嵌入到向量中,一个自然语言描述或者查询Q={q1,q2,…,qn}是由n个单词序列组成的,对于自然语言描述或者查询Q,使用GRU网络嵌入到向量中:
,
其中,qt是自然语言描述或者查询中的词嵌入向量,htQ是隐藏层状态值,最终隐藏层状态值hnQ代表自然语言描述或者查询Q的嵌入表示。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南通大学,未经南通大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110368686.X/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种确保胶体原料颗粒大小相同的炼胶辅助设备
- 下一篇:一种芪苓祛湿散