CN112800172B - 一种基于两阶段注意力机制的代码搜索方法 - Google Patents

一种基于两阶段注意力机制的代码搜索方法 Download PDF

Info

Publication number
CN112800172B
CN112800172B CN202110167463.7A CN202110167463A CN112800172B CN 112800172 B CN112800172 B CN 112800172B CN 202110167463 A CN202110167463 A CN 202110167463A CN 112800172 B CN112800172 B CN 112800172B
Authority
CN
China
Prior art keywords
code
vector
query
matrix
attention mechanism
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.)
Active
Application number
CN202110167463.7A
Other languages
English (en)
Other versions
CN112800172A (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.)
Hubei Central China Technology Development Of Electric Power Co ltd
Original Assignee
Chongqing 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 Chongqing University filed Critical Chongqing University
Priority to CN202110167463.7A priority Critical patent/CN112800172B/zh
Publication of CN112800172A publication Critical patent/CN112800172A/zh
Application granted granted Critical
Publication of CN112800172B publication Critical patent/CN112800172B/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/31Indexing; Data structures therefor; Storage structures
    • G06F16/316Indexing structures
    • G06F16/328Management therefor
    • 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/3331Query processing
    • G06F16/334Query execution
    • G06F16/3344Query execution using natural language analysis
    • 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/3331Query processing
    • G06F16/334Query execution
    • G06F16/3347Query execution using vector based model
    • 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)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • Computational Linguistics (AREA)
  • Business, Economics & Management (AREA)
  • General Business, Economics & Management (AREA)
  • Artificial Intelligence (AREA)
  • Computer Security & Cryptography (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于两阶段注意力机制的代码搜索方法,具体包括如下步骤:选取一代码片段,从代码片段中所包含的函数名和函数体中提取文本特征及结构特征;根据所提取的文本特征和结构特征构建这两种特征的特征矩阵;融合文本特征矩阵和结构特征矩阵得到本代码片段的代码特征矩阵;从查询的语句中提取相关特征构建查询特征矩阵;利用代码特征矩阵和查询特征矩阵建立代码与查询的相关矩阵;通过计算相关矩阵得到所需的向量参数,最后根据向量参数与特征矩阵得出与查询语句最匹配的代码片段。

Description

一种基于两阶段注意力机制的代码搜索方法
技术领域
本发明涉及代码搜索领域,特别涉及一种基于两阶段注意力机制的代码搜索方法。
背景技术
现在的开源社区,比如GitHub和SourceForge,公开展示了数百万的源代码,从现有的大规模代码库中搜索和重用现有代码可以极大地帮助开发人员提高软件开发效率。为了支持代码搜索任务,早期的代码搜索模型利用信息检索(IR)技术返回符合搜索查询意图的代码片段列表,如:CodeHow就是一种基于IR的最新模型,它通过文本搜索引擎对大规模代码库进行索引,并根据搜索查询从代码库中搜索一组代码作为查询结果;同时,为了提高搜索效率,CodeHow还使用相关api扩展了查询功能,并通过扩展的布尔模型对搜索到的代码进行了重新排序。
然而,基于IR的模型很难将查询意图与代码的语义相匹配。为了更好地弥合查询(自然语言)和代码(编程语言)之间的语义鸿沟,Gu等人提出了一种基于深度学习(DL)的DeepCS模型,该模型使用LSTM(long and short term memory)模型将查询和代码嵌入到代表向量中,代码搜索的目的可以通过测量查询向量和代码向量之间的余弦相似度来实现;Shuai等人提出了一种利用卷积神经网络(CNN)和联合注意力机制来学习代码和查询之间的相关性的CARLCS-CNN模型。然而,这两个模型仍然存在两个局限性:(1)网络结构比较复杂。DeepCS和CARLCS-CNN都是基于深度复杂的神经网络,训练它们需要耗费大量的计算资源;(2)缺乏必要的结构特征。例如:代码的抽象语法树(ast)常常被忽略,通常这些模型会捕获代码文本特征,包括代码标记、函数名和API序列,但没有捕获源代码的结构特征,无法体现代码丰富的结构语义。
最近,Cambronero等人提出了一个简单的模型UNIF,它利用注意力层来嵌入代码/查询。实验结果表明,UNIF的性能优于DeepCS,并具有更复杂的网络设计;但是,与DeepCS类似的,UNIF没有考虑查询与代码的相关性以及代码的结构特征。通过对这些模型的观察和研究,如何结合UNIF和CARLCS-CNN的优点,建立一个具有文本特征和结构特征的高效代码搜索模型,成为目前迫切所需要解决的问题。
发明内容
针对现有技术存在的上述问题,本发明要解决的技术问题是:通过增加对结构特征的解析,提高查询意图与代码语义之间的匹配度。
为解决上述的技术问题,本发明采用如下技术方案:一种基于两阶段注意力机制的代码
搜索方法,包括如下步骤:
S100:在同一语言的现有代码库中任选一代码片段,该代码片段包括函数名和函数体;
S200:从函数名中提取一类代码文本特征,从函数体中提取代码结构特征和其他类代码文本特征;
S300:构建特征矩阵,所述特征矩阵包括代码文本特征矩阵和代码结构特征矩阵;
通过从函数名中提取一类代码文本特征和从函数体中提取的其他类代码文本特征构建代码文本特征矩阵;
所述代码文本特征矩阵由函数名的特征矩阵M,API序列的特征矩阵P和tokens的特征矩阵T构成,并且在计算函数名的特征矩阵M时引入注意力机制权重向量
Figure BDA0002937856680000021
在计算API序列的特征矩阵P时引入注意力机制权重向量
Figure BDA0002937856680000022
在计算tokens的特征矩阵T时引入注意力机制权重向量
Figure BDA0002937856680000023
通过代码结构特征构建代码结构特征矩阵,所述代码结构特征矩阵为结构特征矩阵AST,在计算结构特征矩阵AST时引入了注意力机制权重向量
Figure BDA0002937856680000024
S400:融合代码文本特征矩阵和代码结构特征矩阵,得到最终代码特征矩阵C;
S500:从所述代码库中随机选取若干查询语句和其对应的一条代码,所有查询语句构成训练集,每条查询语句为一个训练样本,每条查询语句对应的一条代码为真实代码;
从所有训练样本中提取出查询特征进行嵌入处理,得到所有训练样本的查询特征矩阵Q,在得到查询特征矩阵Q时引入注意力机制权重向量
Figure BDA0002937856680000025
S600:利用最终代码特征矩阵C和每个训练样本的查询特征矩阵Q计算相关矩阵F,F的表达式如下:
F=tanh(CTUQ)
其中,U为参数矩阵,且U∈Rk×k,F∈Rc×q
使用tanh激活函数来限制相关矩阵F中每个元素的值在-1和1之间;
S700:通过对所有相关矩阵F进行最大池化操作,再通过softmax函数对最大池化得到结果进行转化,得到最终代码特征矩阵C的权向量vC和所有训练样本的查询特征矩阵Q的权向量vQ
S800:利用最终代码特征矩阵C和相对应的权向量vC计算代码代表向量gC,表达式如下:
gC=CvC
利用每个训练样本的查询特征矩阵Q和相对应的权向量vQ计算查询代表向量gQ,表达式如下:
gQ=QvQ
S900:计算代码代表向量gC和查询代表向量gQ之间的关联度值;
确定最大的关联度值对应的代码代表向量gC,然后比对该代码代表向量gC所对应的一条代码是否与所述训练样本对应的真实代码相同:
若不同,则采用梯度下降,且反向传播的方式对如下参数进行更新,并返回S300,所述参数包括:注意力机制权重向量
Figure BDA0002937856680000033
注意力机制权重向量αpi,注意力机制权重向量
Figure BDA0002937856680000034
注意力机制权重向量
Figure BDA0002937856680000031
注意力机制权重向量
Figure BDA0002937856680000032
和S700中得到代码特征矩阵C的权向量vC和查询特征矩阵Q的权向量vQ过程的参数;
若相同,则判断迭代次数是否达到预设次数,若达到,执行下一步,否则返回S300;
S1000:对待预测语句对应代码的查询预测,具体步骤如下:
S1010:采用S500的方法得到待预测查询矩阵Q’;
S1020:采用S600中的方法计算待预测相关矩阵F’:
S1030:采用S700的方法得到待预测查询矩阵Q’的权向量vQ′;
S1040:采用S800的方法待预测语句的查询代表向量gQ′;
S1050:采用S900的方法计算计算代码代表向量gC和待预测语句的查询代表向量gQ′之间的关联度值;
确定最大的关联度值对应的代码代表向量gC,该代码代表向量gC所对应的一条代码即为待预测语句对应代码的查询结果。
作为改进,所述S200中从函数名中提取代码文本特征,从函数体中提取代码文本特征和
代码结构特征的具体步骤为:
用函数名作为该代码片段的第一个代码文本特征,从函数体中提取的API序列作为该代码片段的第二个代码文本特征,从函数体中提取的tokens作为该代码片段的第三个代码文本特征,从函数体中提取的AST作为该代码片段的结构特征。
作为改进,所述S300中构建代码文本特征矩阵的具体步骤为:
S310:设函数名中第i个词的k维初始向量为mi,其中,mi∈Rk,Rk表示维度为k的向量,i=1,2,…,n;
S311:计算mi的注意力机制权重向量
Figure BDA00029378566800000421
表达式如下:
Figure BDA0002937856680000041
其中,
Figure BDA0002937856680000042
是mi的k维注意力机制权重向量,
Figure BDA0002937856680000043
S312:将初始向量mi和相对应的注意力机制权重向量
Figure BDA0002937856680000044
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000045
S313:将函数名中所有词的加权向量进行串联运算,得到函数名的特征矩阵M,表达式如下:
Figure BDA0002937856680000046
其中,M∈Rk×n
Figure BDA0002937856680000047
为串联运算符;
S320:设API序列中第i个词的k维初始向量为pi,其中,pi∈Rk,i=1,2,…,n;
S321:计算pi的注意力机制权重向量
Figure BDA0002937856680000048
表达式如下:
Figure BDA0002937856680000049
其中,
Figure BDA00029378566800000410
是mi的k维注意力机制权重向量,
Figure BDA00029378566800000411
S322:将初始向量pi和相对应的注意力机制权重向量
Figure BDA00029378566800000412
的乘积作为该初始向量的加权向量
Figure BDA00029378566800000413
S323:将API序列中所有词的加权向量进行串联运算,得到API序列的特征矩阵P,表达式如下:
Figure BDA00029378566800000414
S330:设tokens中第i个词的k维初始向量为ti其中,ti∈Rk,i=1,2,…,n;
S331:计算ti的注意力机制权重向量
Figure BDA00029378566800000415
表达式如下:
Figure BDA00029378566800000416
其中,
Figure BDA00029378566800000417
是ti的k维注意力机制权重向量,
Figure BDA00029378566800000418
S332:将初始向量ti和相对应的注意力机制权重向量
Figure BDA00029378566800000419
的乘积作为该初始向量的加权向量
Figure BDA00029378566800000420
S333:将tokens中所有词的加权向量进行串联运算,得到tokens的特征矩阵T,表达式如下:
Figure BDA0002937856680000051
作为改进,所述S300中构建代码结构特征矩阵的具体步骤为:
S340:设函数体中提取的AST中第i个词的k维初始向量为asti,其中,asti∈Rk,i=1,2,…,n;
S341:计算asti的注意力机制权重向量
Figure BDA0002937856680000052
表达式如下:
Figure BDA0002937856680000053
其中,
Figure BDA0002937856680000054
是ti的k维注意力机制权重向量,
Figure BDA0002937856680000055
S342:将初始向量asti和相对应的注意力机制权重向量
Figure BDA0002937856680000056
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000057
S343:将函数体中提取的AST中所有词的加权向量进行串联运算,得到结构特征矩阵AST,表达式如下:
Figure BDA0002937856680000058
作为改进,所述S400中得到最终代码特征矩阵C的表达式如下:
Figure BDA0002937856680000059
其中,C∈Rk×c
作为改进,所述S500中获得查询特征矩阵Q的具体步骤为:
S510:从一句查询语句中提取tokens作为该语句的查询特征;
S520:设查询语句中tokens的第i个词的k维初始向量为qi,其中,qi∈Rk,i=1,2,…,n;
S521:计算qi的注意力机制权重向量
Figure BDA00029378566800000510
表达式如下:
Figure BDA00029378566800000511
其中,
Figure BDA00029378566800000512
是ti的k维注意力机制权重向量,
Figure BDA00029378566800000513
S522:将初始向量qi和相对应的注意力机制权重向量
Figure BDA00029378566800000514
的乘积作为该初始向量的加权向量
Figure BDA00029378566800000515
S523:将查询语句的tokens中所有词的加权向量进行串联运算,得到查询语句的特征矩阵Q,表达式如下:
Figure BDA00029378566800000516
其中,Q∈Rk×q
作为改进,所述S700中得到代码特征矩阵C的权向量vC和查询特征矩阵Q的权向量vQ的具体步骤为:
S710:对相关矩阵F上的行和列执行最大池化操作,具体表达式如下:
wC i=maxpooling(Fi,1,...,Fi,q)
wQ j=maxpooling(F1,j,...,Fc,j)
Figure BDA0002937856680000061
Figure BDA0002937856680000062
其中,wC i表示代码特征矩阵C中的第i个向量与查询特征矩阵Q的关联值,wQ j表示查询特征矩阵Q中的第j个向量与代码特征矩阵C的关联值;wC表示代码特征矩阵C中的每一个向量与查询特征矩阵Q的特征值,且wC∈Rp,wQ表示查询特征矩阵Q中的每一个向量与代码特征矩阵C的特征值,且wQ∈Rq
S720:利用softmax函数将wC转化为代码特征矩阵C的权向量vC,将wQ转化为查询特征矩阵Q的权向量vQ
作为改进,所述S900中计算代码代表向量gC和查询代表向量gQ之间的关联度值的具体步骤为:
S910:取代码代表向量gC和查询代表向量gQ之间的余弦相似度值,表达式如下:
Figure BDA0002937856680000063
其中,cos表示代码与查询语句之间的关联度。
相对于现有技术,本发明至少具有如下优点:
本发明方法通过两个阶段来弥补现有技术中代码和查询之间的语义鸿沟,在第一阶段,为了提取代码和查询的语义,通过使用注意力机制对代码和查询中频繁出现的单词赋予较少的权重,同时,对表示代码功能和开发人员意图的单词赋予更高的权重;在第二阶段,为了了解代码和查询之间的语义关联,通过使用联合注意力机制对包含语义关联的代码词和查询词赋予更高的权重,该方法查询准确高,而且耗时段。
附图说明
图1为TabCS的整体框架。
具体实施方式
下面对本发明作进一步详细说明。
为了解决自然语言与编程语言之间的区别给代码搜索带来的挑战,同时为了精确的找到查询语句和与之对应的代码之间的潜在关联,本发明提出了一种基于两阶段注意的代码搜索模型——TabCS。该模型旨在学习查询和代码之间的语义关系,为了捕捉查询意图与代码中的语义关联,本发明构建了一个两阶段注意力机制网络结构:
第一阶段,利用注意力机制为体现代码功能和开发人员意图的单词分配更高的权重,该模型将对代码和查询中经常出现的单词分配较少的权重(例如,“new”和“return”)。
第二阶段,为进一步协调查询意图和代码中单词的语义关联,利用联合注意力机制对查询和代码中具有语义关联的单词赋予更大的权重。两阶段的配合使用,可以更清晰准确的呈现出查询意图与代码语义之间的关联性。
本发明方法通过两个阶段来弥补代码和查询之间的语义鸿沟。在第一阶段,为了提取代码和查询的语义,通过使用注意力机制对代码和查询中频繁出现的单词赋予较少的权重,同时,对表示代码功能和开发人员意图的单词赋予更高的权重;在第二阶段,为了了解代码和查询之间的语义关联,通过使用联合注意力机制对包含语义关联的代码词和查询词赋予更高的权重。
第一阶段给嵌入向量ci分配权重的过程如下:
Ci=αici
这里ci可以表示在代码文本特征和结构特征中的mi,pi,ti,asti,这里αi是分配给代码特征中这个词的权重,由式12345得
Figure BDA0002937856680000071
Figure BDA0002937856680000072
因此Ci表示特征矩阵C的一个向量。模型训练中,第一阶段发现许多代码片段中经常存在一些单词,这意味着这些单词很难反映代码的功能,为了从代码中提取语义,第一阶段会为其分配较少的关注权重,并为可能反映函数功能的其他词分配更大的权重,这与查询相同。
尽管第一阶段赋予更大权重的代码词包含语义,但它们可能与查询无关,查询词也是如此。为了解决这个问题,第二阶段执行一个联合注意力机制来学习代码和查询的语义关联,第二阶段计算它们的语义相关性如下,F的单个元素Fi,j计算如下:,
Figure BDA0002937856680000073
Ci∈Rk和Qj∈Rk分别表示第一阶段输出的代码中的第i个词向量和查询输出中的第j个词向量,Fi,j表示它们的语义相关性;经过池化操作,
Figure BDA0002937856680000074
表示第k个代码关键字与查询语句所有关键字中最大的关联度,如果查询中没有词与第k个代码关键词相关,则
Figure BDA0002937856680000081
要少得多;相反,如果
Figure BDA0002937856680000082
更大,则意味着第k个码字与查询高度相关,查询语句同理;第二阶段通过使用wC和wQ对单词进行加权,可以找到包含语义关联的代码和查询词,通过两个阶段的权重分配,本发明模型可以更好地学习代码/查询代表向量。
本发明中,基于代码特征和查询特征形成的特征矩阵表示查询意图与代码语义之间的关联度。选取一代码片段,从代码片段中所包含的函数名和函数体中提取文本特征及结构特征;根据所提取的文本特征和结构特征构建这两种特征的特征矩阵;融合文本特征矩阵和结构特征矩阵得到本代码片段的代码特征矩阵;从查询的语句中提取相关特征构建查询特征矩阵;利用代码特征矩阵和查询特征矩阵建立代码与查询的相关矩阵;通过计算相关矩阵得到所需的向量参数,最后根据向量参数与特征矩阵得出与查询语句最匹配的代码片段。
一种基于两阶段注意力机制的代码搜索方法,包括如下步骤:
S100:在同一语言的现有代码库中任选一代码片段,该代码片段包括函数名和函数体。
S200:从函数名中提取一类代码文本特征,从函数体中提取代码结构特征和其他类代码文本特征。
S300:构建特征矩阵,所述特征矩阵包括代码文本特征矩阵和代码结构特征矩阵;
通过从函数名中提取一类代码文本特征和从函数体中提取的其他类代码文本特征构建代码文本特征矩阵。
所述代码文本特征矩阵由函数名的特征矩阵M,API序列的特征矩阵P和tokens的特征矩阵T构成,并且在计算函数名的特征矩阵M时引入注意力机制权重向量
Figure BDA0002937856680000083
在计算API序列的特征矩阵P时引入注意力机制权重向量
Figure BDA0002937856680000084
在计算tokens的特征矩阵T时引入注意力机制权重向量
Figure BDA0002937856680000085
对于一个文本特征(如标记),通过建立词汇表将每个单词转换成一个向量,然后将该特征表示为一个矩阵,该矩阵是由一系列词向量组成,即初始文本特征矩阵。
通过代码结构特征构建代码结构特征矩阵,所述代码结构特征矩阵为结构特征矩阵AST,在计算结构特征矩阵AST时引入了注意力机制权重向量
Figure BDA0002937856680000086
结构特征将代码片段解析为语法树,树中的节点描述了相应代码的类型,如循环结构、条件判断结构、方法调用和变量声明,通过构建词汇表和嵌入矩阵将节点转换为初始向量,然后构建结构特征矩阵。
S400:融合代码文本特征矩阵和代码结构特征矩阵,得到最终代码特征矩阵C。
S500:从所述代码库中随机选取若干查询语句和其对应的一条代码,所有查询语句构成训练集,每条查询语句为一个训练样本,每条查询语句对应的一条代码为真实代码。
从所有训练样本中提取出查询特征进行嵌入处理,得到所有训练样本的查询特征矩阵Q,在得到查询特征矩阵Q时引入注意力机制权重向量
Figure BDA0002937856680000091
S600:利用最终代码特征矩阵C和每个训练样本的查询特征矩阵Q计算相关矩阵F,F的表达式如下:
F=tanh(CTUQ)
其中,U为参数矩阵,开始训练时,给U为参数矩阵根据经验值赋初始值,且U∈Rk×k,F∈Rc×q
使用tanh激活函数来限制相关矩阵F中每个元素的值在-1和1之间,其中参数矩阵U∈Rk×k在训练过程中需要学习,相关矩阵F表示代码词和查询词之间的语义相关性。
S700:通过对所有相关矩阵F进行最大池化操作,再通过softmax函数对最大池化得到结果进行转化,得到最终代码特征矩阵C的权向量vC和所有训练样本的查询特征矩阵Q的权向量vQ
S800:利用最终代码特征矩阵C和相对应的权向量vC计算代码代表向量gC,表达式如下:
gC=CvC
利用每个训练样本的查询特征矩阵Q和相对应的权向量vQ计算查询代表向量gQ,表达式如下:
gQ=QvQ
S900:计算代码代表向量gC和查询代表向量gQ之间的关联度值。
确定最大的关联度值对应的代码代表向量gC,然后比对该代码代表向量gC所对应的一条代码是否与所述训练样本对应的真实代码相同。
若不同,则采用梯度下降,且反向传播的方式对如下参数进行更新,并返回S300,所述参数包括:注意力机制权重向量
Figure BDA0002937856680000092
注意力机制权重向量
Figure BDA0002937856680000093
注意力机制权重向量
Figure BDA0002937856680000094
注意力机制权重向量
Figure BDA0002937856680000095
注意力机制权重向量
Figure BDA0002937856680000096
和S700中得到代码特征矩阵C的权向量vC和查询特征矩阵Q的权向量vQ过程的参数,具体为wC i,wQ j和wC
若相同,则判断迭代次数是否达到预设次数,若达到,执行下一步,否则返回S300。
S1000:对待预测语句对应代码的查询预测,具体步骤如下:
S1010:采用S500的方法得到待预测查询矩阵Q’即从待预测语句提取出查询特征进行嵌入处理,得到待预测查询矩阵Q’;
1)从待预测查询中提取tokens作为该语句的查询特征;
2)设待预测查询中tokens的第i个词的k维向量为qi′,其中,qi′∈Rk,i=1,2,…,n;
3)将qi′和相对应的注意力机制权重向量
Figure BDA0002937856680000101
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000102
4)将待预测查询的tokens中所有词的加权向量进行串联运算,得到查询语句的特征矩阵Q’,表达式如下:
Figure BDA0002937856680000103
其中,Q‘∈Rk×q
此处计算时使用的所用的到的参数都是训练后。
S1020:采用S600中的方法计算待预测相关矩阵F’:
利用最终代码特征矩阵C和待预测查询语句的查询特征矩阵Q’计算相关矩阵F’,F’的表达式如下:
F′=tanh(CTUQ′)
其中,U为训练后的得到发参数矩阵,且U∈Rk×k,F’∈Rc×q
使用tanh激活函数来限制相关矩阵F’中每个元素的值在-1和1之间。
S1030:采用S700的方法得到待预测查询矩阵Q’的权向量vQ′;
对相关矩阵F’上的行和列执行最大池化操作,具体表达式如下:
wC i=maxpooling(Fi,1,...,Fi,q)
wQ j=maxpooling(F1,j,...,Fc,j)
Figure BDA0002937856680000104
Figure BDA0002937856680000105
其中,wC i是一个值,表示代码特征矩阵C中的第i个向量与查询特征矩阵D的关联值,wQ j是一个值,表示查询特征矩阵Q中的第j个向量与代码特征矩阵C的关联值;wC表示代码特征矩阵C中的每一个向量与查询特征矩阵Q的特征值,且wC∈Rp,wQ表示查询特征矩阵Q中的每一个向量与代码特征矩阵C的特征值,且wQ∈Rq
利用softmax函数将wQ转化为查询特征矩阵Q’的权向量vQ′
S1040:采用S800的方法待预测语句的查询代表向量gQ′
利用待查询语句的查询特征矩阵Q’和相对应的权向量vQ′计算查询代表向量gQ′,表达式如下:
gQ‘=Q′vQ′
S1050:采用S900的方法计算计算代码代表向量gC和待预测语句的查询代表向量gQ′之间的关联度值;
取代码代表向量gC和查询代表向量gQ′之间的余弦相似度值,表达式如下:
Figure BDA0002937856680000111
其中,cos表示代码与查询语句之间的关联度
确定最大的关联度值对应的代码代表向量gC,该代码代表向量gC所对应的一条代码即为待预测语句对应代码的查询结果。
具体试试时,所述S200中从函数名中提取代码文本特征,从函数体中提取代码文本特征和代码结构特征的具体步骤为:
用函数名作为该代码片段的第一个代码文本特征,函数名,一个骆驼分割单词列表,从函数体中提取的API序列作为该代码片段的第二个代码文本特征,API序列为函数体中的API单词列表,从函数体中提取的tokens作为该代码片段的第三个代码文本特征,tokens为函数体中的一组单词,从函数体中提取的AST作为该代码片段的结构特征,AST将代码片段解析为语法树。
具体实施时,所述S300中构建代码文本特征矩阵的具体步骤为:
S310:设函数名中第i个词的k维初始向量为mi,初始向量mi随机初始化,其中,mi∈Rk,Rk表示维度为k的向量,,i=1,2,…,n;
S311:计算mi的注意力机制权重向量
Figure BDA0002937856680000112
表达式如下:
Figure BDA0002937856680000113
其中,
Figure BDA0002937856680000114
是mi的k维注意力机制权重向量,
Figure BDA0002937856680000115
Figure BDA0002937856680000116
在模型训练过程中进行优化,通过取初始向量和注意力机制向量乘积的softmax函数来计算每个初始向量的注意力机制权重。
S312:将初始向量mi和相对应的注意力机制权重向量
Figure BDA0002937856680000117
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000118
S313:将函数名中所有词的加权向量进行串联运算,得到函数名的特征矩阵M,表达式如下:
Figure BDA0002937856680000119
其中,M∈Rk×n
Figure BDA0002937856680000121
为串联运算符;
S320:设API序列中第i个词的k维初始向量为pi,初始向量pi的值通过随机初始化得到,其中,pi∈Rk,i=1,2,…,n;
S321:计算pi的注意力机制权重向量
Figure BDA0002937856680000122
表达式如下:
Figure BDA0002937856680000123
其中,
Figure BDA0002937856680000124
是mi的k维注意力机制权重向量,
Figure BDA0002937856680000125
S322:将初始向量pi和相对应的注意力机制权重向量
Figure BDA0002937856680000126
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000127
S323:将API序列中所有词的加权向量进行串联运算,得到API序列的特征矩阵P,表达式如下:
Figure BDA0002937856680000128
S330:设tokens中第i个词的k维初始向量为ti,初始向量ti的值通过随机初始化得到,其中,ti∈Rk,i=1,2,…,n;
S331:计算ti的注意力机制权重向量
Figure BDA0002937856680000129
表达式如下:
Figure BDA00029378566800001210
其中,
Figure BDA00029378566800001211
是ti的k维注意力机制权重向量,
Figure BDA00029378566800001212
S332:将初始向量ti和相对应的注意力机制权重向量
Figure BDA00029378566800001213
的乘积作为该初始向量的加权向量
Figure BDA00029378566800001214
S333:将tokens中所有词的加权向量进行串联运算,得到tokens的特征矩阵T,表达式如下:
Figure BDA00029378566800001215
为了获取代码的语义,分别对三个初始特征矩阵执行注意力机制,注意力机制为每个单词分配权重,而编程语言中经常使用的单词被赋予较少的权重。如:代码词“is”、“if”、“return”、“false”和“true”经常存在于许多代码片段中,因此,在训练过程中,注意力机制学习到这些单词会认为它们与方法的语义无关;与这些词相比,不常用的词会被赋予更大的权重,因为它们更可能反映方法的功能。最后得到的三个特征矩阵,则分别代表了三个文本特征的语义。
具体实施时:所述S300中构建代码结构特征矩阵的具体步骤为:
S340:设函数体中提取的AST中第i个词的k维初始向量为asti,初始向量为asti的值通过随机初始化得到,其中,asti∈Rk,i=1,2,…,n;
S341:计算asti的注意力机制权重向量
Figure BDA0002937856680000131
表达式如下:
Figure BDA0002937856680000132
其中,
Figure BDA0002937856680000133
是ti的k维注意力机制权重向量,
Figure BDA0002937856680000134
S342:将初始向量asti和相对应的注意力机制权重向量
Figure BDA0002937856680000135
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000136
S343:将函数体中提取的AST中所有词的加权向量进行串联运算,得到结构特征矩阵AST,表达式如下:
Figure BDA0002937856680000137
AST将代码片段解析为语法树,树中的节点描述了相应代码的类型,如循环结构、条件判断结构、方法调用和变量声明,通过在广度优先策略中遍历AST,会得到所有AST节点,与文本特征一样,一部分节点反映了方法的功能,其余节点则不能,例如,节点“IfStatement”经常在许多代码片段中使用,并且很难反映方法的功能,但是节点“MethodDeclaration”使用的较少,更能准确反映方法的功能。因此,为了捕捉该方法的功能,会在AST节点上执行注意力机制,通过构建词汇表和嵌入矩阵将节点转换为初始向量,然后将其表示为AST结构特征矩阵。
具体实施时:所述S400中得到最终代码特征矩阵C的表达式如下:
Figure BDA0002937856680000138
其中,C∈Rk×c。C是通过将文本和结构特征中的所有加权向量串联起来形成的,与将加权向量压缩为一个向量相比,简单的连接操作可以有效地避免融合过程中原始信息的丢失。
具体实施时,所述S500中获得查询特征矩阵Q的具体步骤为:
S510:从一句查询语句中提取tokens作为该语句的查询特征;
S520:设查询语句中tokens的第i个词的k维初始向量为qi初始向量为qi的值通过随机初始化得到,其中,qi∈Rk,i=1,2,…,n;
S521:计算qi的注意力机制权重向量
Figure BDA0002937856680000139
表达式如下:
Figure BDA0002937856680000141
其中,
Figure BDA0002937856680000142
是ti的k维注意力机制权重向量,
Figure BDA0002937856680000143
S522:将初始向量qi和相对应的注意力机制权重向量
Figure BDA0002937856680000144
的乘积作为该初始向量的加权向量
Figure BDA0002937856680000145
S523:将查询语句的tokens中所有词的加权向量进行串联运算,得到查询语句的特征矩阵Q,表达式如下:
Figure BDA0002937856680000146
其中,Q∈Rk×q
查询语句总是包含开发人员意图的信息性关键字,从查询中提取tokens作为查询语句的特征。与代码标记一样,有些单词很难反映查询的语义,因为它们经常被使用。在将单词转换成代码标记等初始向量后,为了提取查询的语义,采用注意力机制对查询中频繁出现的单词分配较少的关注权重,对代表开发人员意图的单词赋予更大的权重。
具体实施时,所述S700中得到代码特征矩阵C的权向量vC和查询特征矩阵Q的权向
量vQ的具体步骤为:
S710:对相关矩阵F上的行和列执行最大池化操作,具体表达式如下:
wC i=maxpooling(Fi,1,...,Fi,q)
wQ j=maxpooling(F1,j,...,Fc,j)
Figure BDA0002937856680000147
Figure BDA0002937856680000148
其中,wC i表示代码特征矩阵C中的第i个向量与查询特征矩阵Q的关联值,wQ j表示查询特征矩阵Q中的第j个向量与代码特征矩阵C的关联值;wC表示代码特征矩阵C中的每一个向量与查询特征矩阵Q的特征值,且wC∈Rp,wQ表示查询特征矩阵Q中的每一个向量与代码特征矩阵C的特征值,且wQ∈Rq
S720:利用softmax函数将wC转化为代码特征矩阵C的权向量vC,将wQ转化为查询特征矩阵Q的权向量vQ
具体实施时,所述S900中计算代码代表向量gC和查询代表向量gQ之间的关联度值的具体步骤为:
S910:取代码代表向量gC和查询代表向量gQ之间的余弦相似度值,表达式如下:
Figure BDA0002937856680000151
其中,cos表示代码与查询语句之间的关联度。cos越大,则表示这段代码越可能为查询语句对应的正确代码。相反,越低则表示这段代码与该查询语句内容不对应。
实验验证
为了评估模型的有效性,本发明在两个现有的数据集上对模型进行测试。一个是Hu的数据集,包含485812个代码查询对,Hu的数据集是从2015年至2016年创建的GitHubJava存储库中收集的。为了筛选出低质量的项目,Hu等人只考虑了十星以上的项目,然后,从这些Java项目中提取Java方法及其对应的Javadoc,Javadoc的第一句话被认为是查询;另一个是Husain的数据集,该语料库包含542991个Java代码,其中查询是从GitHub存储库中进行收集,通过自然语言进行编写。
为了评估模型的性能,从一个数据集中随机选择10k个代码查询对作为测试数据,其余的数据作为模型的训练数据。对于每个查询,一个模型返回前10个候选代码,搜索性能由两个广泛使用的指标SuccessRate和MRR(mean recipular rank)来进行衡量。为了抑制随机性的影响,本发明每次会使用随机选择且各不相同的的训练数据/测试数据,对模型进行十次评估。
SuccessRate@k(SR@k),在排名前k的列表中可以找到相关代码方法的查询比例,具体来说,SR@k计算公式为:
Figure BDA0002937856680000152
其中Q是自动求值中的10k个查询;σ是一个指标函数,如果第i个查询(Qi)可以在排名前k的列表中找到,则返回1,否则返回0;此处,用k分别在1、5、10处评估SR。
MRR,所有查询的倒数秩的平均值,MRR的计算过程是:
Figure BDA0002937856680000153
Q是自动求值中的10k个查询;
Figure BDA0002937856680000154
是与排名列表中第i个查询(Qi)相关的基本真值代码的秩。与SR不同,MRR采用倒数秩作为度量的权重,同时,由于开发人员更倾向于通过短代码检查来找到预期的代码方法,所以此处只在前10名列表中测试MRR。换言之,当正确代码排在10之外时,那么1/rank等于0。
为了进一步验证本发明的有效性,将其与热门主流的代码算法进行了对比,并进行了消融实验,具体如下:
DeepCS:最先进的模型之一是Gu等人提出的DeepCS,DeepCS对方法名执行RNN和MLP网络。利用API序列,以及代码的tokens来获得代码代表向量,并执行RNN来获得查询代表向量,此处使用GitHub上共享的源代码重新运行DeepCS。
CARLCS-CNN:Shuai等人提出了一种基于深度学习的代码搜索模型CALCS-CNN,它利用CNN和LSTM与联合注意力机制相结合,在单个嵌入之后学习代码和查询的相互依赖表示。
UNIF:Cambronero等人提出的一种最新的监督码搜索模型,具体来说,UNIF使用一种基于学习注意的加权方案来组合每个tokens的嵌入,并生成嵌入的代码语句向量,描述句嵌入是通过对查询嵌入包进行平均得到的。
CARLCS-TS:该模型将结构化代码特征(即抽象语法树)引入到CALCS-CNN中,CARLCS-TS以四个代码特性(即方法名、API序列、tokens和AST序列)作为输入,同时,将添加的特征AST序列嵌入到单个CNN网络中,与其他特征一样合并到编码特征矩阵中。
UNIF-TS:是基础统一体的延伸,为了研究结构特征是否能提高代码搜索效率,UNIF-TS结合了结构化代码特征,即抽象语法树。
本发明比较了最先进的模型DeepCS、CARLCS-CNN、CARLCS-TS、UNIF和TabCS模型之间的代码搜索效率;结果表明,TabCS优于三种基于DL的模型(即DeepCS、CARLCS-CNN和CARLCS-TS)和UNIF。
对于Hu等人的数据集,TabCS的MRR为0.571,SR@/1/5/10为0.585/0.746/0.813。TabCS的MRR分别比对比模型DeepCS、Carlcsnn、CALRCS-TS和UNIF分别高出70.45%、17.73%、11.74%和10.66%;比较SR@/1/5/10,TabCS对比模型DeepCS、Carlcsnn、CALRCS-TS和UNIF分别高出76.74%/48.31%/37.10%、18.66%/14.59%/12.14%、12.50%/10.03%/8.40%和10.80%/,10.03%/7.82%/1/5/10。具体见表1:
表1 TabCS与对比模型在Hu等人上的数据集的性能对比结果
Model SR@1 SR@5 SR@10 MRR
DeepCS 0.331 0.503 0.593 0.335
CARLCS-CNN 0.493 0.651 0.725 0.485
CARLCS-TS 0.520 0.678 0.750 0.511
UNIF 0.528 0.678 0.754 0.516
TabCS 0.585 0.746 0.813 0.571
对于Husain等人的数据集,TabCS的MRR为0.539,SR@/1/5/10为0.547/0.683/0.748。TabCS的MRR分别比对比模型DeepCS、CALCS-CNN、CALRCS-TS和UNIF分别高出75.57%、31.78%、26.53%和28.64%;比较SR@/1/5/10,TabCS比DeepCS、CALCS-CNN、CALRCS-TS和UNIF分别高出86.05%/55.23%/41.40%、32.45%/22.62%/18.17%、24.60%/17.76%/14.02%和30.24%/22.84%/19.87%。具体见表2:
表2为TabCS与对比模型在Hu等人上的数据集的性能对比结果
Model SR@1 SR@5 SR@10 MRR
DeepCS 0.294 0.440 0.529 0.307
CARLCS-CNN 0.413 0.557 0.633 0.409
CARLCS-TS 0.439 0.580 0.656 0.426
UNIF 0.420 0.556 0.624 0.419
TabCS 0.547 0.683 0.748 0.539
此外,为了分析TabCS与这些基线之间的统计差异,本发明在5%显著性水平上对它们之间的MRR应用了Wilcoxon符号秩检验,p值小于0.01,表明TabCS在这些对比模型上的改善具有显著的统计学意义。
除了测试模型的性能,本发明还将模型实现一次搜索的平均时间与对比模型进行比较。
将本发明提出的模型与两个数据集上的基线进行比较。所有的实验都是在一台具有256gb内存的Nvidia Titan V GPU的服务器上实现的,在相同的实验装置下在Hu等人的数据集下进行了效率比较。结果表明,DeepCS、CARLCS-CNN、CARLCS-TS、UNIF和TabCS的优化时间分别为36.6、12.2、16.6、2.8和5.1小时,每个代码搜索查询的时间分别为1.1、0.4、0.7、0.2和0.4秒;与DeepCS、CARLCS-CNN和CARLCS-TS相比,TabCS的模型训练速度分别快7倍、2倍和3倍,与DeepCS和CARLCS-TS相比,TabCS的模型测试速度分别是DeepCS和CARLCS-TS的3倍和2倍;CALCS-CNN与TabCS在模型测试中的时间相同;UNIF在模型优化和代码搜索方面比TabCS稍快一些,这是因为UNIF只使用一个文本特征(即标记)来表示代码,而TabCS则提取三个文本特征和一个结构特征。具体见表3:
表3 TabCS与对比模型在Hu等人上的数据集的效率对比结果
Figure BDA0002937856680000171
Figure BDA0002937856680000181
本发明也计算了在Husain等人数据集上的训练和测试时间。结果表明,DeepCS、CARLCS-CNN、CARLCS-TS、UNIF和TabCS的优化时间分别为34.1、10.7、13.2、1.7和3.9小时,响应每个代码搜索查询的时间分别为0.9、0.4、0.6、0.2和0.4秒,与DeepCS、CARLCS-CNN和CARLCS-TS相比,TabCS的模型训练速度分别快8倍、2倍和3倍;与DeepCS和CARLCS-TS相比,TabCS是DeepCS和CARLCS-TS的2倍和1.5倍。具体见表4:
表4 TabCS与对比模型在Husain等人上的数据集的效率对比结果
Model Training Testing
DeepCS 34.1hours 0.9s/query
CARLCS-CNN 10.7hours 0.4s/query
CARLCS-TS 13.2hours 0.6s/query
UNIF 1.7hours 0.2s/query
TabCS 3.9hours 0.4s/query
这些结果表明,在效率方面,基于注意机制的搜索模型,特别是对于本发明提出的TabCS,是一个更好的实际应用选择。DeepCS、CARLCS-CNN和CARLCS-TS速度较慢,因为它们是基于CNN或LSTM的模型,具有复杂的网络结构和耗时的优化过程。
简而言之,本发明提出了一种基于两阶段注意力机制的代码搜索工具TabCS,它在第一阶段采用传统的注意力机制提取代码和查询语句的特征,在第二阶段通过联合注意力机制提取代码和查询语句之间的关联。本发明(TabCS)的性能优于目前热门主流的代码搜索算法,可以运用至实际的生活场景,为代码搜索做出贡献。
最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。

