基于交互和图注意力网络的代码搜索方法

余荣威 ,  邓德旺 ,  王泽

武汉大学学报(理学版) ›› 2023, Vol. 69 ›› Issue (6) : 757 -766.

PDF (2430KB)
武汉大学学报(理学版) ›› 2023, Vol. 69 ›› Issue (6) : 757 -766. DOI: 10.14188/j.1671-8836.2022.0298
算法与应用

基于交互和图注意力网络的代码搜索方法

作者信息 +

Interaction and Graph Attention Network⁃Based Model for Code Search

Author information +
文章历史 +
PDF (2487K)

摘要

在代码搜索任务中,已有的基于深度学习的算法,一方面不能有效提取代码特征和查询特征之间的细粒度交互关系,另一方面未考虑特征之间潜在的结构化特征,无法实现更精确的匹配。本文提出了一种基于交互和图注意力网络的代码搜索模型IGANCS(Interaction and Graph Attention Network based model for Code Search)。该模型通过引入基于相似度矩阵的交互机制,学习代码特征和查询特征的细粒度交互关系,实现代码与查询之间的对齐;引入图注意力机制,利用自注意力层学习代码和查询中隐藏的结构化特征,更深入地挖掘代码和查询的结构化语义;利用最大池化机制分别聚合代码特征和查询特征,提取最重要的特征信息。本文在公开的Java数据集和Python数据集上对IGANCS进行了评估。实验结果表明,IGANCS在Mean Reciprocal Rank(MRR)和SuccessRate@1/5/10指标上优于已有的基线模型。

Abstract

In code search tasks, existing deep learning-based code search algorithms struggle to capture the fine-grained interaction information between the code features and query features. Also, these approaches neglect the underlying structured features between features, leading to precise matching failure. This work proposes an Interaction and Graph Attention Network⁃based model for Code Search (IGANCS) to address these issues. Initially, by incorporating a similarity⁃matrix based interaction mechanism, IGANCS learns the fine-grained interactive relationship between code features and query features, facilitating alignment between the code and the query. Following this, a graph attention mechanism is introduced, utilizing a self-attention layer to learn the hidden structured features within the code and the query. This enables a more in-depth exploration of the structured semantics of both the code and the query. Finally, the model aggregates code features and query features separately using a max-pooling mechanism, extracting the most essentia feature information. This paper evaluates IGANCS using publicly available Java and Python datasets. Experimental results show that IGANCS surpasses existing baseline models on metrics, including Mean Reciprocal Rank and SuccessRate@1/5/10.

Graphical abstract

关键词

代码搜索 / 交互机制 / 结构化特征 / 图注意力网络

Key words

code search / interaction mechanism / structured features / graph attention networks

引用本文

引用格式 ▾
余荣威,邓德旺,王泽. 基于交互和图注意力网络的代码搜索方法[J]. 武汉大学学报(理学版), 2023, 69(6): 757-766 DOI:10.14188/j.1671-8836.2022.0298

登录浏览全文

4963

注册一个新账户 忘记密码

0  引 言

在软件开发过程中,为了提升软件开发效率,开发人员一般都会在Github、FDroid和Stack Overflow等网站上的海量代码数据库中进行代码搜索并复用已有源代码来解决他们遇到的编程问题。其中,代码搜索指的是按照开发人员的意图,从代码数据库中检索相关的代码片段,即根据自然语言查询的语义返回语义最相近的代码片段。代码片段由强约束的结构化语言构成,开发人员的查询意图通常由自然语言构成,两者属于不同的模态。因此,代码搜索的过程是一种跨模态的匹配过程。当前,由于代码库中的代码数量和复杂度持续增加,搜索符合开发人员意图的代码也越来越具有挑战性。

在代码搜索技术发展初期,代码搜索方法主要基于信息检索技术[1~4],这些方法将源代码视为文档集合并对其进行关键字搜索,依赖自然语言查询文本与代码片段之间的词符(即token信息)或者语言结构的重叠,忽略了用自然语言表示的高级查询与低级源代码之间的语义关系,使代码搜索任务受到异构数据语义差距的影响,导致代码搜索效果下降。

