CN116661852B - 一种基于程序依赖图的代码搜索方法 - Google Patents
一种基于程序依赖图的代码搜索方法 Download PDFInfo
- Publication number
- CN116661852B CN116661852B CN202310356382.0A CN202310356382A CN116661852B CN 116661852 B CN116661852 B CN 116661852B CN 202310356382 A CN202310356382 A CN 202310356382A CN 116661852 B CN116661852 B CN 116661852B
- Authority
- CN
- China
- Prior art keywords
- code
- graph
- embedded vector
- embedded
- dependency graph
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 46
- 239000013598 vector Substances 0.000 claims abstract description 104
- 238000012549 training Methods 0.000 claims abstract description 48
- 238000012545 processing Methods 0.000 claims abstract description 12
- 239000012634 fragment Substances 0.000 claims description 36
- 238000013528 artificial neural network Methods 0.000 claims description 30
- 238000011176 pooling Methods 0.000 claims description 19
- 230000008569 process Effects 0.000 claims description 15
- 230000006870 function Effects 0.000 claims description 10
- 238000004458 analytical method Methods 0.000 claims description 9
- 239000011159 matrix material Substances 0.000 claims description 8
- 230000002776 aggregation Effects 0.000 claims description 3
- 238000004220 aggregation Methods 0.000 claims description 3
- 238000005206 flow analysis Methods 0.000 claims description 3
- 230000011218 segmentation Effects 0.000 claims description 2
- 239000010410 layer Substances 0.000 description 21
- 230000000694 effects Effects 0.000 description 9
- 239000013078 crystal Substances 0.000 description 7
- 238000010586 diagram Methods 0.000 description 6
- 230000006872 improvement Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 4
- 238000005096 rolling process Methods 0.000 description 4
- 230000004913 activation Effects 0.000 description 3
- 230000004931 aggregating effect Effects 0.000 description 3
- 230000001419 dependent effect Effects 0.000 description 3
- 238000011156 evaluation Methods 0.000 description 3
- 238000002474 experimental method Methods 0.000 description 3
- 238000003058 natural language processing Methods 0.000 description 3
- 239000002356 single layer Substances 0.000 description 3
- 238000012360 testing method Methods 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000013135 deep learning Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000018109 developmental process Effects 0.000 description 2
- 238000000605 extraction Methods 0.000 description 2
- 238000005295 random walk Methods 0.000 description 2
- 239000013589 supplement Substances 0.000 description 2
- WYTGDNHDOZPMIW-RCBQFDQVSA-N alstonine Natural products C1=CC2=C3C=CC=CC3=NC2=C2N1C[C@H]1[C@H](C)OC=C(C(=O)OC)[C@H]1C2 WYTGDNHDOZPMIW-RCBQFDQVSA-N 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000002457 bidirectional effect Effects 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000012512 characterization method Methods 0.000 description 1
- 230000000052 comparative effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000004927 fusion Effects 0.000 description 1
- 230000007787 long-term memory Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000001537 neural effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000009486 pneumatic dry granulation Methods 0.000 description 1
- 238000013515 script Methods 0.000 description 1
- 230000006403 short-term memory Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000003860 storage Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000001502 supplementing effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
-
- 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/042—Knowledge-based neural networks; Logical representations of neural 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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Biophysics (AREA)
- Evolutionary Computation (AREA)
- Artificial Intelligence (AREA)
- Biomedical Technology (AREA)
- Health & Medical Sciences (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Life Sciences & Earth Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于程序依赖图的代码搜索方法,包括以下步骤:构建代码搜索模型,将代码片段输入到代码搜索模型中;基于token序列获取所述代码片段的文本信息嵌入向量,基于程序依赖图获取所述代码片段的结构信息嵌入向量,对文本信息和结构信息的嵌入向量进行处理后,获得代码片段的嵌入向量;基于ALBERT预训练模型,获得代码片段相应注释的嵌入向量;基于余弦函数获取代码片段的嵌入向量和代码片段相应注释的嵌入向量的相似度,对代码搜索模型进行训练;基于训练后的代码搜索模型,获得代码搜索结果。本发明的代码搜索模型基于原程序依赖图,有效减小了代码图的规模,增强了代码数据流的表达,使获得的结构语义更完整。
Description
技术领域
本发明属于代码搜索技术领域,是自然语言处理和软件工程交叉领域的一个重要分支,特别是涉及一种基于程序依赖图的代码搜索方法。
背景技术
代码搜索是软件发展中最常见的活动之一,代码搜索是代码复用的关键,也是智能化软件开发各项应用得以运行的基础。
现有的代码搜索技术大致分为两个类别:1)在查询和代码片段之间使用关键字匹配技术的早期传统方法,例如基于信息检索(IR)的代码搜索和基于查询重构的代码搜索;2)将查询和代码片段编码为嵌入表示以捕获语义信息的深度学习方法。早期的传统方法只是将查询和代码片段视为纯文本,仅通过查看匹配的关键字来检索与查询相关的代码片段,这种方式无法捕获查询语句和代码片段的深层语义,所以搜索性能不佳。并且基于IR的传统代码搜索技术在语义理解上不准确,不能从实际搜索需求出发,对用户的查询输入也有所限制。
代码是结构化的,源代码数据相比于自然语言文本更易构建图表示形式,因此结合图结构的代码搜索模型有着较好的前景。研究人员利用抽象语法树AST和其相应变体来表示代码片段潜在的结构语义。例如林泽琦等人将Java代码构建成一个DOM结构的抽象语法树(AST),用LINE算法嵌入代码图,并通过代码子图的搜索来匹配文本查询的节点。Liu等人基于具有不同节点(终端/非终端节点)和不同边类型的AST生成代码图,Chen等人提出的deGraphCS模型通过一种基于变量的神经代码搜索流图表征程序的结构信息,以及Wan等人提出的MMAN模型全面考虑了源代码的结构信息,引入长短时记忆网络的变体Tree-LSTM嵌入抽象语法树(AST)的表示和门控图神经网络(GGNN)嵌入控制流图CFG的表示。虽然这些方法取得了不错的代码搜索效果,但是由于抽象语法树中缺乏数据流和控制流信息,没有能完整表达代码片段的结构语义。
在代码搜索任务中,大多数方法基于抽象语法树提取源代码的结构信息,由于抽象语法树的节点过于细粒度且AST中缺乏数据流信息和控制流信息,直接应用抽象语法树表达程序的结构语义不完整而且不准确。为了应对上述挑战,亟需提出一种基于程序依赖图的代码搜索方法。
发明内容
本发明的目的是提供一种基于程序依赖图的代码搜索方法,该方法基于程序依赖图构建代码图,定义依赖关系的规则标记程序中的控制依赖和数据依赖边并补充节点类型,有效减小了代码图的规模,增强了代码数据流的表达;该方法提出的图节点初始化模块应用transformer的编码器捕获程序语句的上下文信息,以及结合自注意力分层池化的图神经网络模块:分层更新图节点信息汇总得到的Graph-level图嵌入向量表征了代码片段的结构特征,从而实现了对代码片段结构语义的完整提取;另外,该方法使用预训练的ALBERT模型作为自然语言句子的编码器,大量语料库的预训练帮助模型准确理解查询文本的意图,以解决上述现有技术存在的问题。
为实现上述目的,本发明提供了一种基于程序依赖图的代码搜索方法,包括以下步骤:
构建代码搜索模型,将代码片段输入到所述代码搜索模型中;
基于token序列获取所述代码片段的文本信息嵌入向量,基于程序依赖图获取所述代码片段的结构信息嵌入向量,对所述文本信息和结构信息的嵌入向量进行处理后,获得所述代码片段的嵌入向量;
基于ALBERT预训练模型,获得所述代码片段相应注释的嵌入向量;
基于余弦函数获取所述代码片段的嵌入向量和代码片段相应注释的嵌入向量的相似度,对所述代码搜索模型进行训练;
基于训练后的代码搜索模型,获得代码搜索结果。
可选地,获取所述代码片段的文本信息嵌入向量的过程包括:基于token序列对每个代码片段进行分词处理,获得相应的代码令牌序列;将所述代码令牌序列通过多层感知器嵌入,获得单个令牌的嵌入矢量;通过最大池化对所述单个令牌的嵌入矢量进行聚合处理,获得代码片段token序列的嵌入向量。
可选地,获取所述代码片段的结构信息嵌入向量的过程包括:对所述代码片段进行控制流分析和控制依存分析,获得控制依赖图;对所述代码片段进行数据依赖分析,获得数据依赖图,基于所述控制依赖图和数据依赖图获得程序依赖图;对所述程序依赖图的节点进行初始化编码,输入到图神经网络中;所述图神经网络对程序依赖图的所有节点进行表示学习,并采用分层池化的方式渐进地层次化更新节点的特征信息,进而聚合所有节点的特征信息,获得所述程序依赖图的嵌入向量。
可选地,所述程序依赖图包括若干个节点类型和边类型,所述边类型包括控制依赖边和数据依赖边,所述控制依赖边包括Child边、Next Statement边和Judge边。
可选地,对所述文本信息和结构信息的嵌入向量表示进行处理的过程包括:将所述文本信息和结构信息的嵌入向量进行合并连接,获得代码特征矩阵;将所述代码特征矩阵输入到dense层神经网络进行处理,获得所述代码片段的嵌入向量。
可选地,获得所述代码片段的相应注释的嵌入向量的过程包括:基于构建的代码搜索模型采用增量训练对ALBERT预训练模型进行微调,将所述代码片段的相应注释输入到微调后的ALBERT预训练模型中进行编码嵌入,获得所述代码片段相应注释的嵌入向量。
可选地,对ALBERT预训练模型进行微调的过程包括:获取ALBERT预训练模型的训练数据集,对所述训练数据集中代码片段的注释文档字符串进行n-gram屏蔽,并通过句序预测对所述ALBERT预训练模型进行训练,获得微调后的ALBERT预训练模型。
可选地,对所述代码搜索模型进行训练的过程包括:为每个代码片段的嵌入向量提供相应注释的嵌入向量和一个随机选择的注释嵌入向量,分别获取所述代码片段的嵌入向量与相应注释的嵌入向量的第一相似性,以及所述代码片段的嵌入向量与随机选择的注释嵌入向量的第二相似性;基于所述第一相似性和第二相似性对所述代码搜索模型进行训练,当所述第一相似性最大,所述第二相似性最小时,获得训练后的代码搜索模型。
可选地,基于训练后的代码搜索模型,获得代码搜索结果的过程包括:在所述训练后的代码搜索模型中输入原始代码片段以及对应的嵌入向量,并创建索引;基于微调后的ALBERT预训练模型获取原始代码片段相应注释的嵌入向量,进而基于矢量间的余弦相似度获取与所述原始代码片段相应注释的嵌入向量最邻近的原始代码片段的嵌入向量,并进行排名,最后基于原始代码片段的嵌入向量的索引值提取相应的代码片段信息,获得代码搜索结果。
本发明的技术效果为:
(1)现有代码搜索技术基于抽象语法树的图表示方法过于细粒度且缺乏数据流和控制流信息,不能完整表达代码片段的结构语义,本发明的代码搜索模型基于原程序依赖图,定义依赖关系的规则标记程序中的控制依赖和数据依赖边并补充了节点类型,有效减小了代码图的规模,增强了代码数据流的表达,比抽象语法树表达的结构语义更完整。
(2)本发明的代码搜索模型提出了图节点初始化模块,有利于初始化嵌入图的节点内容;本发明的代码搜索模型还提出了结合自注意力分层池化的图神经网络模块,得到的图嵌入向量完整表达了代码片段的结构语义,从而实现了对代码片段结构语义的完整提取。
(3)与现有工作相比,本发明的代码搜索模型应用微调后的ALBERT预训练模型作为自然语言句子的编码器,预训练帮助句子得到更精确的文本矢量表示,能够提取到查询文本的上下文语义。
附图说明
构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本发明实施例中的基于程序依赖图的代码搜索方法流程图;
图2为本发明实施例中的代码搜索模型的结构示意图;
图3为本发明实施例中的程序依赖图的构成示意图;
图4为本发明实施例中的代码片段Sa和Sb的示意图;
图5为本发明实施例中的代码片段Sa和Sb的程序依赖图;
图6为本发明实施例中的基于程序依赖图的代码搜索简易流程图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
实施例一
如图1所示,本实施例中提供一种基于程序依赖图的代码搜索方法,本实施例将代码搜索方法称为AdGraphCS(Advanced Graph-based Code Search),AdGraphCS将代码片段的表示分为token序列和程序依赖图。现有代码搜索技术基于抽象语法树的图表示方法过于细粒度且缺乏数据流和控制流信息,不能完整表达代码片段的结构语义,AdGraphCS基于原程序依赖图,定义依赖关系的规则标记程序中的控制依赖和数据依赖边并补充了节点类型,比抽象语法树表达的结构语义更完整。AdGraphCS提出了精心设计的图节点初始化模块,应用transformer的encoder编码程序依赖图的节点,有利于初始化嵌入图的节点内容;AdGraphCS还提出了结合自注意力分层池化的图神经网络模块,得到的图嵌入向量完整表达了代码片段的结构语义。与现有工作相比,AdGraphCS应用微调后的ALBERT模型作为自然语言句子的编码器,预训练帮助句子得到更精确的文本矢量表示,能够提取到查询文本的上下文语义。
如图2所示,为AdGraphCS模型的简要架构,AdGraphCS模型的设计思路和实施细节包括以下步骤:
代码片段的嵌入
代码片段的输入分为文本信息(lexical information)和结构信息(structualinformation)。代码片段的文本信息由token序列表示,通过正则表达式将代码片段提取为表示长度为lA的没有特殊符号的代码token序列。用驼峰命名法或蛇形命名法书写的每个token都应被切分为原始单词。例如令牌itemCount或item_count应分为两个单独的词:item和count。对于令牌,由于它们在源代码中没有严格的顺序,因此它们只是通过多层感知器(MLP)嵌入,即传统的全连接层。
其中WA是MLP中可训练参数的矩阵,hi是单个令牌的嵌入矢量,通过最大池化操作聚合得到代码片段token序列的嵌入表示vA。
代码片段的结构信息嵌入包括三个阶段:1)对代码片段进行数据流和控制流分析,生成程序依赖图;2)对图节点初始化编码,作为图神经网络的输入;3)使用图神经网络对图结构进行表示学习,聚合所有节点特征,得到程序依赖图的Graph-level嵌入向量。最后,将代码片段的文本信息与结构信息的矢量表示vA、vG连接成一个合并的代码特征矩阵M。
M=vA⊕vG (公式3)
其中vA代表token序列的嵌入矢量,vG代表程序依赖图PDG的嵌入矢量。将合并的代码特征矩阵M输入传递到dense层神经网络,最后输出一个代码片段的嵌入矢量vc∈Rd。
代码片段相应注释(Query)的嵌入
在代码搜索模型训练时将代码片段的注释视作搜索的查询,因此注释的嵌入十分关键。作为BERT的精简版,ALBERT拥有更少的参数和更快的训练速度,同时不牺牲效果。由于代码片段相应注释docstring也是英文的自然语言文本,使用预训练的模型可以节省训练时间和硬件资源,并根据数十亿句子的上下文得出更精确的矢量表示。虽然ALBERT的训练数据集相当庞大,但其语料库主要源于书籍和英文维基百科。用于描述代码片段的注释句子与这些语料库中的句子略有不同,因为前者包含与编程语言相关的术语。例如"callback"在程序注释中指回调函数,与一般文本中的"callback"表示回电话有着完全不同的内涵。为了帮助ALBERT更好地理解代码片段相应注释的语境,AdGraphCS使用增量训练对ALBERT进行了微调。具体来说,对训练数据集中代码片段的注释文档字符串进行了n-gram屏蔽,并通过句序预测进行训练,ALBERT团队了提供可定制脚本来促进这个微调过程。这个微调后的ALBERT模型将作为查询句子的编码器,将程序注释送入后即得到代码片段相应注释的向量表示vq。
模型训练
在得到代码片段的嵌入表示vc和相应注释的嵌入表示vq后,代码片段和查询语句之间的语义相似性是根据其在嵌入空间中的余弦距离计算的,定义如下:
在代码搜索任务中,二者的相似度越高,代码与查询的相关性就越大。模型优化的任务是使代码嵌入vc尽可能接近共享矢量空间中相应的注释字符串嵌入vq。在训练阶段,为每个vc提供相应的文档字符串嵌入和一个随机选择的负文档字符串嵌入/>模型的目标是最大化vc和/>之间的相似性,最小化vc和/>之间的相似性。因此,训练的目标是最小化公式5中的损失值L(θ)。其中θ表示模型的可学习参数,β是margin损失函数的边际值,遵循其他工作的惯例,相应设置为0.5。
如图6所示,在获得训练好的AdGraphCS模型后,本实施例为即将到来的搜索任务构建了一个代码库。首先存储原始代码片段和对应的vc,并为它们创建索引。搜索时,AdGraphCS使用微调后的ALBERT作为编码器将查询语句嵌入矢量vq。由于语义相似性是根据矢量之间的余弦相似度来衡量的,AdGraphCS使用Nmslib工具在矢量空间中搜索到vq最邻近的vc并返回排名top-k个。最后,本实施例可以通过返回的vc的索引值提取相应代码片段的详细信息作为搜索结果。
程序依赖图的定义
尽管抽象语法树AST可以反映源代码的语法信息,但它缺乏数据流信息和控制流信息,表达的结构语义不完整。本实施例提出应用程序依赖图PDG(Program DependencyGraph)来提取代码片段的结构信息。常见的多种代码表达形式还包括源码序列、AST、控制流图CFG(Control Flow Graph)、代码属性图等,与它们相比,程序依赖图的节点描述了程序语句,边描述了其关系,同时删减了对程序执行不产生影响的部分,蕴含关键的程序结构语义,并能有效还原程序的执行过程。另外抽象语法树是过分细粒度的,图节点很多,而程序依赖图的节点不仅在语句层面保留了抽象语法树的语法信息,与抽象语法树相比还减小了代码图的规模,边类型蕴含了控制依赖和数据依赖关系。
程序依赖图是用途最广的有向代码图之一,AdGraphCS是首次将程序依赖图应用在代码搜索任务中的模型。如图3所示,程序依赖图由数据依赖图和控制依赖图构成,数据依赖图定义了数据之间的约束关系,控制依赖图定义了语句执行情况的约束关系。直观地定义如下:若Gc=(V,C),Gd=(V,D)分别为程序P的控制依赖图和数据依赖图,C表示Gc中的控制依赖关系,D表示Gd中的数据依赖关系。则程序依赖图G=(V,E),其中E=C∪D∪X,X表示程序中的其他依赖关系。
程序依赖图的节点类型和边类型
程序依赖图通过严格定义的数据约束和控制约束为程序的每个函数构建一个有向图。在程序依赖图中,节点代表程序语句,边代表程序语句之间的相互依赖关系。现存的代码属性图原型工具Joern为程序片段生成PDG,但是只标记了两种类型的边”reaches”和”controls”表示数据依赖和控制依赖,另外节点的类型也只标记了有限的几种,这对于代码结构语义的表达是不够的。因此,本实施例的AdGraphCS定义了一系列规则以标记程序依赖图中边的类型,为补充节点类型和边类型提供了明确的指导方针。PDG中的每个顶点有且仅有一种类型,顶点表示程序的每行语句,包括函数或变量的声明、条件判断、跳转语句等。对于节点来说,标注了12种详细的语句节点类型如表1所示,并列出了每个节点类型的描述,该表同时也说明了源代码是如何分解并映射到程序依赖图的顶点的。
表1
根据节点的类型和定义的规则来判断节点之间边的类型,即判断程序语句之间的数据和控制依赖关系,进一步定义的控制依赖边和数据依赖边的连接规则具体如下:
定义1:对于控制依赖边,控制依赖性定义了语句执行的约束关系,它可以反映出语法、执行顺序和控制信息。本实施例定义了三种类型的控制依赖边:Child边用于连接来自抽象语法树AST中的父节点和子节点,并从父节点指向子节点,这可以反映出句法层面上语句的控制依赖性;Next Statement边根据上下文将块内的语句连接起来,表示语句可能的执行顺序;Judge边表示在抽象语法树中三种常见的控制语句If Statement,ForStatement,While Statement,表示需要判断语句转向的控制依赖。
定义2:对于数据依赖边,数据依赖性定义了语句之间变量的约束关系。为了挖掘数据依赖关系,必须记录所有变量的所有访问。变量V从语句S1到S2的数据依赖规则可以描述为如下:变量V在语句S1中被定义或赋值,语句S2中使用了变量V,S2的作用域在S1的作用域内。如果S1和S2具有相同的作用域级别,那么从语句S1到S2存在一条Data边。
本实施例基于设计的控制依赖和数据依赖规则,为图2中的代码片段Sa、Sb构建了程序依赖图并分类标记节点间依赖关系,它们语义相同但采用不同的循环结构。潜在的代码结构语义通过边之间的依赖关系表达,图4所示为代码片段Sa和Sb,如图5所示即为标记后的程序依赖图。更重要的是,根据所提方法得到的Sa、Sb的程序依赖图的图结构是相同的,不会像抽象语法树中由于循环结构的不同出现很多不同分支的语法节点。另外与抽象语法树表示代码片段相比,PDG图表示减小了代码图的规模,并且对于结构不同语义相同的代码片段能够表达相似的语义,所以基于程序依赖图表示代码图有效地表达了代码片段的结构语义。
程序依赖图的表示学习
对程序依赖图的嵌入学习——图神经网络模块。代码片段的结构信息嵌入包括三个阶段:1)构建PDG;2)将PDG的每个图节点包含的信息输入设计的初始化模块,应用transformer的编码器嵌入每个节点包含的程序语句内容;3)将初始化的PDG图输入精心设计的图神经网络模块,结合自注意力分层池化的图神经网络提取节点特征后进一步聚合所有节点特征,得到一个PDG图的嵌入向量vG。
程序依赖图的生成
现存的原型工具Joern被设计用于为C语言程序生成程序依赖图,本实施例应用静态的Java字节码分析器JavaPDG生成代码片段的程序依赖图,它能够展示源代码的多种图形式:程序依赖图、控制流图和系统调用图等。对于Python语言来说没有成熟的开源工具可以直接生成程序依赖图,因此依据程序依赖图的定义来生成python代码片段的PDG。核心操作如下:①控制流分析:每个方法的字节码被转化为控制流图,这一步使得非结构化的字节码控制流变得明确;②控制依存分析:为每个CFG计算一个支配树(DT),一个DT定义了流程图中的拓扑顺序,DT和CFG构成了控制依赖图(CDG);③数据依赖分析:每个方法的数据依赖图(DDG)通过跟踪CFG上的数据流来计算,数据流由可达定义和向上暴露使用分析来确定。
得到Java语言和Python语言的程序依赖图后,应用AdGraphCS定义的规则为其标记12种节点类型和4种依赖关系类型,并将解析结果以json文件形式导出,将节点和边分别保存至两个文件中,节点信息包含id、节点类型和节点的代码内容、所属函数、所处位置等字段信息;边信息包含连接的起始节点id和边类型等字段信息。
构造节点的初始化特征向量
PDG中节点V的初始化特征向量表示考虑两类信息:一类是节点中对应代码片段的一条程序语句,另一类是对该条语句的类型说明。对于节点类型嵌入采用word2vec技术,对标记生成的12种类型的节点,编码得到256维的节点类型向量,即为Tv=word2vec(V.type)。另一方面,每个节点包含的代码内容是通过transformer的Encoder进行编码的,因为它保留了每个节点中源代码的语义信息,比节点类型包含的程序上下文信息更复杂。通过transformer学习的句子语义嵌入已被证明能成功应用在各种下游自然语言处理任务中,并且transformer的编码器比word2vec词嵌入方法能提供更好的语境化嵌入。使用transformer的encoder为每个节点包含的程序代码语句训练生成了一个512维的嵌入向量,即为Cv=transformer(V.code)。然后将节点类型的嵌入向量和节点内容的嵌入向量前后拼接起来作为每个节点的初始化向量表示,即为Xv=concat(Tv,Cv)。最后,在程序依赖图PDG中有4种类型的边,标记了程序的数据依赖关系和控制依赖关系,并为每条边应用多层感知器MLP嵌入得到每种边类型的向量ei,j。
图嵌入模块
图卷积网络
图嵌入是一种将图的节点和边的特征映射到低维矢量空间的方法。由于图结构的复杂性,图嵌入的一个主要挑战是如何尽可能完整地保存网络拓扑结构和节点信息,以便在下游任务如深度学习中取得更好的性能。DeepWalk是一种典型的图嵌入方法,它通过截断的随机行走学习图中节点的部分表示。Node2vec是DeepWalk的一个扩展,它使用skip-gram来调整随机行走的权重。图卷积网络(GCN)将卷积操作从传统数据(如图像)扩展到图数据。其核心思想是对每个节点周围的卷积核进行一阶近似。上述模型一般强调的是节点的特征,而不考虑节点之间的边缘关系特征。
在本实施例提出的PDG中,需要关注数据依赖关系和控制依赖关系,边缘在表达程序语义方面发挥着重要作用。图上信息传播模型纳入了边缘信息的图神经网络最著名的是关系图卷积网络RGCN,其实门控图神经网络GGNN和晶体图卷积神经网络CGCNN等也可以用来对有边缘属性的图进行嵌入。关系图卷积网络是专门为处理现实知识库的高度多关系数据而开发的,门控图神经网络是一种基于门控递归单元(GRU)的经典空间域messagepassing的模型,晶体图卷积神经网络框架是为有多条边的特殊晶体图提出来的。本实施例的图嵌入模块选用了晶体图卷积网络CGCNN,原因如下:一、晶体图卷积网络比门控图神经网络GGNN更具有扩展性,因为后者需要同时计算和存储一个节点的多个状态,而在CGCNN中,每个节点的向量在每层都被计算和立即更新一次。二、使用晶体图卷积网络在本模型中相比使用其他卷积图卷积网络效率更高,如RGCN。因为RGCN对每种类型的连接重复计算相邻节点的更新,而CGCNN对所有类型的相邻边和节点只需要一个聚合步骤。
具体来说,在整个图嵌入模块的每一层L,首先根据CGCNN模块的如下公式更新节点的表征:
其中和/>表示节点i在L层的向量和更新得到在L+1层的向量,N(i)表示节点i的所有邻居节点的集合,σ表示Sigmoid激活函数,g表示Softplus激活函数,W1 (L)、W2 (L)、都是可学习的参数矩阵。
分层池化
另外,在第L层的CGCNN模块之后,没有直接传递给下一层的CGCNN模块,而是采用分层池化的方式渐进地层次化更新图上节点的信息。因此设置了一个基于自注意力机制的分层池化模块Self-Attention Graph Pooling(SAG),此方法充分考虑了节点的特征和图的拓扑结构,还能以相对较少的参数,以端到端的方式学习图的层次表示。当节点向量被传递给SAG模块,该模块会放弃当前图中的一半节点,留下的节点将被传递到下一层。这样做的好处是在分层池化的过程中能够保留对代码片段结构信息关键的节点。并且图嵌入模块在每层结束时由soft attention读出层得到当前层的图表示向量,所有层的表示一起拼接形成最终的图向量,即PDG的图向量表示vG。
在第L层,自注意力分层池化模块Self-Attention Graph Pooling保留上一层的节点的一个子集,并通过原始的图卷积算子计算得到节点的注意力分数,其中θ1 (L)和是可学习的权重。
然后将该注意力得分应用于top-k子集中的节点,其他节点和它们的边则从当前图中删除:
在分层池化模块之后,应用soft-attention读出层输出得到第L层的图级表示,其中MLP1和MLP2表示两个不同的多层感知器,都有相应的可学习权重和标准ReLU激活函数。
最终,所有层的图级表示输出相加得到整个程序依赖图的Graph-level向量表示:vG即代码片段的结构信息嵌入矢量。
实验结果与分析
与基线模型的对比
表2分别显示了AdGraphCS与7个基线模型在提取的Java数据集和Python数据集上的对比实验结果,SR@1、SR@5和SR@10分别显示当k为1、5和10时所有查询的平均SuccessRate@k结果。从表中3可以计算出,在Java数据集上,对于SR@k指标,AdGraphCS对DeepCS的改善率分别为31.8%、31.4%和29.6%,对MMAN的改善率分别为22.0%、24.1%和29.5%,对GraphSearchNet的改善率分别为10.7%、2.5%和1.9%;在MRR指标上,AdGraphCS对DeepCS、MMAN和GraphSearchNet的改进分别为29.5%、19.2%和6.7%。AdGraphCS在Java数据集上的表现远远超过了7个基线模型,SR@1指标和MRR指标值对比GraphSearchNet提升了5%左右,说明对Java代码片段搜索时首个返回的结果正确率更高,总的平均倒数排名也更符合搜索推荐的结果要求,每个返回的结果都在正确的排名上按次序表示与查询的相关性。
同样的在Python数据集上,对于SR@1、SR@5和SR@10,AdGraphCS对DeepCS的改善率达到30%,对MMAN的改善率达到20%,对于MRR指标,AdGraphCS对DeepCS、MMAN的改进分别为36.8%、27.3%。与基线模型GraphSearchNet相比,AdGraphCS模型在SR@5和SR@10指标上表现相当,这可能是由于Python语言代码片段的程序依赖图不是由成熟的工具生成的,图中存在一些冗余的节点,可能边类型的标记有重复。但AdGraphCS在SR@1和MRR指标值上是有一定的提升的。总的来说,在同等实验设置下,本实施例的AdGraphCS模型在四个评价指标方面始终实现更高的数值,也就是表明所提的AdGraphCS有更好的代码搜索性能。
表2
程序依赖图PDG的贡献
本实施例通过实验验证了AdGraphCS的关键贡献程序依赖图PDG的有效性。表3比较了代码片段的不同结构信息对AdGraphCS性能的影响。表第一行AST表示只提取代码片段的抽象语法树结构信息,表第二行CFG表示只提取代码片段的控制流图结构信息,表第三行PDG表示只提取代码片段的优化程序依赖图结构信息,其余模块保持一致。根据实验结果,第三行结果仅提取程序依赖图时的四个评价指标值均好于第一行和第二行。这说明即使在没有融合文本信息token序列的情况下,只提取优化程序依赖图PDG的结构信息,模型的搜索效果也优于抽象语法树和控制流图表征结构信息的情况。另外还发现,表第三行PDG的指标数据略高于表第四行融合三种信息的MMAN模型的所有指标值,这证明本文提取的程序依赖图结构信息对代码搜索任务是十分有效的,已经超越了MMAN融合token+AST+CFG的表现效果。
表3
根据表第五行的黑体数据,当代码片段融合提出的文本信息和结构信息(token+PDG)时,AdGraphCS在两个测试集上的SR@1、SR@5、SR@10和MRR指标值最高,AdGraphCS模型的性能达到最佳。一方面,说明在代码搜索任务中代码片段的文本信息和结构信息结合的情况下,模型能够提取到代码片段的完整语义。另一方面,代码片段的结构信息通过程序依赖图来表征是有效的,因为代码片段中的控制依赖关系和数据依赖关系很大程度上决定了程序的结构,而抽象语法树或控制流图虽然表征了程序的语法信息,但不能提取全面的结构语义。
图嵌入模块的贡献
对于程序依赖图,本实施例提出的图嵌入模块包括两个部分:图节点初始化模块和结合自注意力分层池化的图神经网络模块。AdGraphCS提出的图节点初始化模块对节点代表的每条程序语句内容使用transformer的encoder高效地初始化嵌入;另外AdGraphCS还提出了结合自注意力分层池化的图神经网络模块,能够提取到程序依赖图的结构特征,完整表达了代码片段的结构语义。为了验证图节点初始化模块和结合分层池化的图神经网络模块的有效性,本实施例将图嵌入模块分别替换为word2vec初始化嵌入+单层的关系图卷积网络、word2vec初始化嵌入+单层的门控图神经网络进行实验,记为变体RGCN和GGNN。
表4为实验数据展示,其中RGCN和GGNN在两个数据集上的评价指标值均低于本文的AdGraphCS模型,证明提出的图嵌入模块在代码搜索任务中对于程序依赖图的嵌入比简单的word2vec+单层图神经网络有效。另外与GraphSearchNet模型相比,变体RGCN和GGNN的四个指标值略低,说明提取的程序依赖图当与设计的图嵌入模块相结合才能发挥出更好的代码搜索性能。其中还观察到变体RGCN的实验数据略好于变体GGNN,这与结构不同的图应选用恰当的图神经网络的观察是相吻合的:对于有多种边类型的程序依赖图来说,应用关系图卷积网络或者晶体图卷积网络效果更好,而对于抽象语法树构建的代码图来说,应用门控图神经网络或双向门控图神经网络效果更佳。
表4
ALBERT预训练的贡献
预训练模型BERT在自然语言处理的各种下游任务中取得了巨大的进展,在代码搜索任务中也有一定的效果。本实施例采用ALBERT嵌入注释句子,与BERT相比减少了参数量也保证了模型的效果。表5对比了基线模型MMAN和AdGraphCS在Java数据集上当查询句子的编码器分别为LSTM和ALBERT的情况。
对比表5中第一行和第二行的数据,当把MMAN中的Query Encoder由原作者设置的LSTM换成ALBERT后,MMAN在测试集上的SR@1、SR@5、SR@10和MRR指标值都提升了4%左右。对比表5中第三行和第四行的数据,当把AdGraphCS中的Query Encoder由本实施例设定的ALBERT换成LSTM后,AdGraphCS在测试集上的SR@1、SR@5、SR@10和MRR指标值下降了5%左右。所以微调过的预训练模型ALBERT对代码搜索模型的性能是有一定贡献的,因为与LSTM相比,它经过大型语料库的训练能够捕捉到更加准确的句子语义,即便是模糊的查询也能理解其语义并嵌入到向量空间中合适的位置。
表5
以上所述,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。
Claims (4)
1.一种基于程序依赖图的代码搜索方法,其特征在于,包括以下步骤:
构建代码搜索模型,将代码片段输入到所述代码搜索模型中;
基于token序列获取所述代码片段的文本信息嵌入向量,基于程序依赖图获取所述代码片段的结构信息嵌入向量,对所述文本信息和结构信息的嵌入向量进行处理后,获得所述代码片段的嵌入向量;
基于ALBERT预训练模型,获得所述代码片段相应注释的嵌入向量;
基于余弦函数获取所述代码片段的嵌入向量和代码片段相应注释的嵌入向量的相似度,对所述代码搜索模型进行训练;
基于训练后的代码搜索模型,获得代码搜索结果;
获取所述代码片段的结构信息嵌入向量的过程包括:对所述代码片段进行控制流分析和控制依存分析,获得控制依赖图;对所述代码片段进行数据依赖分析,获得数据依赖图,基于所述控制依赖图和数据依赖图获得程序依赖图;对所述程序依赖图的节点进行初始化编码,输入到图神经网络中;所述图神经网络对程序依赖图的所有节点进行表示学习,并采用分层池化的方式渐进地层次化更新节点的特征信息,进而聚合所有节点的特征信息,获得所述程序依赖图的嵌入向量;
所述程序依赖图包括若干个节点类型和边类型,所述边类型包括控制依赖边和数据依赖边,所述控制依赖边包括Child边、Next Statement边和Judge边;
对所述文本信息和结构信息的嵌入向量表示进行处理的过程包括:将所述文本信息和结构信息的嵌入向量进行合并连接,获得代码特征矩阵;将所述代码特征矩阵输入到dense层神经网络进行处理,获得所述代码片段的嵌入向量;
对所述代码搜索模型进行训练的过程包括:为每个代码片段的嵌入向量提供相应注释的嵌入向量和一个随机选择的注释嵌入向量,分别获取所述代码片段的嵌入向量与相应注释的嵌入向量的第一相似性,以及所述代码片段的嵌入向量与随机选择的注释嵌入向量的第二相似性;基于所述第一相似性和第二相似性对所述代码搜索模型进行训练,当所述第一相似性最大,所述第二相似性最小时,获得训练后的代码搜索模型;
基于训练后的代码搜索模型,获得代码搜索结果的过程包括:在所述训练后的代码搜索模型中输入原始代码片段以及对应的嵌入向量,并创建索引;基于微调后的ALBERT预训练模型获取原始代码片段相应注释的嵌入向量,进而基于矢量间的余弦相似度获取与所述原始代码片段相应注释的嵌入向量最邻近的原始代码片段的嵌入向量,并进行排名,最后基于原始代码片段的嵌入向量的索引值提取相应的代码片段信息,获得代码搜索结果。
2.根据权利要求1所述的基于程序依赖图的代码搜索方法,其特征在于,
获取所述代码片段的文本信息嵌入向量的过程包括:基于token序列对每个代码片段进行分词处理,获得相应的代码令牌序列;将所述代码令牌序列通过多层感知器嵌入,获得单个令牌的嵌入矢量;通过最大池化对所述单个令牌的嵌入矢量进行聚合处理,获得代码片段token序列的嵌入向量。
3.根据权利要求1所述的基于程序依赖图的代码搜索方法,其特征在于,
获得所述代码片段的相应注释的嵌入向量的过程包括:基于构建的代码搜索模型采用增量训练对ALBERT预训练模型进行微调,将所述代码片段的相应注释输入到微调后的ALBERT预训练模型中进行编码嵌入,获得所述代码片段相应注释的嵌入向量。
4.根据权利要求3所述的基于程序依赖图的代码搜索方法,其特征在于,
对ALBERT预训练模型进行微调的过程包括:获取ALBERT预训练模型的训练数据集,对所述训练数据集中代码片段的注释文档字符串进行n-gram屏蔽,并通过句序预测对所述ALBERT预训练模型进行训练,获得微调后的ALBERT预训练模型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310356382.0A CN116661852B (zh) | 2023-04-06 | 2023-04-06 | 一种基于程序依赖图的代码搜索方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310356382.0A CN116661852B (zh) | 2023-04-06 | 2023-04-06 | 一种基于程序依赖图的代码搜索方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116661852A CN116661852A (zh) | 2023-08-29 |
CN116661852B true CN116661852B (zh) | 2023-12-08 |
Family
ID=87710641
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310356382.0A Active CN116661852B (zh) | 2023-04-06 | 2023-04-06 | 一种基于程序依赖图的代码搜索方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116661852B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117421392B (zh) * | 2023-12-15 | 2024-03-08 | 武汉大学 | 一种基于词级对齐的代码搜索方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112507065A (zh) * | 2020-11-18 | 2021-03-16 | 电子科技大学 | 一种基于注释语义信息的代码搜索方法 |
CN112733156A (zh) * | 2021-01-29 | 2021-04-30 | 中国人民解放军国防科技大学 | 基于代码属性图的软件脆弱性智能检测方法、系统及介质 |
CN113420296A (zh) * | 2021-07-08 | 2021-09-21 | 国网甘肃省电力公司电力科学研究院 | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 |
CN115268869A (zh) * | 2022-07-26 | 2022-11-01 | 东北大学 | 一种基于图序列化的代码搜索系统及方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030041315A1 (en) * | 2001-08-21 | 2003-02-27 | International Business Machines Corporation | Debugger with automatic detection of control points influencing program behavior |
CN115935372A (zh) * | 2022-11-23 | 2023-04-07 | 杭州电子科技大学 | 一种基于图嵌入和双向门控图神经网络的漏洞检测方法 |
-
2023
- 2023-04-06 CN CN202310356382.0A patent/CN116661852B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112507065A (zh) * | 2020-11-18 | 2021-03-16 | 电子科技大学 | 一种基于注释语义信息的代码搜索方法 |
CN112733156A (zh) * | 2021-01-29 | 2021-04-30 | 中国人民解放军国防科技大学 | 基于代码属性图的软件脆弱性智能检测方法、系统及介质 |
CN113420296A (zh) * | 2021-07-08 | 2021-09-21 | 国网甘肃省电力公司电力科学研究院 | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 |
CN115268869A (zh) * | 2022-07-26 | 2022-11-01 | 东北大学 | 一种基于图序列化的代码搜索系统及方法 |
Non-Patent Citations (1)
Title |
---|
基于语义API依赖图的恶意代码检测;赵翠镕,张文杰,方勇,刘亮,张磊;《四川大学学报》;第57卷(第3期);第1-6页 * |
Also Published As
Publication number | Publication date |
---|---|
CN116661852A (zh) | 2023-08-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zhou et al. | A comprehensive survey on pretrained foundation models: A history from bert to chatgpt | |
CN111159223B (zh) | 一种基于结构化嵌入的交互式代码搜索方法及装置 | |
Hu | An introductory survey on attention mechanisms in NLP problems | |
US20220050967A1 (en) | Extracting definitions from documents utilizing definition-labeling-dependent machine learning background | |
US20220164626A1 (en) | Automated merge conflict resolution with transformers | |
CN111142850B (zh) | 一种基于深度神经网络的代码片段推荐方法与装置 | |
Wang et al. | Cocosum: Contextual code summarization with multi-relational graph neural network | |
CN115048447B (zh) | 一种基于智能语义补全的数据库自然语言接口系统 | |
CN117076653B (zh) | 基于思维链及可视化提升上下文学习知识库问答方法 | |
US20230138014A1 (en) | System and method for performing a search in a vector space based search engine | |
CN114528898A (zh) | 基于自然语言命令的场景图修改 | |
CN114936287A (zh) | 预训练语言模型的知识注入方法和相应的交互系统 | |
CN116661852B (zh) | 一种基于程序依赖图的代码搜索方法 | |
Qin et al. | A survey on text-to-sql parsing: Concepts, methods, and future directions | |
US20230014904A1 (en) | Searchable data structure for electronic documents | |
CN115688753A (zh) | 中文预训练语言模型的知识注入方法和交互系统 | |
Kumar et al. | Deep learning driven natural languages text to sql query conversion: A survey | |
CN117574898A (zh) | 基于电网设备的领域知识图谱更新方法及系统 | |
US20230153335A1 (en) | Searchable data structure for electronic documents | |
CN116414988A (zh) | 基于依赖关系增强的图卷积方面级情感分类方法及系统 | |
Gong et al. | ADELT: Transpilation Between Deep Learning Frameworks | |
Shi et al. | Cocoast: representing source code via hierarchical splitting and reconstruction of abstract syntax trees | |
US11995394B1 (en) | Language-guided document editing | |
CN113239703B (zh) | 基于多元因素融合的深层逻辑推理金融文本分析方法及系统 | |
Qiu et al. | A multi-encoder model for automatic code comment generation |
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 |