Claims (4)

1.一种基于两阶段注意力机制的代码搜索方法,其特征在于:包括如下步骤:
S100:在同一语言的现有代码库中任选一代码片段,该代码片段包括函数名和函数体;
S200:从函数名中提取一类代码文本特征,从函数体中提取代码结构特征和其他类代码文本特征;
S300:构建特征矩阵,所述特征矩阵包括代码文本特征矩阵和代码结构特征矩阵;
通过从函数名中提取一类代码文本特征和从函数体中提取的其他类代码文本特征构建代码文本特征矩阵;
所述代码文本特征矩阵由函数名的特征矩阵M,API序列的特征矩阵P和tokens的特征矩阵T构成,并且在计算函数名的特征矩阵M时引入注意力机制权重向量
Figure FDA0003673085920000011
在计算API序列的特征矩阵P时引入注意力机制权重向量
Figure FDA0003673085920000012
在计算tokens的特征矩阵T时引入注意力机制权重向量
Figure FDA0003673085920000013
通过代码结构特征构建代码结构特征矩阵,所述代码结构特征矩阵为结构特征矩阵AST,在计算结构特征矩阵AST时引入了注意力机制权重向量
Figure FDA0003673085920000014
所述构建代码文本特征矩阵的具体步骤为:
S310:设函数名中第i个词的k维初始向量为mi,其中,mi∈Rk,Rk表示维度为k的向量,i=1,2,…,n;
S311:计算mi的注意力机制权重向量
Figure FDA0003673085920000015
表达式如下:
Figure FDA0003673085920000016
其中,
Figure FDA0003673085920000017
是mi的k维注意力机制权重向量,
Figure FDA0003673085920000018
S312:将初始向量mi和相对应的注意力机制权重向量
Figure FDA0003673085920000019
的乘积作为该初始向量的加权向量
Figure FDA00036730859200000110
S313:将函数名中所有词的加权向量进行串联运算,得到函数名的特征矩阵M,表达式如下:
Figure FDA00036730859200000111
其中,M∈Rk×n
Figure FDA00036730859200000112
为串联运算符;
S320:设API序列中第i个词的k维初始向量为pi,其中,pi∈Rk,i=1,2,…,n;
S321:计算pi的注意力机制权重向量
Figure FDA00036730859200000113
表达式如下:
Figure FDA0003673085920000021
其中,
Figure FDA0003673085920000022
是mi的k维注意力机制权重向量,
Figure FDA0003673085920000023
S322:将初始向量pi和相对应的注意力机制权重向量
Figure FDA0003673085920000024
的乘积作为该初始向量的加权向量
Figure FDA0003673085920000025
S323:将API序列中所有词的加权向量进行串联运算,得到API序列的特征矩阵P,表达式如下:
Figure FDA0003673085920000026
S330:设tokens中第i个词的k维初始向量为ti其中,ti∈Rk,i=1,2,…,n;
S331:计算ti的注意力机制权重向量
Figure FDA0003673085920000027
表达式如下:
Figure FDA0003673085920000028
其中,
Figure FDA0003673085920000029
是ti的k维注意力机制权重向量,
Figure FDA00036730859200000210
S332:将初始向量ti和相对应的注意力机制权重向量
Figure FDA00036730859200000211
的乘积作为该初始向量的加权向量
Figure FDA00036730859200000212
S333:将tokens中所有词的加权向量进行串联运算,得到tokens的特征矩阵T,表达式如下:
Figure FDA00036730859200000213
所述构建代码结构特征矩阵的具体步骤为:
S340:设函数体中提取的AST中第i个词的k维初始向量为asti,其中,asti∈Rk,i=1,2,…,n;
S341:计算asti的注意力机制权重向量
Figure FDA00036730859200000214
表达式如下:
Figure FDA00036730859200000215
其中,
Figure FDA00036730859200000216
是ti的k维注意力机制权重向量,
Figure FDA00036730859200000217
S342:将初始向量asti和相对应的注意力机制权重向量
Figure FDA00036730859200000218
的乘积作为该初始向量的加权向量
Figure FDA00036730859200000219
S343:将函数体中提取的AST中所有词的加权向量进行串联运算,得到结构特征矩阵AST,表达式如下:
Figure FDA0003673085920000031
S400:融合代码文本特征矩阵和代码结构特征矩阵,得到最终代码特征矩阵C,最终代码特征矩阵C的表达式如下:
Figure FDA0003673085920000032
其中,C∈Rk×c
S500:从所述代码库中随机选取若干查询语句和其对应的一条代码,所有查询语句构成训练集,每条查询语句为一个训练样本,每条查询语句对应的一条代码为真实代码;
从所有训练样本中提取出查询特征进行嵌入处理,得到所有训练样本的查询特征矩阵Q,在得到查询特征矩阵Q时引入注意力机制权重向量
Figure FDA0003673085920000033
查询特征矩阵Q的具体步骤为:
S510:从一句查询语句中提取tokens作为该语句的查询特征;
S520:设查询语句中tokens的第i个词的k维初始向量为qi,其中,qi∈Rk,i=1,2,…,n;
S521:计算qi的注意力机制权重向量
Figure FDA0003673085920000034
表达式如下:
Figure FDA0003673085920000035
其中,
Figure FDA0003673085920000036
是ti的k维注意力机制权重向量,
Figure FDA0003673085920000037
S522:将初始向量qi和相对应的注意力机制权重向量
Figure FDA0003673085920000038
的乘积作为该初始向量的加权向量
Figure FDA0003673085920000039
S523:将查询语句的tokens中所有词的加权向量进行串联运算,得到查询语句的特征矩阵Q,表达式如下:
Figure FDA00036730859200000310
其中,Q∈Rk×q
S600:利用最终代码特征矩阵C和每个训练样本的查询特征矩阵Q计算相关矩阵F,F的表达式如下:
F=tanh(CTUQ)
其中,U为参数矩阵,且U∈Rk×k,F∈Rc×q
使用tanh激活函数来限制相关矩阵F中每个元素的值在-1和1之间;
S700:通过对所有相关矩阵F进行最大池化操作,再通过softmax函数对最大池化得到结果进行转化,得到最终代码特征矩阵C的权向量vC和所有训练样本的查询特征矩阵Q的权向量vQ
S800:利用最终代码特征矩阵C和相对应的权向量vC计算代码代表向量gC,表达式如下:
gC=CvC
利用每个训练样本的查询特征矩阵Q和相对应的权向量vQ计算查询代表向量gQ,表达式如下:
gQ=QvQ
S900:计算代码代表向量gC和查询代表向量gQ之间的关联度值;
确定最大的关联度值对应的代码代表向量gC,然后比对该代码代表向量gC所对应的一条代码是否与所述训练样本对应的真实代码相同:
若不同,则采用梯度下降,且反向传播的方式对如下参数进行更新,并返回S300,所述参数包括:注意力机制权重向量
Figure FDA0003673085920000041
注意力机制权重向量
Figure FDA0003673085920000042
注意力机制权重向量
Figure FDA0003673085920000043
注意力机制权重向量
Figure FDA0003673085920000044
注意力机制权重向量
Figure FDA0003673085920000045
和S700中得到代码特征矩阵C的权向量vC和查询特征矩阵Q的权向量vQ过程的参数;
若相同,则判断迭代次数是否达到预设次数,若达到,执行下一步,否则返回S300;
S1000:对待预测语句对应代码的查询预测,具体步骤如下:
S1010:采用S500的方法得到待预测查询矩阵Q’;
S1020:采用S600中的方法计算待预测相关矩阵F’:
S1030:采用S700的方法得到待预测查询矩阵Q’的权向量vQ′
S1040:采用S800的方法待预测语句的查询代表向量gQ′
S1050:采用S900的方法计算计算代码代表向量gC和待预测语句的查询代表向量gQ′之间的关联度值;
确定最大的关联度值对应的代码代表向量gC,该代码代表向量gC所对应的一条代码即为待预测语句对应代码的查询结果。
2.如权利要求1所述的基于两阶段注意力机制的代码搜索方法,其特征在于:所述S200中从函数名中提取代码文本特征,从函数体中提取代码文本特征和代码结构特征的具体步骤为:
用函数名作为该代码片段的第一个代码文本特征,从函数体中提取的API序列作为该代码片段的第二个代码文本特征,从函数体中提取的tokens作为该代码片段的第三个代码文本特征,从函数体中提取的AST作为该代码片段的结构特征。
3.如权利要求2所述的基于两阶段注意力机制的代码搜索方法,其特征在于:所述S700中得到代码特征矩阵C的权向量vC和查询特征矩阵Q的权向量vQ的具体步骤为:
S710:对相关矩阵F上的行和列执行最大池化操作,具体表达式如下:
wC i=maxpooling(Fi,1,...,Fi,q)
wQ j=maxpooling(F1,j,...,Fc,j)
Figure FDA0003673085920000051
Figure FDA0003673085920000052
其中,wC i表示代码特征矩阵C中的第i个向量与查询特征矩阵Q的关联值,wQ j表示查询特征矩阵Q中的第j个向量与代码特征矩阵C的关联值;wC表示代码特征矩阵C中的每一个向量与查询特征矩阵Q的特征值,且wC∈Rp,wQ表示查询特征矩阵Q中的每一个向量与代码特征矩阵C的特征值,且wQ∈Rq
S720:利用softmax函数将wC转化为代码特征矩阵C的权向量vC,将wQ转化为查询特征矩阵Q的权向量vQ
4.如权利要求3所述的基于两阶段注意力机制的代码搜索方法,其特征在于:所述S900中计算代码代表向量gC和查询代表向量gQ之间的关联度值的具体步骤为:
S910:取代码代表向量gC和查询代表向量gQ之间的余弦相似度值,表达式如下:
Figure FDA0003673085920000053
其中,cos表示代码与查询语句之间的关联度。
CN202110167463.7A 2021-02-07 2021-02-07 一种基于两阶段注意力机制的代码搜索方法 Active CN112800172B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110167463.7A CN112800172B (zh) 2021-02-07 2021-02-07 一种基于两阶段注意力机制的代码搜索方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110167463.7A CN112800172B (zh) 2021-02-07 2021-02-07 一种基于两阶段注意力机制的代码搜索方法