近年来,为了解决基于信息检索的方法不能弥合代码片段与查询之间语义差距的问题,一些学者提出了基于深度学习的代码搜索方法[5~9],利用深度学习技术可以自动学习代码和查询的特征表示,并将代码和查询映射到同一个语义空间。Gu等[5]提出了DeepCS模型,首次将深度学习技术运用于代码检索任务,并且能够捕获中间语义空间中源代码和自然语言查询之间的语义相关性。DeepCS使用长短期记忆网络(Long Short-Term Memory,LSTM)[10]分别将查询和代码嵌入联合向量空间中,通过测量查询向量和代码向量的余弦相似度实现对目标代码的搜索。随后,Cambronero等[8]提出了一种简化的搜索模型UNIF,通过计算每个代码词符(即token信息)的重要性来扩展现有的无监督技术。与DeepCS相比,UNIF有更低的模型复杂度和更好的性能。然而,虽然DeepCS和UNIF在代码搜索领域都取得了很好的效果,但是这两种模型是分别学习代码和查询特征的,没有考虑两个模态(即代码和查询)之间的特征交互,并且未能学习更重要的结构化特征信息。Haldar等[11]提出了一种新的多角度代码-文本匹配神经框架MP-CAT,以捕获全局和局部相似性。但是,MP-CAT交互方式为简单的拼接,未实现查询特征对代码特征的细粒度交互,同样未探究特征之间的结构化特征信息。

总的来说,以上代码搜索方法未能有效挖掘代码和查询的细粒度交互关系,并且忽略了特征之间潜在的结构化语义特征,这两方面的问题都限制了代码搜索方法的搜索准确性。为了解决这些问题,本文提出了一种基于交互和图注意力网络的代码搜索模型IGANCS(interaction and graph attention network⁃based model for code search,IGANCS)。为了验证模型的有效性,本文在两个公开的数据集上评估了IGANCS并将IGANCS与最新的信息检索模型CodeHow以及三种先进的基于深度学习的模型DeepCS、UNIF和MP-CAT进行了比较。

1  IGANCS模型

图1描述了本文提出的模型IGANCS的总体架构。首先,IGANCS将代码特征(即方法名,抽象语法树序列和词符)和查询特征(即token信息)分别单独经过注意力层进行嵌入,得到一个特征矩阵。其次,经过特征交互层,学习代码和查询之间的相似性关系。然后,在图注意力网络[12]和特征表示层,将得到的特征矩阵构建成图,提取代码和查询的结构特征,分别在图上运用图注意力机制学习代码和查询的表示向量。最后,通过计算映射到同一空间的代码和查询表示向量的余弦值来评估代码和查询的相关程度。

1.1 嵌入层

嵌入层所做的主要工作是代码片段的嵌入和自然语言查询的嵌入,将由文本组成的代码和查询转换成对应的表示向量或者矩阵。

1.1.1 代码嵌入网络

代码嵌入网络将源代码嵌入到特征矩阵中。一个代码片段的特征有很多类型,如方法名、应用程序接口序列、抽象语法树、控制流图、调用图和词符信息等[13],这些特征都含有深层的代码编程语义。本文用以下三类特征来表示,分别是方法名、抽象语法树序列和词符(即token信息),其中抽象语法树序列是由Tree-Sitter工具包处理得到的。方法名和词符广泛应用于现有的深度代码搜索方法[5~9],现有的研究工作如code2vec[14]和code2seq[15]也表明抽象语法树在代码特征表示具有优越性。因此,将一个给定的代码段C表示为C=[M,AST,T],其中M是代码片段的方法名,AST是抽象语法树序列,T是词符。对于所有代码特征,本文将依据驼峰命名法对其进行分割。例如对于“arrayList”,为了得到更加细化的特征信息本文会将其拆分为“array”以及“List”两个单词。

由于方法名一般都很短,很难利用LSTM提取每个方法名的序列特征。相比LSTM,注意力网络[16]考虑了序列中的不同单词的重要性关系,特别适合用来抽取序列中的语义信息。因此,本文选择使用注意力机制,不仅可以并行化地提取特征,还可以关注更重要的特征信息。

给定一个长度为NM 的序列m1,,mNM,其中miRd,是d维初始向量对应于序列中的第i个单词。注意力权重反映了特征的重要程度,每个mi的注意力权重αmi计算方式如下:

αmi=expamimiTi=1NMexpamimiT

其中,注意力向量amiRd是一个d维参数向量,在模型训练期间被优化。

方法名的特征矩阵计算如下:

M=αm1m1αm2m2αmNMmNM

其中,⊕是拼接符号,矩阵MRNM×d

本文将从函数体中提取抽象语法树作为结构特征。抽象语法树中的各个节点对应函数体中各种代码结构,例如变量声明、方法调用、循环和条件判断,通过广度优先遍历该树,得到由所有节点构成的序列。

