CN112966095A - 一种基于jean的软件代码推荐方法 - Google Patents

一种基于jean的软件代码推荐方法 Download PDF

Info

Publication number
CN112966095A
CN112966095A CN202110368686.XA CN202110368686A CN112966095A CN 112966095 A CN112966095 A CN 112966095A CN 202110368686 A CN202110368686 A CN 202110368686A CN 112966095 A CN112966095 A CN 112966095A
Authority
CN
China
Prior art keywords
code
vector
jean
query
description
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202110368686.XA
Other languages
English (en)
Other versions
CN112966095B (zh
Inventor
文万志
王仕强
周杰
陆晓虹
梁文栋
赵甜
程实
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Naborui Technology Co.,Ltd.
Original Assignee
Nantong University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nantong University filed Critical Nantong University
Priority to CN202110368686.XA priority Critical patent/CN112966095B/zh
Publication of CN112966095A publication Critical patent/CN112966095A/zh
Application granted granted Critical
Publication of CN112966095B publication Critical patent/CN112966095B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/33Querying
    • G06F16/335Filtering based on additional data, e.g. user or group profiles
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供一种基于JEAN的软件代码推荐方法,主要用于解决在软件开发中向开发人员推荐代码段的问题。包括如下步骤:S1、构建JEAN模型;S2、从GitHub上收集带有描述的java代码段数据集,并对其预处理用作训练集,用来训练JEAN模型;S3、构建代码库,使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量;S4、开发人员进行在线搜索代码,输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量;S5、使用余弦相似性计算查询向量和代码库中的所有代码向量之间的相似性,返回与查询向量最相关的向量的代码段。本发明能够有效地帮助软件开发人员根据自己的需求推荐合适的代码段,具有较高的精确率和效率。

Description

一种基于JEAN的软件代码推荐方法
技术领域
本发明属于信息检索的技术领域,具体涉及一种基于JEAN的软件代码推荐方法。
背景技术
在软件开发过程中,为了实现某些程序功能,开发人员经常要执行一些不熟悉的编程任务。当开发人员遇到这些编程问题时,他们往往会在网上搜索能够解决这些编程问题的代码段。然而,有研究表明,软件开发人员平均花费大约21%的开发时间在网络搜索上,这是因为随着互联网相关技术的不断发展,信息传播的速度也显著上升,导致信息过载问题越来越严重,从海量的数据筛选出有价值的信息变得越来越困难。
开发人员会通过搜索引擎或者在线问答论坛寻找他们所需求的代码段,然而通过搜索引擎或者在线问答论坛检索出的代码段中会存在许多一些低质量或者不符合需求的答案。此外,在面对这些检索出来的海量搜索结果时,还需要开发人员具有一定的开发经验来筛选出他们所需求的结果。
为了使开发人员从耗时的网络搜索中解脱出来,提出了根据开发需求自动生成代码段的方法,即代码推荐技术。代码推荐技术在帮助软件开发人员在给定用户查询(例如描述检索特定代码段的功能的简短自然语言文本)的可用开源数据库中检索现有代码片段方面发挥了关键作用。
发明内容
本发明要解决的技术问题是提供一种基于JEAN的软件代码推荐方法,能够有效地帮助软件开发人员根据自己的需求推荐合适的代码段,具有较高的精确率和效率。
为解决上述技术问题,本发明的实施例提供一种基于JEAN的软件代码推荐方法,包括如下步骤:
S1、构建JEAN模型;
S2、从GitHub上收集带有描述的java代码段数据集,并对其预处理用作训练集,用来训练JEAN模型;
S3、构建代码库,使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量;
S4、开发人员进行在线搜索代码,输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量;
S5、使用余弦相似性计算查询向量和代码库中的所有代码向量之间的相似性,返回与查询向量最相关的向量的代码段。
其中,步骤S1中,JEAN模型分为三个子模块:
S1.1、代码嵌入表示模块:用于表示代码段中Tokens、Method name、API sequence三个模态的向量,然后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网络嵌入向量:
Figure BDA0003008381540000031
其中,at是Tokens中at的词嵌入向量,ht T是隐藏层状态值,最终隐藏层状态值hm T代表Tokens模态表示;
S1.1.1.2、与嵌入Tokens序列相同,对于Method name,也是采用GRU网络嵌入向量:
Figure BDA0003008381540000032
其中,bt是Method name中bt的词嵌入向量,ht M是隐藏层状态值,最终隐藏层状态值hm M代表Method name模态表示;
S1.1.1.3、API sequence采用GRU网络嵌入向量:
Figure BDA0003008381540000033
其中,ct是API sequence中ct的词嵌入向量,ht A是隐藏层状态值,最终隐藏层状态值hm A代表API sequence模态表示;
S1.1.2、获得每个模态的嵌入表示后,由于每个模态中的不同部分对最终的语义表示的贡献度是不同的,引入Attention机制为每个模态的不同部分赋予不同的权重;
S1.1.2.1、对于Tokens,不同的Tokens对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的Tokens序列赋予更高的权重;Tokens的Attention分数计算公式如下:
Figure BDA0003008381540000041
其中,fT是线性层,ht T是第t个Tokens的隐藏层状态,cT是Tokens的上下文向量;
获得了Tokens的Attention分数后,得到Tokens的Attention向量:
Figure BDA0003008381540000042
S1.1.2.2、对于Method name,不同的Method name对代码段的最终语义表示的贡献度是不同的,需要引入Attention机制为代码段中对语义有重要贡献的Method name序列赋予更高的权重;Method name的Attention分数计算公式如下:
Figure BDA0003008381540000043
其中,fM是线性层,ht M是第t个Method name的隐藏层状态,cM是Method name的上下文向量;
获得了Method name的Attention分数后,得到Method name的Attention向量:
Figure BDA0003008381540000051
S1.1.2.3、对于API sequence,不同的API sequence对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的API sequence赋予更高的权重;API sequence的Attention分数计算公式如下:
Figure BDA0003008381540000052
其中,fA是线性层,ht A是第t个API sequence的隐藏层状态,cA是API sequence的上下文向量;
获得了API sequence的Attention分数后,就可以得到API sequence的Attention向量:
Figure BDA0003008381540000053
S1.1.3、在获得了每个模态的Attention向量后,将这三个模态的Attention向量通过一个线性层来融合为一个向量:
P=tanh(W[T;M;A]),
其中,P为最终代码段的嵌入表示,W是Attention权值,[T;M;A]表示三个向量的连接。
其中,步骤S2中训练模型的主要思想为:代码段和其对应的描述具有相似的语义,则它们在向量空间中的嵌入向量就彼此接近。换句话说,给定任意代码段P和任意描述Q,如果描述P是代码段Q的正确描述,那么希望能够预测出很高的相似性,反之,则是很低的相似性。
其中,步骤S2中,训练模型使用的是Ranking Loss函数,Ranking Loss函数的目的是去预测输入样本之间的相对距离,也称之为度量学习(metric learning);
在使用Ranking Loss的过程中,首先从输入数据中提取出特征,并且得到其各自的嵌入表达;然后,定义一个距离度量函数用以度量这些表达之间的相似度;比如说欧式距离。最终,训练这个特征提取器,以对于特定的样本对产生特定的相似度度量。
其中,步骤S2中,训练时,将每个训练实例构建为一个三元组<P,Q+,Q->,对于每个代码段P,都有一个正确的的描述Q+和一个错误的描述Q-,错误描述Q-是从所有的描述中随机选择的,当在三元组<P,Q+,Q->训练集上进行训练时,首先预测两个<P,Q+>对和<P,Q->对的余弦相似性d,其目标是代码段P和错误描述Q-间的余弦相似性d(P,Q-)与代码段M和正确描述N+间的余弦相似性d(P,Q+)之差大于一个阈值m,最小化Ranking Loss:
Figure BDA0003008381540000061
其中,α代表模型参数,T代表训练数据集,P,Q+,Q-分别是P,Q+,Q-的嵌入向量,m取值为0.05。
进一步,步骤S2中,训练过程中,三元组<P,Q+,Q->,可能有三种情况:
S2.1、d(P,Q-)>m+d(P,Q+),在向量空间中,对比起正确的描述,错误的描述和代码段已经有足够的距离了(即是大于m),此时loss为0,网络参数将不会继续更新;
S2.2、d(P,Q-)<d(P,Q+),在这种情况中,错误的描述比起正确的描述更接近代码段,此时loss为正值并且比m大,网络参数可以继续更新;
S2.3、d(P,Q+)<d(P,Q-)<m+d(P,Q+),在这种情况下,错误的描述到代码段的距离比起正确的描述来说,虽然是大于后者,但是并没有大于设定的阈值m,此时loss仍然为正值,但是小于m,此时网络参数可以继续更新。
其中,步骤S3的具体步骤如下:从GitHub上收集至少有25颗Star的Java项目,然后使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量,以构建代码库。
其中,步骤S4的具体步骤如下:
开发人员输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量,描述嵌入表示模块具体如下:
描述嵌入表示模块将自然语言描述和查询嵌入到向量中,例如一个自然语言描述或者查询Q={q1,q2,…,qn}是由n个单词序列组成的,对于自然语言描述或者查询Q,使用GRU网络嵌入到向量中:
Figure BDA0003008381540000071
其中,qt是自然语言描述或者查询中qt的词嵌入向量,ht Q是隐藏层状态值,最终隐藏层状态值hn Q代表自然语言描述或者查询Q的嵌入表示。
其中,步骤S5的具体步骤如下:
在获得代码嵌入向量P和查询向量Q后,使用余弦相似度来测量它们两个向量之间的相似度,其定义公式如下:
Figure BDA0003008381540000081
sim(P,Q)值越高,说明代码和自然语言描述或者查询的相关性就越高,然后返回与查询向量最相关的向量的代码段。
本发明的上述技术方案的有益效果如下:本发明能够有效地帮助软件开发人员根据自己的需求推荐合适的代码段,具有较高的精确率和效率。
附图说明
图1为本发明中EAN模型总体框架图;
图2是本发明中JEAN模型体系结构图;
图3是本发明中5个java编程问题描述图;
图4是本发明中代码推荐结果1示意图;
图5是本发明中代码推荐结果2示意图;
图6是本发明中代码推荐结果3示意图;
图7是本发明中代码推荐结果4示意图;
图8是本发明中代码推荐结果5示意图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明提供一种基于JEAN的软件代码推荐方法,主要用于解决在软件开发中向开发人员推荐代码段的问题。首先收集大量的带有描述的代码段,然后从中提取代码段中Tokens、Method name、API sequence元素信息以及代码段对应的描述来作为训练集,下一步用收集好的训练集使用上述的模型训练方法来训练JEAN模型。模型训练好之后,构建代码库,然后JEAN模型为代码库中的每个代码段都提取Tokens、Method name、API sequence元素信息,并使用代码嵌入表示模块将其嵌入成代码向量。最后,开发人员进行在线搜索代码,输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量,然后使用余弦相似性计算查询向量和代码库中的所有代码向量之间的相似性,返回与查询向量最相关的向量的代码段。
基于JEAN的软件代码推荐方法包括如下步骤:
S1、构建JEAN模型;
本步骤中,JEAN模型分为三个子模块:
S1.1、代码嵌入表示模块:用于表示代码段中Tokens、Method name、API sequence三个模态的向量,然后Attention机制为代码段中每个模态的不同部分赋予不同的权重,最后将注意向量融合成一个单独的向量。具体步骤如下:
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网络嵌入向量:
Figure BDA0003008381540000101
其中,at是Tokens中at的词嵌入向量,ht T是隐藏层状态值,最终隐藏层状态值hm T代表Tokens模态表示。
S1.1.1.2、与嵌入Tokens序列相同,对于Method name,也是采用GRU网络嵌入向量:
Figure BDA0003008381540000102
其中,bt是Method name中bt的词嵌入向量,ht M是隐藏层状态值,最终隐藏层状态值hm M代表Method name模态表示。
S1.1.1.3、API sequence采用GRU网络嵌入向量:
Figure BDA0003008381540000103
其中,ct是API sequence中ct的词嵌入向量,ht A是隐藏层状态值,最终隐藏层状态值hm A代表API sequence模态表示。
S1.1.2、获得每个模态的嵌入表示后,由于每个模态中的不同部分对最终的语义表示的贡献度是不同的,引入Attention机制为每个模态的不同部分赋予不同的权重。
S1.1.2.1、对于Tokens,不同的Tokens对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的Tokens序列赋予更高的权重;Tokens的Attention分数计算公式如下:
Figure BDA0003008381540000111
其中,fT是线性层,ht T是第t个Tokens的隐藏层状态,cT是Tokens的上下文向量。
获得了Tokens的Attention分数后,得到Tokens的Attention向量:
Figure BDA0003008381540000112
S1.1.2.2、对于Method name,不同的Method name对代码段的最终语义表示的贡献度是不同的,需要引入Attention机制为代码段中对语义有重要贡献的Method name序列赋予更高的权重;Method name的Attention分数计算公式如下:
Figure BDA0003008381540000113
其中,fM是线性层,ht M是第t个Method name的隐藏层状态,cM是Method name的上下文向量。
获得了Method name的Attention分数后,得到Method name的Attention向量:
Figure BDA0003008381540000114
S1.1.2.3、对于API sequence,不同的API sequence对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的API sequence赋予更高的权重;API sequence的Attention分数计算公式如下:
Figure BDA0003008381540000121
其中,fA是线性层,ht A是第t个API sequence的隐藏层状态,cA是API sequence的上下文向量。
获得了API sequence的Attention分数后,就可以得到API sequence的Attention向量:
Figure BDA0003008381540000122
S1.1.3、在获得了每个模态的Attention向量后,将这三个模态的Attention向量通过一个线性层来融合为一个向量:
P=tanh(W[T;M;A]),
其中,P为最终代码段的嵌入表示,W是Attention权值,[T;M;A]表示三个向量的连接。
S1.2、描述嵌入表示模块:用于将自然语言描述嵌入到向量中;
S1.3、余弦相似度模块:用于衡量代码段和描述之间的相似度。
S2、从GitHub上收集带有描述的java代码段数据集,并对其预处理用作训练集,用来训练JEAN模型。本步骤中训练模型的主要思想为:代码段和其对应的描述具有相似的语义,则它们在向量空间中的嵌入向量就彼此接近。换句话说,给定任意代码段P和任意描述Q,如果描述P是代码段Q的正确描述,那么希望能够预测出很高的相似性,反之,则是很低的相似性。
步骤S2中,训练模型使用的是Ranking Loss函数,Ranking Loss函数的目的是去预测输入样本之间的相对距离,也称之为度量学习(metric learning)。
在使用Ranking Loss的过程中,首先从输入数据中提取出特征,并且得到其各自的嵌入表达;然后,定义一个距离度量函数用以度量这些表达之间的相似度;比如说欧式距离。最终,训练这个特征提取器,以对于特定的样本对产生特定的相似度度量。
训练时,将每个训练实例构建为一个三元组<P,Q+,Q->,对于每个代码段P,都有一个正确的的描述Q+和一个错误的描述Q-,错误描述Q-是从所有的描述中随机选择的,当在三元组<P,Q+,Q->训练集上进行训练时,首先预测两个<P,Q+>对和<P,Q->对的余弦相似性d,其目标是代码段P和错误描述Q-间的余弦相似性d(P,Q-)与代码段M和正确描述N+间的余弦相似性d(P,Q+)之差大于一个阈值m,最小化Ranking Loss:
Figure BDA0003008381540000131
其中,α代表模型参数,T代表训练数据集,P,Q+,Q-分别是P,Q+,Q-的嵌入向量,m取值为0.05。
训练过程中,三元组<P,Q+,Q->,可能有三种情况:
S2.1、d(P,Q-)>m+d(P,Q+),在向量空间中,对比起正确的描述,错误的描述和代码段已经有足够的距离了(即是大于m),此时loss为0,网络参数将不会继续更新;
S2.2、d(P,Q-)<d(P,Q+),在这种情况中,错误的描述比起正确的描述更接近代码段,此时loss为正值并且比m大,网络参数可以继续更新;
S2.3、d(P,Q+)<d(P,Q-)<m+d(P,Q+),在这种情况下,错误的描述到代码段的距离比起正确的描述来说,虽然是大于后者,但是并没有大于设定的阈值m,此时loss仍然为正值,但是小于m,此时网络参数可以继续更新。
S3、构建代码库,使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量。具体步骤为:从GitHub上收集至少有25颗Star的Java项目,然后使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量,以构建代码库。
S4、开发人员进行在线搜索代码,输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量。具体步骤如下:
开发人员输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量,描述嵌入表示模块具体如下:
描述嵌入表示模块将自然语言描述和查询嵌入到向量中,例如一个自然语言描述或者查询Q={q1,q2,…,qn}是由n个单词序列组成的,对于自然语言描述或者查询Q,使用GRU网络嵌入到向量中:
Figure BDA0003008381540000141
其中,qt是自然语言描述或者查询中qt的词嵌入向量,ht Q是隐藏层状态值,最终隐藏层状态值hn Q代表自然语言描述或者查询Q的嵌入表示。
S5、使用余弦相似性计算查询向量和代码库中的所有代码向量之间的相似性,返回与查询向量最相关的向量的代码段。具体步骤如下:
在获得代码嵌入向量P和查询向量Q后,使用余弦相似度来测量它们两个向量之间的相似度,其定义公式如下:
Figure BDA0003008381540000151
sim(P,Q)值越高,说明代码和自然语言描述或者查询的相关性就越高,然后返回与查询向量最相关的向量的代码段。
基于JEAN的软件代码推荐方法的总体框架如图1所示,JEAN模型将代码段和自然语言描述联合嵌入到一个统一的向量空间中,使得查询和相应的代码段嵌入到附近的向量中,并通过向量相似度进行匹配。如图2所示,给出了JEAN模型的体系结构,对于给定一个自然语言查询,JEAN模型经过训练,就可以检索到相应的代码段。
下面进行实例分析,抽取5个java编程问题,如图3所示。
把这5个问题查询输入到JEAN模型中查看代码推荐结果:
输入问题1:′close this reader′,得到的代码推荐结果如图4所示。
输入问题2:′iterate over each entry in a Java Map′,得到的代码推荐结果如图5所示。
输入问题3:′return the creation date of the entry identified by thegiven alias′,得到的代码推荐结果如图6所示。
输入问题4:′set the locale that should be used when obtainingtranslations′,得到的代码推荐结果如图7所示。
输入问题5:′pause processing at the socket′,得到的代码推荐结果如图8所示。
比较上述5个问题的代码推荐结果和开发人员的需求,可以发现这5个问题的代码推荐结果可以帮助开发人员有效地解决编程问题。通过实例分析可以发现JEAN模型有很好的效果。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

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网络嵌入向量:
Figure FDA0003008381530000021
其中,at是Tokens中at的词嵌入向量,ht T是隐藏层状态值,最终隐藏层状态值hm T代表Tokens模态表示;
S1.1.1.2、与嵌入Tokens序列相同,对于Method name,也是采用GRU网络嵌入向量:
Figure FDA0003008381530000022
其中,bt是Method name中bt的词嵌入向量,ht M是隐藏层状态值,最终隐藏层状态值hm M代表Method name模态表示;
S1.1.1.3、API sequence采用GRU网络嵌入向量:
Figure FDA0003008381530000023
其中,ct是API sequence中ct的词嵌入向量,ht A是隐藏层状态值,最终隐藏层状态值hm A代表API sequence模态表示;
S1.1.2、获得每个模态的嵌入表示后,由于每个模态中的不同部分对最终的语义表示的贡献度是不同的,引入Attention机制为每个模态的不同部分赋予不同的权重;
S1.1.2.1、对于Tokens,不同的Tokens对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的Tokens序列赋予更高的权重;Tokens的Attention分数计算公式如下:
Figure FDA0003008381530000031
其中,fT是线性层,ht T是第t个Tokens的隐藏层状态,cT是Tokens的上下文向量;
获得了Tokens的Attention分数后,得到Tokens的Attention向量:
Figure FDA0003008381530000032
S1.1.2.2、对于Method name,不同的Method name对代码段的最终语义表示的贡献度是不同的,需要引入Attention机制为代码段中对语义有重要贡献的Method name序列赋予更高的权重;Method name的Attention分数计算公式如下:
Figure FDA0003008381530000033
其中,fM是线性层,ht M是第t个Method name的隐藏层状态,cM是Method name的上下文向量;
获得了Method name的Attention分数后,得到Method name的Attention向量:
Figure FDA0003008381530000034
S1.1.2.3、对于API sequence,不同的API sequence对代码段的最终语义表示的贡献度是不同的,引入Attention机制为代码段中对语义有重要贡献的API sequence赋予更高的权重;API sequence的Attention分数计算公式如下:
Figure FDA0003008381530000041
其中,fA是线性层,ht A是第t个API sequence的隐藏层状态,cA是API sequence的上下文向量;
获得了API sequence的Attention分数后,就可以得到API sequence的Attention向量:
Figure FDA0003008381530000042
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->,对于每个代码段P,都有一个正确的的描述Q+和一个错误的描述Q-,错误描述Q-是从所有的描述中随机选择的,当在三元组<P,Q+,Q->训练集上进行训练时,首先预测两个<P,Q+>对和<P,Q->对的余弦相似性d,其目标是代码段P和错误描述Q-间的余弦相似性d(P,Q-)与代码段M和正确描述N+间的余弦相似性d(P,Q+)之差大于一个阈值m,最小化Ranking Loss:
Figure FDA0003008381530000051
其中,α代表模型参数,T代表训练数据集,P,Q+,Q-分别是P,Q+,Q-的嵌入向量,m取值为0.05。
7.根据权利要求6所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S2中,训练过程中,三元组<P,Q+,Q->,可能有三种情况:
S2.1、d(P,Q-)>m+d(P,Q+),在向量空间中,对比起正确的描述,错误的描述和代码段已经有足够的距离,此时loss为0,网络参数将不会继续更新;
S2.2、d(P,Q-)<d(P,Q+),错误的描述比起正确的描述更接近代码段,此时loss为正值并且比m大,网络参数可以继续更新;
S2.3、d(P,Q+)<d(P,Q-)<m+d(P,Q+),在这种情况下,错误的描述到代码段的距离比起正确的描述来说,虽然是大于后者,但是并没有大于设定的阈值m,此时loss仍然为正值,但是小于m,此时网络参数可以继续更新。
8.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S3的具体步骤如下:从GitHub上收集至少有25颗Star的Java项目,然后使用JEAN模型中的代码嵌入表示模块将代码库中的所有代码段嵌入成代码向量,以构建代码库。
9.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S4的具体步骤如下:
开发人员输入查询后,JEAN模型中的描述嵌入表示模块将查询嵌入成查询向量,描述嵌入表示模块具体如下:
描述嵌入表示模块将自然语言描述和查询嵌入到向量中,例如一个自然语言描述或者查询Q={q1,q2,…,qn}是由n个单词序列组成的,对于自然语言描述或者查询Q,使用GRU网络嵌入到向量中:
Figure FDA0003008381530000061
其中,qt是自然语言描述或者查询中qt的词嵌入向量,ht Q是隐藏层状态值,最终隐藏层状态值hn Q代表自然语言描述或者查询Q的嵌入表示。
10.根据权利要求1所述的基于JEAN的软件代码推荐方法,其特征在于,步骤S5的具体步骤如下:
在获得代码嵌入向量P和查询向量Q后,使用余弦相似度来测量它们两个向量之间的相似度,其定义公式如下:
Figure FDA0003008381530000071
sim(P,Q)值越高,说明代码和自然语言描述或者查询的相关性就越高,然后返回与查询向量最相关的向量的代码段。
CN202110368686.XA 2021-04-06 2021-04-06 一种基于jean的软件代码推荐方法 Active CN112966095B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110368686.XA CN112966095B (zh) 2021-04-06 2021-04-06 一种基于jean的软件代码推荐方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110368686.XA CN112966095B (zh) 2021-04-06 2021-04-06 一种基于jean的软件代码推荐方法

Publications (2)

Publication Number Publication Date
CN112966095A true CN112966095A (zh) 2021-06-15
CN112966095B CN112966095B (zh) 2022-09-06

Family

ID=76279938

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110368686.XA Active CN112966095B (zh) 2021-04-06 2021-04-06 一种基于jean的软件代码推荐方法

Country Status (1)

Country Link
CN (1) CN112966095B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024031983A1 (zh) * 2022-08-10 2024-02-15 华为云计算技术有限公司 一种代码管理方法及相关设备

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108717470A (zh) * 2018-06-14 2018-10-30 南京航空航天大学 一种具有高准确度的代码片段推荐方法
US20190155945A1 (en) * 2017-10-27 2019-05-23 Babylon Partners Limited Computer implemented determination method
CN110716749A (zh) * 2019-09-03 2020-01-21 东南大学 一种基于功能相似度匹配的代码搜索方法
CN110750240A (zh) * 2019-08-28 2020-02-04 南京航空航天大学 一种基于序列到序列模型的代码片段推荐方法
US20200117446A1 (en) * 2018-10-13 2020-04-16 Manhattan Engineering Incorporated Code search and code navigation
CN111857660A (zh) * 2020-07-06 2020-10-30 南京航空航天大学 一种基于查询语句的情境感知api推荐方法及终端

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20190155945A1 (en) * 2017-10-27 2019-05-23 Babylon Partners Limited Computer implemented determination method
CN108717470A (zh) * 2018-06-14 2018-10-30 南京航空航天大学 一种具有高准确度的代码片段推荐方法
US20200117446A1 (en) * 2018-10-13 2020-04-16 Manhattan Engineering Incorporated Code search and code navigation
CN110750240A (zh) * 2019-08-28 2020-02-04 南京航空航天大学 一种基于序列到序列模型的代码片段推荐方法
CN110716749A (zh) * 2019-09-03 2020-01-21 东南大学 一种基于功能相似度匹配的代码搜索方法
CN111857660A (zh) * 2020-07-06 2020-10-30 南京航空航天大学 一种基于查询语句的情境感知api推荐方法及终端

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
_最冷一天: "《第二次结对作业》", 《HTTPS://WWW.CNBLOGS.COM/USTCKX16/P/11672351.HTML》 *
_最冷一天: "《第二次结对作业》", 《HTTPS://WWW.CNBLOGS.COM/USTCKX16/P/11672351.HTML》, 14 October 2019 (2019-10-14) *
DAVID FLANAGAN著,林剑 等译: "《Java实例技术手册 第三版》", 30 June 2005, 中国电力出版社, pages: 237 - 243 *
SANTANU PATTANAYAK著,魏国强 等译: "《TensorFlow深度学习:数学原理与Python实战进阶》", 29 February 2020, 机械工业出版社, pages: 212 - 213 *
唐子惠: "《医学人工智能导论》", 30 April 2020, 上海科学技术出版社, pages: 364 - 365 *
陈世鸿 等: "《软件工程原理与应用》", 31 December 2000, 武汉大学出版社, pages: 294 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024031983A1 (zh) * 2022-08-10 2024-02-15 华为云计算技术有限公司 一种代码管理方法及相关设备

Also Published As

Publication number Publication date
CN112966095B (zh) 2022-09-06

Similar Documents

Publication Publication Date Title
CN110059160B (zh) 一种端到端的基于上下文的知识库问答方法及装置
Pujara et al. Knowledge graph identification
CN111611361A (zh) 抽取式机器智能阅读理解问答系统
CN113761218B (zh) 一种实体链接的方法、装置、设备及存储介质
CN111291188B (zh) 一种智能信息抽取方法及系统
CN105393264A (zh) 人机交互学习中的交互区段提取
CN111666376B (zh) 一种基于段落边界扫描预测与词移距离聚类匹配的答案生成方法及装置
CN112328800A (zh) 自动生成编程规范问题答案的系统及方法
CN109145083B (zh) 一种基于深度学习的候选答案选取方法
CN113011172B (zh) 文本处理方法、装置、计算机设备和存储介质
CN113761890A (zh) 一种基于bert上下文感知的多层级语义信息检索方法
CN110866102A (zh) 检索处理方法
CN112805715A (zh) 识别实体属性关系
CN112417119A (zh) 一种基于深度学习的开放域问答预测方法
Zhou et al. Dynamicretriever: a pre-trained model-based IR system without an explicit index
CN112966095B (zh) 一种基于jean的软件代码推荐方法
CN113821587B (zh) 文本相关性确定方法、模型训练方法、装置及存储介质
CN112463914B (zh) 一种用于互联网服务的实体链接方法、装置及存储介质
EP4030355A1 (en) Neural reasoning path retrieval for multi-hop text comprehension
CN113449508A (zh) 一种基于事件链的网络舆情关联推演预测分析方法
CN110390050B (zh) 一种基于深度语义理解的软件开发问答信息自动获取方法
CN116628162A (zh) 语义问答方法、装置、设备及存储介质
CN116595125A (zh) 一种基于知识图检索的开放域问答方法
Keyvanpour et al. HQEBSKG: hybrid query expansion based on semantic knowledgebase and grouping
Jie et al. Enhancing Coherence of Extractive Summarization with Multitask Learning

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20240428

Address after: 518000 1104, Building A, Zhiyun Industrial Park, No. 13, Huaxing Road, Henglang Community, Longhua District, Shenzhen, Guangdong Province

Patentee after: Shenzhen Hongyue Information Technology Co.,Ltd.

Country or region after: China

Address before: 226019 Jiangsu Province, Nantong City Chongchuan District sik Road No. 9

Patentee before: NANTONG University

Country or region before: China

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20240430

Address after: Room 1805, Ruichen International Center, No.13 Nongzhangguan South Road, Chaoyang District, Beijing, 100125

Patentee after: Beijing Naborui Technology Co.,Ltd.

Country or region after: China

Address before: 518000 1104, Building A, Zhiyun Industrial Park, No. 13, Huaxing Road, Henglang Community, Longhua District, Shenzhen, Guangdong Province

Patentee before: Shenzhen Hongyue Information Technology Co.,Ltd.

Country or region before: China

TR01 Transfer of patent right