Publications (2)

Publication Number Publication Date
CN112800172A CN112800172A (zh) 2021-05-14
CN112800172B true CN112800172B (zh) 2022-07-12

Family

ID=75814664

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110167463.7A Active CN112800172B (zh) 2021-02-07 2021-02-07 一种基于两阶段注意力机制的代码搜索方法

Country Status (1)

Country Link
CN (1) CN112800172B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113761163B (zh) * 2021-08-18 2024-02-02 浙江大学 基于代码结构语义信息的深度代码搜索方法、系统及装置
CN113901177B (zh) * 2021-10-27 2023-08-08 电子科技大学 一种基于多模态属性决策的代码搜索方法
CN115017294B (zh) * 2022-05-31 2023-05-09 武汉大学 代码搜索方法
CN114880023B (zh) * 2022-07-11 2022-09-30 山东大学 面向技术特征的源代码对比方法、系统与程序产品
CN115577075B (zh) * 2022-10-18 2024-03-12 华中师范大学 一种基于关系图卷积网络的深度代码搜索方法
CN116974619B (zh) * 2023-09-22 2024-01-12 国网电商科技有限公司 一种软件物料清单库的构建方法、装置、设备及可读介质
CN117349453B (zh) * 2023-12-04 2024-02-23 武汉大学 一种基于扩展代码的深度学习代码搜索模型的加速方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111159223A (zh) * 2019-12-31 2020-05-15 武汉大学 一种基于结构化嵌入的交互式代码搜索方法及装置
CN111488137A (zh) * 2020-04-07 2020-08-04 重庆大学 一种基于共同注意力表征学习的代码搜索方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101035038B1 (ko) * 2010-10-12 2011-05-19 한국과학기술정보연구원 분류기의 동적 결합에 의한 대용량 분류기 자동 생성 시스템 및 방법
US9904893B2 (en) * 2013-04-02 2018-02-27 Patternex, Inc. Method and system for training a big data machine to defend
CN108519890B (zh) * 2018-04-08 2021-07-20 武汉大学 一种基于自注意力机制的鲁棒性代码摘要生成方法
CN110109835B (zh) * 2019-05-05 2021-03-30 重庆大学 一种基于深度神经网络的软件缺陷定位方法
CN110427568A (zh) * 2019-07-25 2019-11-08 成都品果科技有限公司 一种基于信息的协同注意力推介系统、方法和装置
US20200327118A1 (en) * 2020-06-27 2020-10-15 Intel Corporation Similarity search using guided reinforcement learning

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111159223A (zh) * 2019-12-31 2020-05-15 武汉大学 一种基于结构化嵌入的交互式代码搜索方法及装置
CN111488137A (zh) * 2020-04-07 2020-08-04 重庆大学 一种基于共同注意力表征学习的代码搜索方法