给定一个长度为NAST的抽象语法树序列ast1,,astNAST,其中astiRd,其嵌入过程如下:

αasti=expaastiastiTi=1NASTexpaastiastiT
AST=αast1ast1αast2ast2αastNASTastNAST

其中,αastiasti的注意力权重,ASTRNAST×d是加权向量拼接得到的抽象语法树序列特征矩阵。

给定由NT个词符组成的集合t1,,tNT,其中tiRd,其嵌入过程如下:

αti=expatitiTi=1NTexpatitiT
T=αt1t1αt2t2αtNTtNT

其中,αtiti的注意力权重,TRNT×d是加权向量拼接得到的词符特征特征矩阵。

将代码的三类特征嵌入得到三个矩阵之后,将矩阵 MASTT 拼接得到代码的特征矩阵:

C=MASTT

其中,CRk×d,k是经过拼接之后的代码特征数量;‖表示拼接。

1.1.2 查询嵌入网络

查询嵌入网络将自然语言查询嵌入到查询的特征矩阵中。自然语言查询中包含了描述开发者意图的关键字,但是并不是查询中所有词都对查询语义都有贡献,一些在查询中经常出现的词通常很难反映开发者的意图。在对查询中的词进行编码之后,为了提取查询语义,执行注意力机制,给在查询中重要性较低的词分配较少的注意力权重,能够更好反映开发人员意图的词分配更大的权重。最后,将加权后的词表示向量拼接成查询特征矩阵。

给定长度为n的序列{q1,,qn},其中qiRd,该序列从自然语言查询中提取得到。查询的嵌入过程如下:

αqi=expaqiqiTi=1nexpaqiqiT
Q=αq1q1αq2q2αqnqn

其中,注意力向量aqiRd是一个d维参数向量,在模型训练期间学习得到;QRn×d是新的查询特征矩阵。

1.2 特征交互层

通过嵌入代码及其对应的查询后,得到矩阵CRk×d和矩阵QRn×dkn分别表示嵌入代码和查询的特征数量。

在计算代码和查询特征向量的全局匹配过程之前,已有的大多数代码搜索方法都忽略了学习代码和查询特征之间的细粒度交互关系和长期依赖关系。在本文的方法中,代码和查询中的每个特征将与对方的每个特征进行匹配来学习特征级的一致性。如图2所示的代码搜索示例,对于查询中的“String”,它与代码片段中的“String”以及“readString”等具有更高的相关性,而与“public”等相关性比较低。为了提高代码和查询的相似特征之间的相关性,本文提出用细粒度特征交互层学习这种交互关系。

图3所示是模型的特征交互过程。首先计算代码特征和查询特征之间的相似度矩阵SRk×n,矩阵S的元素sij表示代码特征i和查询特征j之间的相似度分数,通过下式计算:

sij=ciqjT

其中,ci为代码特征矩阵C的第i行特征向量,qj为查询特征矩阵Q的第j行特征向量。然后,引入可以被神经网络学习得到的参数矩阵URn×n,通过 (11)式计算相关矩阵S'Rk×n

S'=SU

本文将相似度矩阵 S 作为一个残差项保留细粒度的交互信息。因此,特征交互层不仅可以捕获局部细粒度的相似性,还可以捕获长依赖的交互关系,为学习代码-查询特征之间的对齐提供丰富的信息。通过(12)式计算相关矩阵S*Rk×n

S*=S+S'

相关矩阵S*能同时关注嵌入代码和查询的词汇语义相关性。S*中的每个元素sij*表示第i个代码特征向量Ci和第j个查询特征向量Qj的语义相关性,能衡量代码特征与查询特征的相关程度。S*中的第i行表示查询中每个单词与代码中第i个单词的语义相关性。同样S*中的第j列表示代码中每个单词与第j个查询词的语义相关性。在 S' 的行向量和列向量上使用softmax函数,生成权重矩阵 αβ,其过程如下:

αij=expsij*j=1nexpsij*, βij=expsij*i=1kexpsij*

利用学习后的相关矩阵S*分别聚合查询特征和代码特征得到交互后的代码特征矩阵C'Rk×d和查询特征矩阵矩阵Q'Rn×d,表示如下:

Ci'=j=1nαijqj,  Qi'=i=1kβijci

1.3 图注意力网络和特征表示层

