CN111488137A - 一种基于共同注意力表征学习的代码搜索方法 - Google Patents
一种基于共同注意力表征学习的代码搜索方法 Download PDFInfo
- Publication number
- CN111488137A CN111488137A CN202010267172.0A CN202010267172A CN111488137A CN 111488137 A CN111488137 A CN 111488137A CN 202010267172 A CN202010267172 A CN 202010267172A CN 111488137 A CN111488137 A CN 111488137A
- Authority
- CN
- China
- Prior art keywords
- code
- matrix
- vector
- word
- feature
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/044—Recurrent networks, e.g. Hopfield networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Evolutionary Computation (AREA)
- Biophysics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Biomedical Technology (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Databases & Information Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种基于共同注意力表征学习的代码搜索方法,包括取每个代码特征和该代码所对应的描述;分别采用三个独立的CNN神经网络嵌入方法名、词语和描述,用LSTM网络嵌入API序列得到相应的特征矩阵;然后将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵;引入经神经网络学习的参数矩阵,得到用于代码和其描述的共同注意力表征;将大量相互匹配的代码和描述作为模型输入,同步更新网络参数,得到优化的模型;代码搜索预测,将相关度排在前k个的向量c所对应的代码作为推荐列表输出。该方法在MRR方面表现优异,而且本发明模型结构简单,在模型训练上的运行速度和相应速度上都很快。
Description
技术领域
本发明涉及代码搜索技术领域,特别涉及一种基于共同注意力表征学习的代码搜索方法。
背景技术
在软件开发过程中,开发人员通常花费19%的时间搜索一些可重用的代码示例,以节省他们的开发工作。为了提高开发效率,开发人员经常从大规模开放源代码存储库(例如GitHub)中搜索和重用现有代码。
早期研究首先利用信息检索(IR)技术,例如基于Lucene的模型Koders,Krugle和Google代码搜索。但是这些模型只是将代码和搜索查询作为普通的Web搜索引擎文本,而忽略了上下文中的编程信息。为了捕获代码和查询中的编程语义,研究人员提出了许多模型。代表性模型之一是Erik等人提出的Sourcerer。将Lucene与代码结构信息集成在一起。另一个是Fei等人提出的CodeHow,它将用户查询识别为相关API,并使用扩展布尔模型执行代码搜索。
然而,上述模型未能填补代码中的编程语言和查询中的自然语言之间的语义鸿沟。为了解决这个问题,Gu等人提出了一种基于深度学习的模型,称为DeepCS。这是最先进的方法之一。DeepCS通过两个独立的LSTM(长期和短期记忆)将代码和查询嵌入到向量空间,最后将余弦相似度更高的代码返回给搜索查询。他们的实验结果表明,DeepCS的性能明显优于传统模型,包括Sourcerer和CodeHow。
尽管DeepCS相对于传统模型具有优势,但我们发现,联合嵌入并不能完全捕获代码和查询之间的语义相关性。例如,图1,DeepCS只能将查询中的单词“file”与代码中的两个API“createNewFile()”和“FileWriter()”相关联,因为它们都包含关键字“file”。但是,根据开发人员的理解,其他四个API也应与关键字“file”密切相关,包括“BufferedWriter()”,“write()”,“flush()”和“close()”。在实践中,任务(或查询)描述中使用的单词与任务相关的API之间会存在语义上的差距。因此,我们假设在没有完全理解这种语义相关性的情况下,DeepCS不太可能将预期的代码返回给开发人员的查询。
发明内容
针对现有技术存在的上述问题,本发明的要解决的技术问题是:如何提供一种可以准确有效进行代码检索的方法,该方法可以捕获代码和查询之间的依赖关系。
为解决上述技术问题,本发明采用如下技术方案:一种基于共同注意力表征学习的代码搜索方法,包括如下步骤:
S100:取每个代码特征和该代码所对应的描述,每个代码都包含三个特征:方法名,API序列和词语;分别采用三个独立的CNN神经网络嵌入方法名、词语和描述,用LSTM网络嵌入API序列得到相应的特征矩阵;
S200:然后将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵;
S300:通过引入经神经网络学习的参数矩阵,计算代码和与其对应的描述的相关矩阵,并沿着相关矩阵行和列进行最大池化操作,得到用于代码和其描述的共同注意力表征;
S400:将大量相互匹配的代码和描述作为CARLCS-CNN模型的输入,通过损失函数,采用梯度下降法同步更新所述三个独立的CNN神经网络和LSTM网络的参数,得到优化的CARLCS-CNN模型;
S500:代码搜索预测,采用S100的方法将大规模代码库中代码嵌入优化的CARLCS-CNN模型中,将大规模代码库中的每个代码均由一个向量c表示,研发人员输入带预测的输入优化的CARLCS-CNN模型中,得到待预测向量p,计算待预测向量p与每个向量c之间的相关度,将相关度排在前k个的向量c所对应的代码作为推荐列表输出。
作为改进,所述S100中CNN神经网络嵌入方法名得到特征矩阵M的过程如下:
S110:提取方法名中的单词序列,令mi∈Rk为与方法名序列中第i个单词相对应的k维单词向量,长度为n的序列表示为式(1.1):
S111:从单词mi:i+h-1的窗口生成特征ci
ci=f(WM*mi:i+h-1+b) (1.2);
其中b∈R是偏差项,*是卷积算子,f是非线性函数,该过滤器应用于方法名序列mi:h,m2:h+1,...,mn-h+1:n中每个可能的单词窗口,以生成特征图:
Mh=[c1,c2,...,cn-h+1] (1.3);
S112:使用器WM∈Rk×h三种类型的过滤器,三个过滤器窗口大小h在2到4之间变化,每种过滤器的数量为d,通过所述三个过滤器实现卷积运算,以提取三个独特的特征图,分别为Mh1,Mh2,Mh3∈Rd×(n-h+1),然后,将三个特征图拼接为一个统一的特征图得到特征矩阵M:
作为改进,所述S100中CNN神经网络嵌入词语得到特征矩阵T的过程如下:
一组长度为n的k维单词被连接为t1:n,使用三种类型的过滤器WT∈Rk×h,其窗口大小h从2到4进行卷积,每种类型的过滤器的数量为d,将三种类型的过滤器应用于h个单词的窗口,得到三个对应的特征图Th1,Th2,Th3∈Rd×(n-h+1),将三个特征图拼接为一个统一的特征图得到特征矩阵T中:
ci=f(WT*ti:i+h-1+b) (2.1);
Th=[c1,c2,...,cn-h+1] (2.2);
作为改进,所述S100中LSTM网络嵌入API序列得到特征矩阵A的过程如下:
S130:ai∈Rk是API序列中第i个词的k维词向量,长度为n的API序列拼接为a1:n,隐藏状态hi∈Rd为时间步长i的表示,可以通过双向LSTM获得,在此,d是每个隐藏状态的结点,隐藏状态的表示如下所示:
S131:时间步骤i的最终隐藏状态hi是正向LSTM和反向LSTM的拼接:
S132:将所有输出的隐藏状态连接到特征矩阵A∈Rd×n来嵌入API序列:
其中n是隐藏状态的数量。
作为改进,所述S100中CNN神经网络嵌入描述得到特征矩阵的过程如下:
di∈Rk是与描述中的第i个词相对应的k维词向量,长度为n的描述表示为d1:n,使用三种类型的过滤器WD∈Rk×h,其窗口大小h从2到4进行卷积,每种类型的过滤器的数量为d,将三种类型的过滤器应用于h个单词的窗口,得到三个对应的特征图Dh1,Dh2,Dh3∈Rd×(n-h+1),将三个特征图拼接为一个统一的特征图得到特征矩阵D:
ci=f(WD*di:i+h-1+b) (4.1);
Dh=[c1,c2,...,cn-h+1] (4.2);
作为改进,所述S200中将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵过程如下:
将三个代码特征嵌入到三个矩阵之后,将它们合并为一个矩阵C∈Rd×p作为代码的特征矩阵(5.1):
作为改进,所述S300中计算代码和与其对应的描述的相关矩阵过程如下:
通过代码特征和该代码所对应的描述后,可以得到两个特征矩阵C∈Rd×p和D∈Rd ×q,在此,p和q分别表示嵌入代码特征和代码所对应的描述的大小,通过引入经神经网络学习的参数矩阵U∈Rd×d,计算如下的相关矩阵F∈Rd×d:
F=tanh(CTUD) (6.1);
其中,F中的每个元素Fi,j表示两个对齐向量之间的语义相关性,即第i个代码字Ci,第j个描述字Di。
作为改进,所述S300中沿着相关矩阵行和列进行最大池化操作,得到用于代码和其描述的共同注意力表征的过程如下:
S310:F上的行和列进行最大池化操作,以获得代码和该代码所对应的描述的语义向量gC∈Rp和gD∈Rq,gC的第i个元素表示代码C中第i个单词与其描述D中最相关的单词之间的重要性得分,同样,gD的第i个元素表示描述D中第i个单词与代码C中最相关的词之间的重要性得分;
所述最大池化操作如下:
其中,语义向量gc和gD通过如下方式获得:
S311:在语义向量.gC和gD上使用softmax激活函数,以生成代码和描述的注意力向量aC∈Rp和aD∈Rq;
S312:在特征矩阵C,D和注意力向量aC,aD之间实现点积,以分别生成用于代码和描述的共同注意力表征rC∈Rd和rD∈Rd:
rc=Cac (7.7);
rD=DaD (7.8)。
作为改进,所述S400得到优化的CARLCS-CNN模型的过程如下:
S410:基本假设是学习一个映射,该映射将生成更多相似的代码与其对应的描述的表征,该映射将描述的表征和正确的代码靠近在一起,同时最小化以下的损失:
L(θ)=∑<c,d+,d->∈Gmax(0,β-sim(c,d+)+sim(c,d-)) (8.1);
其中θ表示模型参数,G表示训练数据集;
S411:使用Adam算法使损失函数最小化;
S412:注意力向量用于引导池化层在相关性矩阵F上执行列级和行级最大池化,在梯度下降阶段,模型参数θ通过反向传播更新,代码和描述的表征rC和rD也同时更新。
作为改进,所述S500中计算待预测向量p与每个向量c之间相关度的过程如下:
采用如下公式计算待预测向量p与每个向量c之间的相关度:
相对于现有技术,本发明至少具有如下优点:
本发明提供的方法利用与共同注意力机制相关联的CNN在独立嵌入后学习代码和查询的相互依赖的表征。自动化测试表明,本发明提供的方法在MRR方面表现优异,而且,本发明方法中的模型结构不复杂,在模型训练上的运行速度和相应速度上都很快。
附图说明
图1为本发明方法的流程简图。
图2为本发明方法的总体框架图。
图3为自动化测试中两个查询和对应的标签代码。
图4为CARLCS-CNN和DeepCS的性能与描述长度的关系。
图5为CARLCS-CNN的性能与卷积核数量的关系。
图6为现有方法检索代码时,代码与描述中相关联的词语的示例。
具体实施方式
下面对本发明作进一步详细说明。
本发明方法首先使用卷积神经网络(CNN)来嵌入代码和查询,因为CNN能更好地捕获查询和代码中的信息关键字。然后,CARLCS-CNN通过共同注意力机制学习嵌入后代码和查询的相互依赖的表征。共同注意力机制基于嵌入代码和查询来学习相关性矩阵,并利用对该矩阵的行/列最大池化来使模型专注于代码和查询之间相关联的关键字。这样,它们的语义相关性可以直接影响相应的表征。
参见图1和图2,一种基于共同注意力表征学习的代码搜索方法,包括如下步骤:
S100:取每个代码特征和该代码所对应的描述,每个代码都包含三个特征:方法名,API序列和词语;分别采用三个独立的CNN神经网络嵌入方法名、词语和描述,用LSTM网络嵌入API序列得到相应的特征矩阵。
作为改进,所述S100中CNN神经网络嵌入方法名得到特征矩阵M的过程如下:
方法名的单词序列是通过驼峰分词来提取的。例如,方法名“readFile”被分为单词“read”和“file”。很容易发现方法名的单词序列的长度很短。我们经验性地发现训练数据中每个方法名序列的平均长度为2.3。方法名序列是对代码功能的详尽总结,这意味着方法名称序列包含了代码的抽象语义特征。而CNN神经网络擅长提取鲁棒的抽象特征。
S110:提取方法名中的单词序列,令mi∈Rk为与方法名序列中第i个单词相对应的k维单词向量,长度为n的序列表示为式(1.1):
S111:从单词mi:i+h-1的窗口生成特征ci
ci=f(WM*mi:i+h-1+b) (1.2);
其中b∈R是偏差项,*是卷积算子,f是非线性函数,例如双曲正切函数。该过滤器应用于方法名序列mi:h,m2:h+1,...,mn-h+1:n中每个可能的单词窗口,以生成特征图:
Mh=[c1,c2,...,cn-h+1] (1.3);
S112:使用器WM∈Rk×h三种类型的过滤器,三个过滤器窗口大小h在2到4之间变化,每种过滤器的数量为d,通过所述三个过滤器实现卷积运算,以提取三个独特的特征图,分别为Mh1,Mh2,Mh3∈Rd×(n-h+1),然后,将三个特征图拼接为一个统一的特征图得到特征矩阵M:
作为改进,所述S100中CNN神经网络嵌入词语得到特征矩阵T的过程如下:
词语是从方法体中解析出来的单词包,在嵌入之前进行了数据预处理,数据预处理期间删除了重复的单词,停用词和Java关键字,这意味着词语是代码的信息关键字。
一组长度为n的k维单词被连接为t1:n,使用三种类型的过滤器WT∈Rk×h,其窗口大小h从2到4进行卷积,每种类型的过滤器的数量为d,将三种类型的过滤器应用于h个单词的窗口,得到三个对应的特征图Th1,Th2,Th3∈Rd×(n-h+1),将三个特征图拼接为一个统一的特征图得到特征矩阵T中:
ci=f(WT*ti:i+h-1+b) (2.1);
Th=[c1,c2,...,cn-h+1] (2.2);
作为改进,所述S100中LSTM网络嵌入API序列得到特征矩阵A的过程如下:
考虑到API序列的动态顺序特征,我们用LSTM进行API序列的嵌入。
S130:ai∈Rk是API序列中第i个词的k维词向量,长度为n的API序列拼接为a1:n,隐藏状态hi∈Rd为时间步长i的表示,可以通过双向LSTM获得,在此,d是每个隐藏状态的结点,通常,在双向LSTM中,前向LSTM的隐藏状态通过考虑其前一个记忆单元先前的隐藏状态和当前输入ai来更新。同时,后向LSTM的隐藏状态由其后面的存储单元下一隐藏状态和输入字向量ai更新形成。隐藏状态的表示如下所示:
S131:时间步骤i的最终隐藏状态hi是正向LSTM和反向LSTM的拼接:
S132:将所有输出的隐藏状态连接到特征矩阵A∈Rd×n来嵌入API序列:
其中n是隐藏状态的数量。
作为改进,所述S100中CNN神经网络嵌入描述得到特征矩阵的过程如下:
经研究发现描述的长度通常很短,发明人对1万个测试数据进行了统计研究,发现95.48%的描述中包含的单词数不超过20个,但是,描述中包含的信息性关键字反映了开发人员的意图。
di∈Rk是与描述中的第i个词相对应的k维词向量,长度为n的描述表示为d1:n,使用三种类型的过滤器WD∈Rk×h,其窗口大小h从2到4进行卷积,每种类型的过滤器的数量为d,将三种类型的过滤器应用于h个单词的窗口,得到三个对应的特征图Dh1,Dh2,Dh3∈Rd×(n-h+1),将三个特征图拼接为一个统一的特征图得到特征矩阵D:
ci=f(WD*di:i+h-1+b) (4.1);
Dh=[c1,c2,...,cn-h+1] (4.2);
S200:然后将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵。
具体地,所述S200中将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵过程如下:
将三个代码特征嵌入到三个矩阵之后,将它们合并为一个矩阵C∈Rd×p作为代码的特征矩阵(5.1):
S300:通过引入经神经网络学习的参数矩阵,计算代码和与其对应的描述的相关矩阵,并沿着相关矩阵行和列进行最大池化操作,得到用于代码和其描述的共同注意力表征。
作为改进,所述S300中计算代码和与其对应的描述的相关矩阵过程如下:
通过代码特征和该代码所对应的描述后,可以得到两个特征矩阵C∈Rd×p和D∈Rd ×q,在此,p和q分别表示嵌入代码特征和代码所对应的描述的大小,通过引入经神经网络学习的参数矩阵U∈Rd×d,计算如下的相关矩阵F∈Rd×d:
F=tanh(CTUD) (6.1);
相关性矩阵F可以集中地注意到嵌入代码和描述字词的语义相关性。其中,F中的每个元素Fi,j表示两个对齐向量之间的语义相关性,即第i个代码字Ci,第j个描述字Dj。具体地,F中的第i行表示描述中的每个单词与第i个代码词的语义相关性,同样,F中的第j列表示代码中每个单词与第j个描述单词的语义相关性。
作为改进,所述S300中沿着相关矩阵行和列进行最大池化操作,得到用于代码和其描述的共同注意力表征的过程如下:
S310:F上的行和列进行最大池化操作,以获得代码和该代码所对应的描述的语义向量gC∈Rp和gD∈Rq,gC的第i个元素表示代码C中第i个单词与其描述D中最相关的单词之间的重要性得分,同样,gD的第i个元素表示描述D中第i个单词与代码C中最相关的词之间的重要性得分;
最大池化性能优于平均池化。这可以解释为最大池化可以捕获代码和描述中每个单词之间最重要的语义相关性(值最高的一个)。
所述最大池化操作如下:
其中,语义向量gC和gD通过如下方式获得:
S311:在语义向量gC和gD上使用softmax激活函数,以生成代码和描述的注意力向量aC∈Rp和aD∈Rq。softmax函数将第j个元素和转换为注意力比率和例如,aC和aD中的第j个元素的计算如下:
S312:在特征矩阵C,D和注意力向量aC,aD之间实现点积,以分别生成用于代码和描述的共同注意力表征rC∈Rd和rD∈Rd:
rC=CaC (7.7);
rD=DaD (7.8)。
S400:将大量相互匹配的代码和描述作为CARLCS-CNN模型的输入,通过损失函数,采用梯度下降法同步更新所述三个独立的CNN神经网络和LSTM网络的参数,得到优化的CARLCS-CNN模型。
作为改进,所述S400得到优化的CARLCS-CNN模型的过程如下:
S410:基本假设是学习一个映射,该映射将生成更多相似的代码与其对应的描述的表征,该映射将描述的表征和正确的代码靠近在一起,同时最小化以下的损失:
其中θ表示模型参数,G表示训练数据集,对于每个代码段c,都有一个肯定描述d+(对c的正确描述)和一个从d+池中随机选择的否定描述d-(对c的不正确描述)。sim表示代码和描述之间的相似性得分。β是一个小的边距约束。本发明用余弦相似度测量并将固定的β值设置为0.05。
S411:使用Adam算法使损失函数最小化;Adam算法为现有技术,此处不再赘述。
在训练过程中,共同注意力机制会学习代码和描述的表征之间的相似性度量。这种相似性度量用于计算两个方向上的代码和描述的注意力向量。
S412:注意力向量用于引导池化层在相关性矩阵F上执行列级和行级最大池化,在梯度下降阶段,模型参数θ通过反向传播更新,代码和描述的表征rC和rD也同时更新。
S500:代码搜索预测,采用S100的方法将大规模代码库中代码嵌入优化的CARLCS-CNN模型中,将大规模代码库中的每个代码均由一个向量c表示,研发人员输入带预测的输入优化的CARLCS-CNN模型中,得到待预测向量p,计算待预测向量p与每个向量c之间的相关度,将相关度排在前k个的向量c所对应的代码作为推荐列表输出。
作为改进,所述S500中计算待预测向量p与每个向量c之间相关度的过程如下:
采用如下公式计算待预测向量p与每个向量c之间的相关度即计算待预测向量p与每个向量c之间的余弦相似度:
对比实验:
从以下五个方向出发(RQ):
RQ1:模型CARLCS-CNN的性能?
对比CARLCS-CNN的性能是否优于最新的代码搜索模型DeepCS。如果CARLCS-CNN显示出优于DeepCS的优势,则CARLCS-CNN学习到的共同注意力表征将对代码搜索很有帮助。
RQ2:模型CARLCS-CNN的效率?
比较CARLCS-CNN和DeepCS之间的训练和测试时间,并测试了所提出的模型是否可以大量节省计算资源。更快的模型表明在实践中更有价值的应用。
RQ3:CNN组件如何影响模型性能?
本发明使用CNN嵌入代码和描述,而DeepCS使用的LSTM。此RQ旨在评估,与LSTM相比,CNN是否可以更好地理解查询和代码中的单词语义。
RQ4:三个代码特征对模型性能的影响。
在CARLCS-CNN中,代码分别由三个特征(即方法名,API序列和词语)表示。为了分析它们对模型性能的影响,我们分别运行了包含单个特征的CARLCS-CNN模型,并研究将这三个特征一起使用是否是最佳选择。
RQ5:不同的参数设置对模型性能的影响。
CARLCS-CNN包含两个重要参数,这些参数极大地影响了模型的性能。第一个是CNN中的过滤器数量,该过滤器可从代码和查询中学习深度表征。另一个是描述的长度,它决定了代码描述中可用于模型优化的信息量。
数据集
我们对Gu等人的训练和测试数据进行了实验。训练数据包含从2008年8月到2016年6月创建的GitHub存储库中的至少18个星标的Java项目中的18233872个代码方法。在Gu等人的测试数据中,有10,000个代码查询对。为了评估CARLCS-CNN,我们将10k个查询用作模型输入,而将相应的代码视为标签。这种自动化评估可以避免人工检查中的偏差,并确保测试规模。表1显示了30个查询示例,图3显示了两个相应的代码示例。表2列出了查询中字数的分布。我们可以观察到95.48%的查询包含不超过20个单词,因为开发人员更喜欢信息丰富的关键字进行代码搜索。
表1为自动化测试集中30个查询例子。
表2为自动化测试集中1万个查询的字数统计
评价指标
为了评估所提出的模型CARLCS-CNN的性能,我们利用了两个常见的评估指标:Recall@k和MRR。详细信息如下:
Recall@k:与之相关的代码能排在列表的前k个位置的查询数量的比例:
Q是我们的自动评估中的10,000个查询,σ是一个指标函数,如果可以在排名前k的列表中找到第i个查询(Qi)对应的代码,则返回1;否则返回0。我们分别评估了Recall@1,Recall@5和Recall@10。
MRR:所有查询的倒数排名的平均值。MRR的计算过程为:
其中Q是自动化测试中的1万个查询;是与排名列表中的第i个查询(Qi)相关的标签代码的排名。与Recall不同,MRR使用倒数排名作为衡量的权重。同时,由于开发人员更喜欢通过短代码检验来找到期望的代码,因此,我们仅仅在前十名列表中测试MRR。换句话说,当对Qi的排名不超过10时,则1/RankQi等于0。
试验结果:
RQ1:模型性能
表3比较了最新模型DeepCS和CARLCS-CNN模型之间的代码搜索性能。结果显示DeepCS的MRR为0.408,Recall@1/5/10的值分别为0.413/0.591/0.683。CARLCS-CNN的MRR为0.517,Recall@1/5/10的值分别为0.528/0.698/0.773。CARLCS-CNN在Recall@1,Recall@5,Recall@10和MRR方面比DeepCS分别提高了27.84%,18.10%,13.17%和26.72%。
此外,为了分析CARLCS-CNN和DeepCS之间的统计差异,、对CARLCS-CNN和DeepCS的MRR应用了Wilcoxon符号秩检验,显著性水平为5%。p值小于0.01,表明CARLCS-CNN相对于DeepCS的改善在统计学意义上是显着的。这些结果表明,共同注意力表征学习对代码搜索是有益的。
表3为CARLCS-CNN模型与DeepCS模型之间代码搜索性能的对比
结论:我们提出的CARLCS-CNN模型在MRR和Recall两个指标上能够显著地提升DeepCS模型。
RQ2:模型效率
表4比较了在Gu等人的数据集上的训练和测试时间。在相同的实验设置下进行效率比较。结果表明,DeepCS花费约50个小时进行训练,并花费1.2秒响应每个代码搜索查询。模型CARLCS-CNN需要10个小时的时间训练,响应每个查询需要0.3秒。因此,与DeepCS相比,CARLCS-CNN在模型训练中的速度快5倍,在模型测试中的速度快4倍。这些结果表明,考虑到实际使用情况,CARLCS-CNN是更好的选择。CARLCS-CNN更快,因为它是基于CNN的模型。它的网络结构比基于LSTM的DeepCS更简单,因此整个工作过程可以更快。所有实验均在一台具有256GB内存的Nvidia Titan V GPU的服务器上实施。
表4为CARLCS-CNN模型与DeepCS模型在训练过程和测试过程所用时间的对比
结论:与DeepCS模型相比,CARLCS-CNN模型在训练中快5倍,在模型测试中快4倍。
RQ3:CNN组件的影响
CNN是CARLCS-CNN中嵌入代码和查询的重要组件。与DeepCS不同,我们用CNN代替LSTM。因为我们假设CNN可以更好地捕获查询和代码中的含有丰富信息的单词。为了研究上述替换对模型性能的影响,我们还使用DeepCS的原始LSTM实施了一个共同注意力表征学习模型。我们将这样的模型命名为CARLCS-LSTM。
表5显示CARLCS-LSTM的MRR为0.482,Recall@1/5/10分别为0.490/0.661/0.741。我们还可以注意到CARLCS-LSTM的MRR与CARLCS-CNN相比降低了6.77%,表明将CNN嵌入与共同注意力的表征学习相结合可以进一步提高代码搜索的效率。此外,我们可以观察到,尽管CARLCS-LSTM和DeepCS共享相同的嵌入框架,但CARLCS-LSTM中的共同关注力表征显示出优势,其MRR比DeepCS的MRR高18.14%。
表5为CARLCS-LSTM模型与CARLCS-CNN模型之间代码搜索性能的对比。
结论:对于基于共同注意力表征学习的代码搜索,与LSTM相比,CNN是更好的词嵌入选择。
RQ4:代码各特征的影响
所有比较的模型DeepCS,CARLCS-LSTM和CARLCS-CNN都使用三种代码特征作为输入,包括方法名(M),API序列(A)和词语(T)。为了研究这三个特征的相对重要性,我们一次运行了三个具有单独特征的模型。从表6中,我们可以观察到三个模型显示出相似的结果。具体来说,当仅使用一个特征作为模型输入时,其性能会大大降低,DeepCS的MRR(M/A/T)与DeepCS(M+A+T)相比从0.408下降了超过26.72%;CARLCS-LSTM(M/A/T)的MRR相对于CARLCS-LSTM(M+A+T)从0.482降低了至少30.71%;CARLCS-CNN(M/A/T)的MRR下降了27.66%,而CARLCS-CNN(M+A+T)的MRR则为0.517。因此,组合三个代码特征优于仅使用一个代码特征。另外,我们可以注意到特征M(方法名)对模型性能的影响最大。这是因为方法名是代码的简短摘要,并且通常使用与查询相同的词。
此外,为了调查这三个特征的必要性,表7显示了通过一次删除一个特征对它们进行灵敏度分析的方法。我们可以观察到,所有特征都对模型的性能有利,因为当删除方法名,API序列和词语特征时,MRR分别下降了39.07%,20.12%和11.80%。
表6为DeepCS模型、CARLCS-LSTM模型与CARLCS-CNN模型应用不同特征后搜索性能的对比
表7为CARLCS-CNN模型三个特征的敏感性分析
结论:将代码的三个特征全部作为模型的输入是有必要的;其中方法名对模型的性能影响最大。
RQ5:参数设置的影响
在CARLCS-CNN中,描述长度和过滤器数量是影响代码搜索效率的两个重要参数。描述长度决定了描述中要考虑多少信息以进行模型优化。图4显示了当长度设置为60时,CARLCS-CNN的MRR达到最佳。随着长度的增加性能将不再提高,但会增加模型的复杂性,60是描述长度的最佳选择。对于DeepCS,我们可以观察到理想的描述长度为30,但与CARLCS-CNN不同,添加该长度对模型性能有负面影响。这种比较表明,CARLCS-CNN对描述中的噪声具有鲁棒性。图5展示了CNN中使用各种数量的过滤器的CARLCS-CNN的性能。我们可以观察到,在大多数情况下,无论过滤器数量急剧增加,CARLCS-CNN都显示出稳定的性能,但是当过滤器数量为250时,CARLCS-CNN可获得最佳性能。因此,选择合适的过滤器数量对于模型优化是必要的。
结论:对于CARLCS-CNN模型,描述长度的最佳选择是60,将过滤器数量设置为250更有利于提升代码搜索的性能。
本发明提供的模型利用与共同注意力机制相关联的CNN在独立嵌入后学习代码和查询的相互依赖的表征。自动化测试表明,CARLCS-CNN在MRR方面明显优于DeepCS26.72%。此外,由于CARLCS-CNN的网络结构不复杂,在模型训练上的运行速度比DeepCS快5倍,在模型测试上快4倍。因此,共同注意力表征学习对于代码搜索是有益的。
最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。
Claims (10)
1.一种基于共同注意力表征学习的代码搜索方法,其特征在于,包括如下步骤:
S100:取每个代码特征和该代码所对应的描述,每个代码都包含三个特征:方法名,API序列和词语;分别采用三个独立的CNN神经网络嵌入方法名、词语和描述,用LSTM网络嵌入API序列得到相应的特征矩阵;
S200:然后将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵;
S300:通过引入经神经网络学习的参数矩阵,计算代码和与其对应的描述的相关矩阵,并沿着相关矩阵行和列进行最大池化操作,得到用于代码和其描述的共同注意力表征;
S400:将大量相互匹配的代码和描述作为CARLCS-CNN模型的输入,通过损失函数,采用梯度下降法同步更新所述三个独立的CNN神经网络和LSTM网络的参数,得到优化的CARLCS-CNN模型;
S500:代码搜索预测,采用S100的方法将大规模代码库中代码嵌入优化的CARLCS-CNN模型中,将大规模代码库中的每个代码均由一个向量c表示,研发人员输入带预测的输入优化的CARLCS-CNN模型中,得到待预测向量p,计算待预测向量p与每个向量c之间的相关度,将相关度排在前k个的向量c所对应的代码作为推荐列表输出。
2.如权利要求1所述的基于共同注意力表征学习的代码搜索方法,其特征在于,所述S100中CNN神经网络嵌入方法名得到特征矩阵M的过程如下:
S110:提取方法名中的单词序列,令mi∈Rk为与方法名序列中第i个单词相对应的k维单词向量,长度为n的序列表示为式(1.1):
m1:n=m1⊕m2⊕…⊕mn (1.1);
其中⊕是拼接运算符;
S111:从单词mi:i+h-1的窗口生成特征ci
ci=f(WM*mi:i+h-1+b) (1.2);
其中b∈R是偏差项,*是卷积算子,f是非线性函数,该过滤器应用于方法名序列mi:h,m2:h+1,…,mn-h+1:n中每个可能的单词窗口,以生成特征图:
Mh=[c1,c2,…,cn-h+1] (1.3);
S112:使用器WM∈Rk×h三种类型的过滤器,三个过滤器窗口大小h在2到4之间变化,每种过滤器的数量为d,通过所述三个过滤器实现卷积运算,以提取三个独特的特征图,分别为Mh1,Mh2,Mh3∈Rd×(n-h+1),然后,将三个特征图拼接为一个统一的特征图得到特征矩阵M:
M=Mh1⊕Mh2⊕Mh3 (1.4)。
3.如权利要求2所述的基于共同注意力表征学习的代码搜索方法,其特征在于,所述S100中CNN神经网络嵌入词语得到特征矩阵T的过程如下:
一组长度为n的k维单词被连接为t1:n,使用三种类型的过滤器WT∈Rk×h,其窗口大小h从2到4进行卷积,每种类型的过滤器的数量为d,将三种类型的过滤器应用于h个单词的窗口,得到三个对应的特征图Th1,Th2,Th3∈Rd×(n-h+1),将三个特征图拼接为一个统一的特征图得到特征矩阵T中:
ci=f(WT*ti:i+h-1+b) (2.1);
Th=[c1,c2,…,cn-h+1] (2.2);
T=Th1⊕Th2⊕Th3 (2.3)。
5.如权利要求4所述的基于共同注意力表征学习的代码搜索方法,其特征在于,所述S100中CNN神经网络嵌入描述得到特征矩阵的过程如下:
di∈Rk是与描述中的第i个词相对应的k维词向量,长度为n的描述表示为d1:n,使用三种类型的过滤器WD∈Rk×h,其窗口大小h从2到4进行卷积,每种类型的过滤器的数量为d,将三种类型的过滤器应用于h个单词的窗口,得到三个对应的特征图Dh1,Dh2,Dh3∈Rd×(n-h+1),将三个特征图拼接为一个统一的特征图得到特征矩阵D:
ci=f(WD*di:i+h-1+b) (4.1);
Dh=[c1,c2,…,cn-h+1] (4.2);
D=Dh1⊕Dh2⊕Dh3 (4.3)。
6.如权利要求5所述的基于共同注意力表征学习的代码搜索方法,其特征在于,所述S200中将方法名,API序列和词语对应的特征矩阵合并为一个矩阵作为每个代码的特征矩阵过程如下:
将三个代码特征嵌入到三个矩阵之后,将它们合并为一个矩阵C∈Rd×p作为代码的特征矩阵(5.1):
C=M⊕T⊕A (5.1)。
7.如权利要求6所述的基于共同注意力表征学习的代码搜索方法,其特征在于,所述S300中计算代码和与其对应的描述的相关矩阵过程如下:
通过代码特征和该代码所对应的描述后,可以得到两个特征矩阵C∈Rd×p和D∈Rd×q,在此,p和q分别表示嵌入代码特征和代码所对应的描述的大小,通过引入经神经网络学习的参数矩阵U∈Rd×d,计算如下的相关矩阵F∈Rd×d:
F=tanh(CTUD) (6.1);
其中,F中的每个元素Fi,j表示两个对齐向量之间的语义相关性,即第i个代码字Ci,第j个描述字Dj。
8.如权利要求7所述的基于共同注意力表征学习的代码搜索方法,其特征在于,所述S300中沿着相关矩阵行和列进行最大池化操作,得到用于代码和其描述的共同注意力表征的过程如下:
S310:F上的行和列进行最大池化操作,以获得代码和该代码所对应的描述的语义向量gC∈Rp和gD∈Rq,gc的第i个元素表示代码C中第i个单词与其描述D中最相关的单词之间的重要性得分,同样,gD的第i个元素表示描述D中第i个单词与代码C中最相关的词之间的重要性得分;
所述最大池化操作如下:
其中,语义向量gC和gD通过如下方式获得:
S311:在语义向量gc和gD上使用softmax激活函数,以生成代码和描述的注意力向量ac∈Rp和aD∈Rq;
S312:在特征矩阵C,D和注意力向量aC,aD之间实现点积,以分别生成用于代码和描述的共同注意力表征rC∈Rd和rD∈Rd:
rC=CaC (7.7);
rD=DaD (7.8)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010267172.0A CN111488137B (zh) | 2020-04-07 | 2020-04-07 | 一种基于共同注意力表征学习的代码搜索方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010267172.0A CN111488137B (zh) | 2020-04-07 | 2020-04-07 | 一种基于共同注意力表征学习的代码搜索方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111488137A true CN111488137A (zh) | 2020-08-04 |
CN111488137B CN111488137B (zh) | 2023-04-18 |
Family
ID=71794762
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010267172.0A Active CN111488137B (zh) | 2020-04-07 | 2020-04-07 | 一种基于共同注意力表征学习的代码搜索方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111488137B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112800172A (zh) * | 2021-02-07 | 2021-05-14 | 重庆大学 | 一种基于两阶段注意力机制的代码搜索方法 |
CN112836054A (zh) * | 2021-03-08 | 2021-05-25 | 重庆大学 | 一种基于共生注意力表示学习的服务分类方法 |
CN113064633A (zh) * | 2021-03-26 | 2021-07-02 | 山东师范大学 | 一种代码摘要自动生成方法及系统 |
CN113204679A (zh) * | 2021-04-13 | 2021-08-03 | 武汉大学 | 一种代码查询模型的生成方法和计算机设备 |
CN113435685A (zh) * | 2021-04-28 | 2021-09-24 | 桂林电子科技大学 | 一种分层Attention深度学习模型的课程推荐方法 |
CN113901177A (zh) * | 2021-10-27 | 2022-01-07 | 电子科技大学 | 一种基于多模态属性决策的代码搜索方法 |
CN114186017A (zh) * | 2021-11-02 | 2022-03-15 | 武汉大学 | 基于多维度匹配的代码搜索方法 |
CN115017294A (zh) * | 2022-05-31 | 2022-09-06 | 武汉大学 | 代码搜索方法 |
CN117349453A (zh) * | 2023-12-04 | 2024-01-05 | 武汉大学 | 一种基于扩展代码的深度学习代码搜索模型的加速方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140304200A1 (en) * | 2011-10-24 | 2014-10-09 | President And Fellows Of Harvard College | Enhancing diagnosis of disorder through artificial intelligence and mobile health technologies without compromising accuracy |
US20190205761A1 (en) * | 2017-12-28 | 2019-07-04 | Adeptmind Inc. | System and method for dynamic online search result generation |
CN110163299A (zh) * | 2019-05-31 | 2019-08-23 | 合肥工业大学 | 一种基于自底向上注意力机制和记忆网络的视觉问答方法 |
CN110413319A (zh) * | 2019-08-01 | 2019-11-05 | 北京理工大学 | 一种基于深度语义的代码函数味道检测方法 |
CN110955745A (zh) * | 2019-10-16 | 2020-04-03 | 宁波大学 | 一种基于深度学习的文本哈希检索方法 |
-
2020
- 2020-04-07 CN CN202010267172.0A patent/CN111488137B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140304200A1 (en) * | 2011-10-24 | 2014-10-09 | President And Fellows Of Harvard College | Enhancing diagnosis of disorder through artificial intelligence and mobile health technologies without compromising accuracy |
US20190205761A1 (en) * | 2017-12-28 | 2019-07-04 | Adeptmind Inc. | System and method for dynamic online search result generation |
CN110163299A (zh) * | 2019-05-31 | 2019-08-23 | 合肥工业大学 | 一种基于自底向上注意力机制和记忆网络的视觉问答方法 |
CN110413319A (zh) * | 2019-08-01 | 2019-11-05 | 北京理工大学 | 一种基于深度语义的代码函数味道检测方法 |
CN110955745A (zh) * | 2019-10-16 | 2020-04-03 | 宁波大学 | 一种基于深度学习的文本哈希检索方法 |
Non-Patent Citations (6)
Title |
---|
JIANHANG SHUAI 等: "Improving Code Search with Co-Attentive Representation Learning" * |
JINBAO XIE 等: "Chinese text classification based on attention mechanism and feature-enhanced fusion neural network" * |
ZHOU YU 等: "Beyond Bilinear: Generalized Multimodal Factorized High-Order Pooling for Visual Question Answering" * |
刘颖: "面向依赖性和稀疏性的多类标文本分类序列生成模型研究" * |
帅鉴航: "面向文本的代码搜索方法研究" * |
李梅 等: "基于注意力机制的CNN-LSTM模型及其应用" * |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112800172B (zh) * | 2021-02-07 | 2022-07-12 | 重庆大学 | 一种基于两阶段注意力机制的代码搜索方法 |
CN112800172A (zh) * | 2021-02-07 | 2021-05-14 | 重庆大学 | 一种基于两阶段注意力机制的代码搜索方法 |
CN112836054A (zh) * | 2021-03-08 | 2021-05-25 | 重庆大学 | 一种基于共生注意力表示学习的服务分类方法 |
CN112836054B (zh) * | 2021-03-08 | 2022-07-26 | 重庆大学 | 一种基于共生注意力表示学习的服务分类方法 |
CN113064633A (zh) * | 2021-03-26 | 2021-07-02 | 山东师范大学 | 一种代码摘要自动生成方法及系统 |
CN113204679A (zh) * | 2021-04-13 | 2021-08-03 | 武汉大学 | 一种代码查询模型的生成方法和计算机设备 |
CN113204679B (zh) * | 2021-04-13 | 2023-08-01 | 武汉大学 | 一种代码查询模型的生成方法和计算机设备 |
CN113435685A (zh) * | 2021-04-28 | 2021-09-24 | 桂林电子科技大学 | 一种分层Attention深度学习模型的课程推荐方法 |
CN113901177A (zh) * | 2021-10-27 | 2022-01-07 | 电子科技大学 | 一种基于多模态属性决策的代码搜索方法 |
CN113901177B (zh) * | 2021-10-27 | 2023-08-08 | 电子科技大学 | 一种基于多模态属性决策的代码搜索方法 |
CN114186017A (zh) * | 2021-11-02 | 2022-03-15 | 武汉大学 | 基于多维度匹配的代码搜索方法 |
CN114186017B (zh) * | 2021-11-02 | 2024-02-27 | 武汉大学 | 基于多维度匹配的代码搜索方法 |
CN115017294A (zh) * | 2022-05-31 | 2022-09-06 | 武汉大学 | 代码搜索方法 |
CN115017294B (zh) * | 2022-05-31 | 2023-05-09 | 武汉大学 | 代码搜索方法 |
CN117349453A (zh) * | 2023-12-04 | 2024-01-05 | 武汉大学 | 一种基于扩展代码的深度学习代码搜索模型的加速方法 |
CN117349453B (zh) * | 2023-12-04 | 2024-02-23 | 武汉大学 | 一种基于扩展代码的深度学习代码搜索模型的加速方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111488137B (zh) | 2023-04-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111488137B (zh) | 一种基于共同注意力表征学习的代码搜索方法 | |
Cambronero et al. | When deep learning met code search | |
CN113806482B (zh) | 视频文本跨模态检索方法、装置、存储介质和设备 | |
CN110188272B (zh) | 一种基于用户背景的社区问答网站标签推荐方法 | |
US7689615B2 (en) | Ranking results using multiple nested ranking | |
CN109800434B (zh) | 基于眼动注意力的抽象文本标题生成方法 | |
CN112800172B (zh) | 一种基于两阶段注意力机制的代码搜索方法 | |
CN107679082A (zh) | 问答搜索方法、装置以及电子设备 | |
CN112328891A (zh) | 训练搜索模型的方法、搜索目标对象的方法及其装置 | |
CN115017294B (zh) | 代码搜索方法 | |
CN115712740B (zh) | 多模态蕴含增强图像文本检索的方法和系统 | |
CN115422369B (zh) | 基于改进TextRank的知识图谱补全方法和装置 | |
CN111523037B (zh) | 一种开源软件开发中Pull Request的评审者推荐方法 | |
CN117634615A (zh) | 一种基于模态无关对比学习的多任务代码检索方法 | |
CN111597316A (zh) | 融合语义与问题关键信息的多阶段注意力答案选取方法 | |
CN113220996B (zh) | 基于知识图谱的科技服务推荐方法、装置、设备及存储介质 | |
Yang et al. | Locating faulty methods with a mixed RNN and attention model | |
Li et al. | Hierarchical embedding for code search in software Q&A sites | |
Wang et al. | WheaCha: A method for explaining the predictions of models of code | |
CN116306606A (zh) | 一种基于增量学习的金融合同条款提取方法和系统 | |
CN101916251B (zh) | 多媒体集成检索装置和方法 | |
Zhang et al. | Automatic learning common definitional patterns from multi-domain Wikipedia pages | |
CN118245590B (zh) | 基于多视角图对比学习和元学习特征净化网络的答案选择方法及系统 | |
CN116821712B (zh) | 非结构化文本与知识图谱的语义匹配方法及装置 | |
CN118410060B (zh) | 一种gql语料生成模型训练方法、装置和存储介质 |
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 |