Also Published As

Publication number Publication date
CN112800172A (zh) 2021-05-14

Similar Documents

Publication Publication Date Title
CN112800172B (zh) 一种基于两阶段注意力机制的代码搜索方法
CN109271505B (zh) 一种基于问题答案对的问答系统实现方法
CN109829104B (zh) 基于语义相似度的伪相关反馈模型信息检索方法及系统
US11256487B2 (en) Vectorized representation method of software source code
CN109271506A (zh) 一种基于深度学习的电力通信领域知识图谱问答系统的构建方法
CN111488137B (zh) 一种基于共同注意力表征学习的代码搜索方法
CN111639252A (zh) 一种基于新闻-评论关联性分析的虚假新闻识别方法
CN111427775B (zh) 一种基于Bert模型的方法层次缺陷定位方法
KR20210151017A (ko) 검색 모델의 훈련 방법, 목표 대상의 검색 방법 및 그 장치
CN111639165A (zh) 基于自然语言处理和深度学习的智能问答优化方法
CN115374270A (zh) 一种基于图神经网络的法律文本摘要生成方法
CN113111836A (zh) 基于跨模态哈希学习的视频解析方法
CN116662565A (zh) 基于对比学习预训练的异质信息网络关键词生成方法
CN113761124B (zh) 文本编码模型的训练方法、信息检索方法及设备
CN112417170B (zh) 面向不完备知识图谱的关系链接方法
CN117574898A (zh) 基于电网设备的领域知识图谱更新方法及系统
CN116561314A (zh) 基于自适应阈值选择自注意力的文本分类方法
JP2023147236A (ja) 説明により強化された機械学習パイプライン
CN113468311B (zh) 一种基于知识图谱的复杂问句问答方法、装置及存储介质
CN112966095B (zh) 一种基于jean的软件代码推荐方法
CN111767388B (zh) 一种候选池生成方法
CN111562943B (zh) 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置
CN115826947A (zh) 一种基于命名模式的方法名称推荐方法
CN117435246B (zh) 一种基于马尔可夫链模型的代码克隆检测方法
CN117390175B (zh) 基于bert的智能家居使用事件抽取方法

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
TR01 Transfer of patent right

Effective date of registration: 20231218

Address after: No. 546, Luoyu Road, Hongshan District, Wuhan, Hubei Province, 430000

Patentee after: HUBEI CENTRAL CHINA TECHNOLOGY DEVELOPMENT OF ELECTRIC POWER Co.,Ltd.

Address before: 400044 No. 174 Sha Jie street, Shapingba District, Chongqing

Patentee before: Chongqing University