在查询和代码的特征交互完成之后,需要将代码特征矩阵和查询特征矩阵构建成无向全连接图,在图上融合图注意力机制学习查询和代码的结构化语义特征。

1.3.1 图构建

将代码和查询的特征矩阵构建成代码和查询的特征图,然后在图上融合图注意力机制,图的边权重是通过图神经网络自适应学习的。

1) 代码特征图。为每个代码特征矩阵构造一个无向全连接图Gc =(Vc,Ec ),边的权重值代表与边相连两个节点之间的语义依赖性,贡献了一部分代码语义。之所以将其构建为无向全连接图,是为了使图注意力机制能学习任意两个节点之间存在的隐式关系。代码特征矩阵通常有很多特征向量,它们可能语义上是相关的,组合在一起形成一个图结构,包含了丰富的编程意图。因此,基于这一观察,将每个特征设为图的节点,假设所有节点之间都存在显式或隐式的语义依赖关系,用一条边来描述两个节点之间的语义关系,将代码特征矩阵构建为无向全连接图。

2) 查询特征图。与代码特征图相似,将查询特征矩阵表示为一个无向全连接图Gq =(Vq,Eq ),其节点为所有的查询特征向量,每个节点与图中其他所有节点相关联。在查询特征图中,边的权重表示两个查询特征之间的语义依赖关系,它与查询特征一起反映了查询的意图。

1.3.2 代码特征表示

本文使用的是单层图注意力网络,它将构建好的代码特征图作为输入,并将图中节点特征表示与边权重一起传播到邻居节点。图注意力网络利用自注意力机制,学习节点与其邻居节点之间的权重,这样能够学习图中的结构信息,并计算图中每个节点的隐藏表示。

由特征交互层得到代码特征序列C'=c1',c2',,ck'ci'Rd,其中k是代码特征节点的数量,d是代码特征向量的维度。将C'经过图构建后输入到图注意力网络中,生成一组新的节点特征序列,Vc'=vc1',vc2',,vck'vci'Rd,作为输出。按照图注意力机制的原理,计算节点i与节点jjNiNi为代码特征图中节点i的邻居节点)的注意力系数eijc(即权重系数),如下式所示:

eijc=attenWcci' Wccj'=LeakyReLUacWcci' Wccj'

其中,Wcd×d是一个可学习的参数矩阵,‖是拼接操作。使用前馈神经网络atten将拼接向量由可学习参数ac2d映射到实数上,并通过LeakyReLU激活。通过学习参数矩阵和输入特征向量,学习节点i和节点j之间的相关性。为了便于比较不同节点之间的注意力系数,使用softmax函数对eijc进行归一化,计算两个节点的注意力权重αijc

αijc=softmaxjeijc=expeijc lNiexpeilc

利用注意力权重,聚合节点i的邻居节点的特征,可以得到新的特征向量vci',如下式:

vci'=σjNiαijcWccj',i=1,2,,k

最后,对新的特征序列Vc'=vc1',vc2',,vck'进行最大池化操作得到代码的特征向量:

c=maxpoolingvc1',vc2',,vck'

1.3.3 查询特征表示

由特征交互层得到查询特征序列Q'=q1',q2',,qn'qi'Rdn是代码特征节点的数量,d是代码特征向量的维度。Q'经过图构建后输入到图注意力网络中,输出一组新的节点特征序列,Vq'=vq1',vq2',,vqn'vqi'Rd。对于查询特征节点i,计算其与特征节点j的注意力系数eijq,其中jNiNi为查询特征图中节点i的邻居节点,如下式所示:

eijq=attenWqqi' Wqqj'=LeakyReLUaqWqqi' Wqqj'

其中,WqRd×d是一个可学习的参数矩阵,aq是可学习的参数权重向量。使用softmax函数对eijq进行归一化,计算注意力权重αijq

αijq=softmaxjeijq=expeijq lNiexpeilq

聚合节点i的邻居节点的特征,可以得到新的特征向量:

vqi'=σjNiαijqWqqj',i=1,2,,n

最后,通过对新的特征序列Vq'=vq1',vq2',,vqn'进行最大池化操作得到代码的特征向量:

q=maxpoolingvq1',vq2',,vqn'

1.4 模型优化

为了能够更准确地将代码和查询映射到同一向量空间,本文用大量数据训练来优化模型参数,最终得到的模型具有以下特性:当代码片段和查询具有相似的语义时,它们的表示向量彼此接近;当代码和查询的语义不同时,它们的表示向量相距很远。本文将每个训练实例构造为一个三元组o,d+,d-,对于每个代码片段o,都有一个肯定的查询d+o的正确查询)和一个否定查询d-o的错误查询)。错误的查询d-从正确查询d+的集合中随机选择。损失函数设置如下:

Lθ=o,d+,d-Gmax 0,β-simo,d++simo,d-

其中,θ表示模型参数,G表示训练数据集,β的值设置为0.05,sim表示代码和查询的表示向量之间的相似程度,本文采用的是余弦相似度度量方法。

训练模型时,在嵌入层,注意力机制学习特征词权重生成特征矩阵。在特征交互层,学习特征交互参数矩阵,与相似度矩阵相乘得到相关矩阵,对相关矩阵的列和行进行归一化得到相关权重向量,通过相关权重矩阵聚合另一模态的特征向量更新特征。在图注意力网络层,图注意力机制学习权重矩阵W和权重向量a,计算节点之间的注意力系数并通过softmax函数归一化成注意力权重向量,通过注意力权重向量聚合节点的邻居节点得到新的表示向量,最后将更新后的特征节点经过最大池化操作。训练过程中,损失函数通过Adam算法进行优化,同时学习代码和查询的最终表示向量。

2  实验评估

2.1 实验设置

2.1.1 数据集

本文模型在两个公开的高质量数据集上进行训练和评估,以验证模型的有效性和性能。一个是Hu等[17]发布的Java数据集,另一个是Barone和Sennrich[18]发布的Python数据集。在构建数据集时,本文特别关注了注释的质量。要求注释必须清晰、准确、简洁、自然,同时尽可能地涵盖方法或函数的各个方面。清除了构不成AST的错误代码或者查询语句长度小于2的数据。处理之后的两个数据集的统计数据如表1。Hu等[17]的数据集舍弃了没有Javadoc注释的方法,对于每个有注释的方法,使用出现在Javadoc描述的第一句话作为注释。Barone和Sennrich通过从Github代码仓库下载Python源码,并只保留Python2.7代码,经过处理得到包含超过10 000个平行语料库的数据集[18]。本文将上述数据集代码表示为<method,description>的形式,用于IGANCS的训练与评估。

2.1.2 性能指标

本文采用两个广泛使用的指标SuccessRate[19]和MRR(mean reciprocal rank)[20]衡量模型的有效性。

SuccessRate@k(SR@k)表示在排名前k的列表中,可以获得正确搜索结果的查询的比例,其计算公式如下:

SuccessRate@k=1Qi=1QσQik

其中,Q是测试数据集中的所有查询,本文实验评估中查询个数为1 000;σ是指示函数,如果第i个查询可以在排名靠前的k个列表中找到,则返回1,否则返回0。本文中k分别取1,5和10。

MRR表示所有正确搜索结果的倒数秩的平均值,考虑了正确搜索结果在搜索结果列表中的排名,计算公式如下:

MRR=1Qi=1Q1RankQi

其中,RankQi是搜索结果列表中正确结果的排名。本文只在排名前10的列表中计算MRR,MRR值越高表示代码搜索性能越好。

2.1.3 实验参数

为了有效的训练模型,本文将批次大小设置为64。为每个特征设置最大长度,当序列的长度大于最大长度时,截断序列;反之,以数值0进行填充。对于代码名称,设置长度为6,对于代码token以及代码AST序列长度,设置长度为100。在嵌入部分将嵌入维度设置为128,对于GAT(graph attention networks)维度,设置为128。模型中引入了Dropout机制,参数设置为0.25。详细参数设置如表2所示。

2.1.4 基线模型

选择以下4种先进的代码搜索方法与本文的方法进行比较。

1) CodeHow[4],它是一个经典的代码搜索引擎。它基于信息检索代码搜索工具,包含扩展布尔模型和API匹配的内容,可以识别出用户查询所指的潜在API。在了解了潜在的相关API后,CodeHow用API扩展了查询,并通过应用扩展代码检索法进行代码检索。

2) DeepCS[5],它是第一个基于深度神经网络的代码检索方法。通过RNN(循环神经网络)和MLP(多层感知机)技术将源代码和查询嵌入到相同的向量空间来执行代码描述匹配搜索。

3) UNIF代码搜索技术,这是由Cambronero等[8]提出的监督代码搜索模型。UNIF使用可学习的基于注意力的加权方案,为每个词符嵌入计算,并生成代码向量,通过对查询嵌入进行平均产生描述向量。

4) MP-CAT,由Haldar等[11]提出的用于代码文本匹配的多角度神经框架,它通过结合代码和文本特性捕获全局和局部的相似性。

2.2 实验结果

2.2.1 有效性

为了验证IGANCS的有效性,本文在两个公开数据集上将本文的模型与上述基线方法进行对比,并在表3中报告了主要结果。

CodeHow作为传统的基于信息检索的模型,依赖用户查询识别代码相关的API,这种关键词匹配的检索方式会造成语义信息的缺失。DeepCS和UNIF由于代码和查询是隔离训练的,只依赖最后的余弦函数进行相似度的计算,这种隔离的训练方式不能完全捕获代码和查询之间的语义相关性,同时它们的训练只依赖文本类型的特征,无结构化特征的训练。MP-CAT依赖传统的拼接方式对代码和查询进行交互,这种交互方式太过简单,同时也未探究结构化特征信息对代码搜索精度的影响。而IGANCS通过特征交互层有效地对每个代码特征和每个查询特征进行细粒度相关性学习,并通过残差网络学习长距离的相似性关系,最后通过构建图注意力网络学习特征之间的结构化信息,解决了上述模型的局限性。所以,IGANCS在有效性方面优于其他基线模型。

2.2.2 效率

本文在相同的实验条件下对IGANCS和基于深度学习的基线模型的效率进行了评估,实验在一个拥有NVIDIA GeForce RTX 2080 Ti GPU的服务器上进行。实验中IGANCS和基线模型的训练时间和测试时间(平均每条查询消耗的时间)结果如表4所示。从表4来看,在Java和Python数据集上,IGANCS的训练时间和测试时间比大部分的代码搜索模型更低,效率更高。由于UNIF只使用一个文本特征来表示代码,而IGANCS使用一个结构特征和两个文本特征,所以UNIF在模型优化和代码搜索方面比IGANCS略快。

2.2.3 消融实验

交互模块和图注意力模块是IGANCS嵌入代码和查询的一个重要组件,将无交互的代码搜索模型命名为IGANCS-noCL,将无图注意力模块模型命名为IGANCS-noGA,消融实验结果如表5所示。与IGANCS相比,IGANCS-noCL不论是在MRR上还是SuccessRate上准确率略有不足,这表明代码特征和查询特征之间的交互可以进一步提高代码搜索的有效性;与IGANCS相比,IGANCS-noGA在MRR和SuccessRate上准确率明显降低,这表明分别构建代码特征和查询特征之间的自学习的结构化关系可以提高本文代码搜索模型的有效性。

2.2.4 搜索结果

图4显示了IGANCS和其他模型在Java测试数据集上对于查询“adds a listener for all of this Controller's lifecycle events”“remove a table from the memory database”和“gets the file from a Java file object”的第一个搜索结果。可以注意到,IGANCS为上述三个查询在第一个搜索结果中返回了正确的代码,而DeepCS、UNIF和MP-CAT都没能返回正确的搜索结果。主要原因在于,DeepCS、UNIF和MP-CAT模型在联合嵌入过程中缺乏细粒度交互,并且忽略了代码和查询深层的结构化特征。IGANCS不仅考虑了代码特征和查询特征细粒度的对应关系,还挖掘了特征之间潜在的结构化信息,因此搜索结果更加准确。

3  相关工作

3.1 跨模态信息交互

大多数已有的基于深度学习的代码搜索方法,都只关注对代码或查询的表示改进,分别独立地使用模型来学习代码和查询的表示,忽略了它们的对应关系,这无疑会造成代码搜索性能的下降。事实上,在推荐系统、图像检索和语音识别等领域,已经有许多研究通过运用跨模态交互机制,解决了如何在两个或多个输入数据中学习交互式语义信息的问题。例如,Li等[21]提出的一种用于服务推荐任务的上下文感知的共同注意力网络。该模型可以将包含用户-商品关联特征的上下文特征,分别与用户特征和商品特征融合形成用户的上下文偏好特征和商品的上下文偏好特征,并运用共同注意力机制来挖掘用户和商品的交互信息,增强用户和商品的表示向量,提高推荐服务的准确性。Wang等[22]提出的一种文本-图像检索模型,引入了一种跨模态的消息传递机制实现图像和文本的交互。这种机制通过跨模态注意力机制进行信息聚合,以挖掘图像和文本的相似性,指导两者的联合嵌入,提升了检索精度。Lee等[23]提出的图像-文本匹配模型,通过引入多个交叉注意力层学习图像和文本之间的语义对齐关系,每个交叉注意力层都将注意力权重从一种模态传递到另一种模态,使得模型可以在不同的模态之间进行信息交互。该模型在多个数据集上都取得了比其他基线模型更好的匹配精度。

上述研究工作在一定程度上证明了在多模态数据匹配任务中跨模态信息交互的重要性。因此,本文提出的模型在学习代码和查询表示的过程中,引入了一个细粒度交互环节,能够学习它们之间的相似性以及长期依赖关系,以此来提升代码搜索精度。

3.2 基于图结构的匹配任务

在基于深度学习的匹配任务中,结构化语义能够丰富模型整体捕获的语义信息,帮助模型提升匹配精度。例如,在长文本匹配领域,Liu等[24]提出了一种概念交互图(Concept Interaction Graph,CIG),将文档视为概念的加权图,通过度量文档的加权图之间的相似程度来判断两个文档的匹配程度,解决了已有研究工作对新闻文章等长文本进行匹配时效果不佳的问题。在图像-文本匹配领域,Liu等[25]提出了一种图结构匹配网络,该网络将异构的图像和文本数据分别构造成图,以此来匹配图像和文本。具体来说,是通过图的节点级匹配和结构级匹配实现的,它们通过沿图的边传播节点对应关系来推断细粒度对应关系。传统代码搜索模型将代码和查询作为一个整体去学习它们的表示向量,不能有效提取代码和查询的结构化信息。本文的代码搜索网络受上述基于图结构匹配的研究工作的启发,将代码和查询文本特征分别构造成图,利用图注意力机制提取特征图的结构信息,实现代码和查询语义信息的深入挖掘。

4  结 语

针对已有代码搜索模型存在的不能有效提取代码和查询之间交互信息和结构化信息的问题,本文提出了一种基于跨模态交互和图注意力机制的代码搜索模型IGANCS,该模型实现了代码特征和查询特征的交互,学习了两者之间的对应关系。同时,将经过交互的代码和查询特征构造成全连接的特征关系图,融合图注意力机制,提取代码和查询中的结构化特征,学习两者之间细粒度依赖关系。实验结果表明,IGANCS在SuccessRate和MRR指标及效率方面优于CodeHow、DeepCS、UNIF和MP-CAT。消融实验的结果表明跨模态交互和图注意力机制对代码搜索是有效和有价值的。

目前大语言预训练模型在各类自然语言处理任务上都取得了很好的效果,未来可以通过大语言预训练模型为代码搜索任务提供更准确、高效和智能的编码支持。

参考文献

[1]

CHAN W KCHENG H, LO D. Searching connected API subgraph via text phrases[C]//Proceedings of the ACM SIGSOFT 20th International Symposium on the Foundations of Software Engineering. New York: ACM, 2012: 1-11. DOI: 10.1145/2393596.2393606 .

[2]

MCMILLAN CGRECHANIK MPOSHYVANYK Det al. Portfolio: Finding relevant functions and their usage[C]//Proceedings of the 33rd International Conference on Software Engineering. New York: ACM, 2011: 111-120. DOI: 10.1145/1985793.1985809 .

[3]

LINSTEAD EBAJRACHARYA S, NGO T, et al. Sourcerer: Mining and searching internet-scale software repositories[J]. Data Mining and Knowledge Discovery200918(2): 300-336. DOI: 10.1007/s10618-008-0118-x .

[4]

FZHANG H YLOU J Get al. CodeHow: Effective code search based on API understanding and extended Boolean model (E)[C]//2015 30th IEEE/ACM International Conference on Automated Software Engineering (ASE). New York: IEEE Press, 2016: 260-270. DOI: 10.1109/ASE.2015.42 .

[5]

GU X DZHANG H YKIM S. Deep code search[C]//Proceedings of the 40th International Conference on Software Engineering. New York: ACM, 2018: 933-944. DOI: 10.1145/3180155.3180167 .

[6]

WAN YSHU J DSUI Y Let al. Multi-modal attention network learning for semantic source code retrieval[C]//2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE). New York: IEEE Press, 2020: 13-25. DOI: 10.1109/ASE.2019.00012 .

[7]

LING C YLIN Z QZOU Y Zet al. Adaptive deep code search[C]//Proceedings of the 28th International Conference on Program Comprehension. New York: ACM, 2020: 48-59. DOI: 10.1145/3387904.3389278 .

[8]

CAMBRONERO JLI H YKIM Set al. When deep learning met code search[C]//Proceedings of the 2019 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. New York: ACM, 2019: 964-974. DOI: 10.1145/3338906.3340458 .

[9]

YAO Z YPEDDAMAIL J RSUN H. CoaCor: Code annotation for code retrieval with reinforcement learning[C]//WWW'19: The World Wide Web Conference. New York: ACM, 2019: 2203-2214. DOI: 10.1145/3308558.3313632 .

[10]

SUNDERMEYER MSCHLÜTER RNEY H. LSTM Neural Networks for Language Modeling[DB/OL].[2022-10-10]. DOI: 10.21437/interspeech.2012-65 .

[11]

HALDAR RWU L FXIONG J Jet al. A Multi-perspective Architecture for Semantic Code Search[DB/OL].[2022-10-10]. DOI: 10.18653/v1/2020.acl-main.758 .

[12]

VELIČKOVIĆ PCUCURULL GCASANOVA Aet al. Graph Attention Networks[EB/OL]. [2022-10-11].

[13]

MCMILLAN CGRECHANIK MPOSHYVANYK Det al. Exemplar: A source code search engine for finding highly relevant applications[J]. IEEE Transactions on Software Engineering201238(5): 1069-1087. DOI: 10.1109/TSE.2011.84 .

[14]

ALON UZILBERSTEIN MLEVY Oet al. code2vec: Learning distributed representations of code[J]. Proceedings of the ACM on Programming Languages2019, 3(POPL): 1-29. DOI: 10.1145/3290353 .

[15]

ALON UBRODY SLEVY Oet al. code2seq: Generating Sequences from Structured Representations of Code[EB/OL]. [2022-10-10].

[16]

XU LYANG H HLIU Cet al. Two-stage attention-based model for code search with textual and structural features[C]//2021 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER). New York: IEEE Press, 2021: 342-353. DOI: 10.1109/SANER50967.2021.00039 .

[17]

HU XLI GXIA Xet al. Deep code comment generation[C]//Proceedings of the 26th Conference on Program Comprehension. New York: ACM, 2018: 200-210. DOI: 10.1145/3196321.3196334 .

[18]

BARONE A V MSENNRICH R. A Parallel Corpus of Python Functions and Documentation Strings for Automated Code Documentation and Code Generation[EB/OL]. [2022-10-10]. DOI: 10.1007/979-8-8688-0160-0_4 .

[19]

LI XWANG Z RWANG Q Xet al. Relationship-aware code search for JavaScript frameworks[C]//Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering. New York: ACM, 2016: 690-701. DOI: 10.1145/2950290.2950341 .

[20]

YE XBUNESCU RLIU C. Learning to rank relevant files for bug reports using domain knowledge[C]//Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering. New York: ACM,2014: 689-699. DOI:10.1145/2635868.2635874 .

[21]

LI LDONG R HCHEN L. Context-aware co-attention neural network for service recommendations[C]//2019 IEEE 35th International Conference on Data Engineering Workshops (ICDEW). New York: IEEE Press, 2019: 201-208. DOI: 10.1109/ICDEW.2019.00-11 .

[22]

WANG Z HLIU X HLI H Set al. CAMP: Cross-modal adaptive message passing for text-image retrieval[C]//2019 IEEE/CVF International Conference on Computer Vision (ICCV). New York: IEEE Press, 2020: 5763-5772. DOI: 10.1109/ICCV.2019.00586 .

[23]

LEE K HCHEN XHUA Get al. Stacked cross attention for image-text matching[C]//European Conference on Computer Vision. Cham: Springer, 2018: 212-228.10.1007/978-3-030-01225-0_13. DOI: 10.1007/978-3-030-01225-0_13 .

[24]

LIU BZHANG TNIU Det al. Matching Long Text Documents via Graph Convolutional Networks[DB/OL]. [2022-02-03].

[25]

LIU C XMAO Z DZHANG T Zet al. Graph structured network for image-text matching[C]//2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). New York: IEEE Press, 2020: 10921-10930. DOI: 10.1109/cvpr42600.2020.01093 .

基金资助

国家重点研发计划(2020YFB1805400)

国家重点研发计划(2022YFB4500800)

国家自然科学基金(42071431)

AI Summary AI Mindmap
PDF (2430KB)

0

访问

0

被引

详细

导航
相关文章

AI思维导图

/