How to Better Utilize Code Graphs in Semantic Code Search?

编程入门 行业动态 更新时间:2024-10-20 03:20:04

How to Better Utilize <a href=https://www.elefans.com/category/jswz/34/1771384.html style=Code Graphs in Semantic Code Search?"/>

How to Better Utilize Code Graphs in Semantic Code Search?

原论文链接:.1145/3540250.3549087​​​​​​​

摘要

1. 引言

2. 研究背景

2.1 Deep Learning-based Semantic Code Search

 2.2 Mainstream Models for Code Search

A. Multi-modal Models

B. Pre-trained Models

3 THE GRAPH-TO-SEQUENCE CONVERTER

4 G2SC ENABLED MODELS

4.1 Data Pre-processing

4.2 G2SC Enabled Multi-modal Model

 4.3 G2SC Enabled CodeBERT Model

4.4 Code Search

5 EXPERIMENT

5.1 Research Questions

5.2 Experiment Setup

5.2.1 Data Set.

5.2.2 Experiment Setting.

5.3 Answer to RQ1

5.4 Answer to RQ2

5.5 Answer to RQ3

5.6 Threats to Validity

6 RELATED WORK

Code search.

Deep code representation.

7 CONCLUSION AND FUTURE WORK

REFERENCES

摘要

语义代码搜索极大地促进了软件重用,使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。由于代码图(如控制流图和程序依赖图)具有丰富的表达能力,两种主流研究工作(即多模态模型和预训练模型)都试图将代码图纳入代码建模。然而,它们仍有一些局限性:首先,在搜索效率方面仍有很大的改进空间。其次,他们没有充分考虑代码图的独特性。

在本文中,我们提出了一种图形到序列转换器,即𝐺2𝑆𝐶。 通过将码图转换为无损序列,𝐺2𝑆𝐶 能够解决使用序列特征学习的小图学习问题,并捕获码图的边和节点属性信息。 这样,可以大大提高代码搜索的有效性。 特别地,𝐺2𝑆𝐶首先通过特定的图遍历策略将代码图转换为唯一对应的节点序列。 然后,它通过用相应的语句替换每个节点来获得语句序列。 一套精心设计的图遍历策略保证了过程是一对一的、可逆的。 𝐺2𝑆𝐶 能够捕获丰富的语义关系(即控制流、数据流、节点/关系属性)并提供学习模型友好的数据转换。

它可以灵活地与现有模型集成,以更好地利用代码图。 作为概念验证应用程序,我们提出了两个 𝐺2𝑆𝐶 启用模型:GSMM(𝐺2𝑆𝐶 启用多模式模型)和 GSCodeBERT(𝐺2𝑆𝐶 启用 CodeBERT 模型)。 在两个真实的大型数据集上进行的大量实验结果表明,GSMM 和 GSCodeBERT 可以将最先进的模型 MMAN 和 GraphCodeBERT 在 R@1 上提高 92% 和 22%,在 MRR 上分别提高 63% 和 11.5%。

1. 引言

语义代码搜索对于软件开发人员服务于各种目的起着至关重要的作用,尤其是代码重用,它使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。 例如,对于查询“How to read an object from an xml?”,代码搜索引擎从十亿令牌规模的代码库(例如 Github)返回如图 1 所示的候选代码片段。 现有代码的重用避免了开发人员重新发明轮子的必要,节省了软件开发过程中的时间和资源成本。

Figure 1: Code snippet for query "How to read an object from an xml?"

 这项任务非常重要,因为自然语言查询中的高级意图与源代码中的低级实现细节之间通常存在语义差距 [13]。 例如,图 1 中的代码片段不包含查询中的任何关键字,例如 read 和 object 或其他类似文本。 因此,那些仅基于关键字匹配或文本相似性的单峰方法,例如基于信息检索 (IR) 的代码搜索方法 [25、26、29、36、40],无法很好地应对挑战。

最近的研究工作提出了各种基于深度学习技术的多模态模型。 由于查询和源代码之间的词汇差距是通过它们在高维空间中的语义表示学习来弥补的,因此它们成功地提高了搜索效率。 这些工作可以分为两个主要流派:1.) 带有预训练的多模态模型,这些模型采用基于 Transformer 的架构设计,并由多个预训练任务引导以学习多模态数据的通用表示; 然后针对一组与代码相关的下游任务进行微调,例如代码搜索、代码摘要等; 2.) 未经预训练的多模态模型,专门针对端到端的代码搜索进行训练。 为简单起见,我们将上述第一和第二主要工作流中的模型分别称为预训练模型和多模态模型。 CodeBERT [10] 和 DCS [13] 分别是预训练模型和多模态模型的例子。

尽管这些模型能够捕获更多语义,但它们仍然存在使用代码简单特征和忽略代码结构信息的问题。 代码图(例如,抽象语法树 (AST) 或控制流图 (CFG))已被证明是有效且富有表现力的,可以捕获源代码的丰富结构语义 [20, 45]。 最近的研究工作是利用两个研究流中的代码图。 例如,在多模态模型流中,Wan 等人。 [45] 通过将 CFGs 集成到模型中提出了一种多模态注意力网络 MMAN,并采用图神经网络(GNNs)来学习隐藏在代码图中的语义信息,然后是一个注意力层来整合非结构化和结构化特征。 在预训练模型流中,GraphCodeBERT [16] 引入了图形引导的掩码注意功能,以合并捕获数据流的代码结构。 然而,通过对两个主要工作流的深入研究,我们有以下两个发现激发了我们在本文中的工作。

1.) 两者在搜索效率上还有很大的提升空间。 例如,根据 MMAN [45] 和 GraphCodeBERT [16] 中报告的原始结果,这两个模型在各自的任务中都达到了最先进的水平。 然而,在一个广泛使用的评估指标 Mean Reciprocal Rank (MRR) 上,最大值为 1,MMAN 和 GraphCodeBERT 只能分别达到大约 0.452 和 0.713。 与各自对应的 DCS (0.377) 和 CodeBERT (0.693) 相比,MRR 分别仅提高了 0.075 和 0.02。

​​​​​​​​​​​​​​

Figure 2: Code graph (PDG) and its node distribution in two data sets JAVA-2M and CodeSearchNet 

2.) 他们都忽略了代码图的独特性所带来的潜在困难和挑战,代码图包含的信息多样且通常很小。 图 2(a) 显示了图 1 中代码片段的程序依赖图 (PDG) [11]。可以看出,PDG 包含两种结构信息,即控制依赖(控制流的虚线边缘)和数据依赖 (数据流的实体边),以及两种属性信息,即节点属性(每个节点中的语句)和边属性(数据依赖边上的参数变量)。 多模态模型 MMAN 和预训练模型 GraphcodeBERT 分别将捕获控制流或数据流的代码结构融入到它们的学习任务中。 然而,他们仍然可能丢失很多有价值的信息,因为单独的控制流或数据流只能捕获语句控制关系或变量关系。 更重要的是,代码图通常很小。 如图 2(b) 所示,从两个用于代码搜索的真实数据集(CodeSearchNet [22] 和我们收集的数据集 JAVA-2M)中提取的大多数代码图(CFGs 和 PDGs)只有 2-5 个节点并且非常 其中很少有超过 20 个节点。 多模态模型 MMAN 利用 GNN 嵌入 CFG 作为结构特征。 然而,现有研究 [19] 表明,GNN 通常在具有 2, 000 到 20, 000 个节点的大型图上取得更好的性能。

这两个发现激励我们,如果在语义学习模型中更充分地利用代码图的这些独特特征,则可以大大提高代码搜索的有效性。 在本文中,为了解决这个问题,我们提出了一种图形到序列转换器(G2SC)。 通过将代码图转换为保留完整图结构信息的无损序列,𝐺2𝑆𝐶 能够通过序列特征学习解决使用 GNN 进行小图学习的问题,并捕获代码图的边和节点属性信息。 特别地,𝐺2𝑆𝐶首先通过特定的图遍历策略将代码图转换为唯一对应的节点序列。 然后,它通过用相应的语句替换每个节点来获得语句序列。 一套精心设计的图遍历策略保证了过程是一对一的、可逆的。 𝐺2𝑆𝐶 能够捕获丰富的语义关系(即控制流、数据流、节点/关系属性),并提供学习模型友好的数据转换。 此外,为了表明 G2SC 可以灵活地与两个研究流中的最先进模型集成,即多模态模型和预训练模型,并大大提高它们的有效性,我们提出了两个 G2SC 启用 模型:GSMM(支持 G2SC 的 MMAN 模型)和 GSCodeBERT(支持 G2SC 的 CodeBERT 模型)。 具体来说,GSMM 采用双向长短期记忆(BiLSTM [43])从 G2SC 转换序列中学习代码图的结构化特征,然后注意层将非结构化和结构化特征集成在一起。 GSCodeBERT 将代码描述序列中的代码序列替换为 G2SC 转换后的序列,以进一步微调 CodeBERT 模型。 我们工作的复制包已经发布在 Github 1 上()。

我们工作的主要贡献总结如下。

1.) 我们提出了一个图到序列转换器 (G2SC),它将代码图转换为无损序列。 通过G2SC,可以利用序列特征学习有效地学习码图的结构信息。 据我们所知,我们是第一个将这个想法引入语义代码搜索的人。

2.) 我们提出了两种启用 G2SC 的语义代码搜索模型:启用 G2SC 的多模态模型 (GSMM) 和启用 G2SC 的 CodeBERT (GSCodeBERT)。 他们都展示了将 G2SC 集成到现有模型中以提高其利用代码图进行语义代码搜索的能力的普遍性和适用性。

3.) 我们进行了广泛的实验,以在各种真实数据集上评估建议的 G2SC 启用模型。 结果表明,G2SC 大大改进了两个流中最先进的模型。 比如在MRR方面,GSMM分别提升了DCS和MMAN 100%和63%,而GSCodeBERT分别提升了CodeBERT和GraphCodeBERT 13%和11.5%。

Outline: 本文的其余部分安排如下。 第二节介绍了本文的研究背景。 在第 3 节中,我们概述了 G2SC。 第 4 节介绍了两个支持 G2SC 的模型。 在第 5 节中,我们提供实验评估来解决我们的研究问题。 最后,第 6 节和第 7 节分别提供了相关工作和结论。

2. 研究背景

在本节中,我们介绍了基于深度学习的语义代码搜索的整体过程,以及来自两个主流研究的四个代表性模型,即 DCS、MMAN、CodeBERT 和 GraphCodeBERT,我们选择它们进行实验比较。

2.1 Deep Learning-based Semantic Code Search

如图3所示,基于深度学习的语义代码搜索的整体过程包括三个主要阶段:离线训练、离线代码嵌入和在线代码搜索。 首先,深度神经网络将大规模语料库<𝑐𝑜𝑑𝑒,𝑑𝑒𝑠𝑐𝑟𝑖𝑝𝑡𝑖𝑜𝑛>对作为输入并将它们映射到统一的高维向量空间,具有相似语义的代码片段和描述被嵌入到空间的附近向量( 训练阶段)。 然后,使用经过训练的模型为给定代码库中用户想要搜索的每个代码片段计算一个向量(嵌入阶段)。 最后,在线查询(例如 How to read an object from xml?)在到达时也嵌入到向量中。 通过计算向量相似度,将向量与查询向量相似的代码片段(如图 1 中的代码片段)返回并推荐给用户(在线代码搜索阶段)。

Figure 3: Deep learning based code search process 

直观地说,在训练阶段学习到的向量表示的质量决定了解决方案在执行代码搜索中的有效性。 为了返回在语义上与查询𝑄高度匹配的代码片段𝑆,代码搜索模型需要学习𝑄和𝑆之间的相关性𝑓,即,

为此,模型训练有望产生代码片段及其相应描述的紧密表示。 给定一组代码片段𝑆和它们的自然语言描述𝐷,这个阶段的任务可以表述为:

其中 是一个嵌入函数,用于将代码片段描述𝐷映射到𝑑维向量空间𝑉作为向量, 是一个嵌入函数,用于将代码片段𝑆映射到 与 相同的向量空间。 𝐽 (·, ·) 是一个度量函数(例如余弦相似度),用于对 和 之间的相似度进行评分。 在训练期间,该模型的指导思想是在代码片段𝑆与其正确描述之间产生更高的相似性,同时在𝑆与其错误描述之间产生更低的相似性。 训练模型后,可以通过分别由函数𝜙和𝜑嵌入的向量轻松设置𝑄和𝑆之间的相关性𝑓。

 2.2 Mainstream Models for Code Search

我们的 G2SC 旨在改进多模式和预训练模型。 本工作考虑了来自两个主流解决方案系列的四个代表性作品,包括两个多模态模型 DCS [13] 和 MMAN [45],以及两个预训练模型 CodeBERT [10] 和 GraphCodeBERT [16]。

A. Multi-modal Models

1.) 深度代码搜索 (DCS):DCS 是 Gu 等人提出的第一个基于深度学习的代码搜索模型。 它通过提取和融合三个方面的信息来学习代码表示,即用于源代码中包含的标记(主体标记)的多层感知器(MLP)和用于方法名称和方法名称的递归神经网络(RNN)[33] API序列。 但是,DCS 会忽略代码可能包含的结构信息。

2.) 多模态注意力网络(MMAN):MMAN 是 Wan 等人提出的最先进的多模态模型,它将代码结构信息引入到代码搜索任务中 [45]。 它嵌入了 TreeLSTM 的 ASTs、GGNN(门控图神经网络)的 CFGs 和 LSTM 的代码序列,然后是注意力融合层,将它们集成到表示整个代码的单个向量中。 然而,MMAN 忽略了一个事实,即代码图通常很小并且包含多样化的信息(例如 PDG 中的控制依赖和数据依赖)。

B. Pre-trained Models

1.) CodeBERT:CodeBERT 是 Feng 等人提出的第一个可用于代码搜索的预训练模型。 受BERT[7]的启发,采用Transformer架构,使用MLM(Masked Language Model)和RTD(Replaced Token Detection)两个预训练任务,学习通用模型参数,用于一组代码相关的下游任务,如code search, code summarization 等。由于它不是单独为代码搜索任务设计的,用户需要进行额外的微调才能返回查询结果。 但是,CodeBERT 仍然忽略代码结构信息。

2.) GraphCodeBERT:GraphCodeBERT 是最先进的预训练模型,可用于 Guo 等人提出的代码搜索。 它是 CodeBERT 的升级版本,引入了捕获数据流的可变图结构[16]。 除了 CodeBERT 中的 MLM 任务外,它还使用了两个更多可变的特定于图的预训练任务,即边缘预测和节点对齐,以及图引导的掩蔽注意功能。 然而,GraphCodeBERT忽略了变量关系以外的丰富语义信息,如图2(a)中的控制关系。

3 THE GRAPH-TO-SEQUENCE CONVERTER

码图的独特性给现有的语义码搜索模型带来了巨大的挑战。 为了提高它们的有效性,确保数据能够得到支持并很好地适应学习模型可能是一种很有前途的方法。 不幸的是,如第 1 节所述,现有学习模型(甚至 GNN)的能力对于学习代码图并不是那么友好。

为了解决这个问题,我们提出了一种基于图形到序列转换器 (G2SC) 的解决方案。 图4给出了在代码搜索模型中使用G2SC的整体框架,它是整个代码搜索过程的核心。 一旦训练出有效的代码搜索模型,我们只需在图 3 中的后两个阶段(即离线代码嵌入和在线代码搜索)应用 G2SC,即可找到与用户指定的自然语言查询高度匹配的代码片段。

如图 4 所示,我们的解决方案包括两个主要组件:1.) G2SC 模块。 将码图转化为一种模型友好的数据格式,代码序列可以无损地保留码图结构信息以及与边和节点相关的关键属性信息; 2.) 支持 G2SC 的模型。 通过学习 G2SC 转换的序列和其他代码信息,例如代码文本信息和自然语言描述,通过精心设计的不同策略,我们能够开发各种支持 G2SC 的模型。

 Figure 4: Overall framework of using G2SC for code search

在本节中,我们重点介绍 G2SC 模块。 它首先通过特定的图遍历将代码图转换为唯一对应的节点序列。 然后,它通过用相应的语句替换每个节点来获得语句序列。 一套精心设计的图遍历规则保证了过程是一对一的、可逆的。 因此,图结构信息以无损的方式保留在转换后的序列中。 为了便于演示,我们将使用 PDG 来解释𝐺2𝑆𝐶。 一个原因是 PDG 是一个比 CFG [11] 等其他代码图更复杂的代码图,具有控制依赖性和数据依赖性。 另一个原因是 PDG 在我们提出的模型中被用作图形特征。 请注意,𝐺2𝑆𝐶 可以轻松扩展以处理不同类型的代码图,如 CFG 等。

算法 1 提供了我们的图形到序列转换器算法的详细信息。 在第一步中,给定一个 PDG,我们需要为我们想要生成的 PDG 序列识别序列入口节点。 由于PDG只有一个根节点,因此可以直接选择一个PDG的根节点  作为整个PDG序列的入口  (算法1第1行)。 之后,从节点  开始,按照以下规则依次递归选择一条边进行扩展: 1.) 在前向边(端点已遍历的边)之前选择回溯边(端点已遍历的边) 没有被遍历过); 2.) 当有多个回溯边或只有多个前向边时,我们可以选择控制依赖边或数据依赖边进行第一步后的遍历。 任一优先级都可以产生唯一的结果。 在我们的图到序列算法中,我们将控制依赖边设置为具有更高的优先级(算法 1 第 4-8 行); 3.) 如果经过第二步仍然不能确定边,我们选择端点优先级最高的边作为优先扩展边。 在我们的方法中,节点的优先级由它们在代码片段(算法 1 函数 Edge_Check)中对应语句的顺序决定; 4.) 特别是,如果没有连接边,遍历将继续返回到最近的祖先节点,其中至少有一条边未被遍历(算法 1 第 9-11 行)。 在遍历PDG的过程中,我们可以按照以下两个步骤来生成我们提出的PDG序列(算法1函数Sequence_Expand): (1) 如果遍历的边𝑒是控制依赖边,我们只将𝑒指向的节点的属性添加到 生成的 PDG 序列𝑆; (2) 如果遍历的边𝑒是数据依赖边,我们将𝑒的属性和𝑒指向的节点的属性依次添加到𝑆。

 Figure 5: Process of converting PDG to sequence

 这里我们举一个图5的例子来说明如何将一个PDG转换成它唯一对应的序列。 给定图 5 中的 PDG,节点的顺序是它们在程序中执行的顺序,虚线表示控制依赖边,实线表示数据依赖边及其属性 。 第一次遍历是 ,因为根节点𝑎是程序入口。 第二次遍历是 ,因为根据我们提出的边扩展规则,需要先遍历控制依赖边。 第三次遍历是 ,其中边的属性是 ,因为我们定义回溯边的优先级最高。 在第四次遍历中,我们回到  ,所以遍历是。 第五次遍历,我们从𝑑遍历回溯边,即 ,其中边的属性为。 之后,由于𝑑和  没有后续节点,我们返回最后一次遍历 ,其中边的属性为  。 至此,我们可以通过图5所示的遍历过程得到PDG的边序列。在PDG序列中,控制依赖边没有属性,它只表示两个节点之间的控制依赖。 然后,我们用每个框右下角的数字来表示它对应的序列(例如○ 1 表示序列{𝑎,𝑏},○ 3 表示序列{ , ,})。 最后,将所有的圆按数字顺序连接起来,得到PDG序列。 注意:图到序列算法也是可逆的。 鉴于上面得到的 PDG 序列,我们可以通过从头开始一次选择两个相邻节点来恢复遍历过程(例如第一个 {𝑎,𝑏} → ○ 1 ,第二个 {, } → ○ 2 ,第三个 { , ,𝑎} → ○ 3 等等)。 之后,我们只需要按照圆圈中数字的顺序重新连接边,就可以重新获得图5中的PDG。由于这个过程是可逆的,所以在通过我们的图到序列算法转换序列时,不会丢失任何信息 . 需要注意的是,图到序列算法只需要线性时间消耗,这意味着它不需要太多时间来进行PDG预处理。

4 G2SC ENABLED MODELS

G2SC 启用模型是我们解决方案的第二个组成部分。 𝐺2𝑆𝐶 被设计为通用转换器,可以赋能各种学习模型以整合代码图以进行有效的代码搜索。 因此,它可以很容易地合并到其他模型中。 在本节中,我们以两种主流模型为例,介绍两种 G2SC enabled 模型,即 GSMM(G2SC enabled multi-modal model)和 GSCodeBERT(G2SC enabled CodeBERT 模型)。

4.1 Data Pre-processing

预处理是基于大规模训练语料库进行的。 对于多模态模型,我们首先提取一组成对的代码片段及其相应的描述。 对于描述部分,我们将所有的单词提取出来,通过JAVA分词API(/)进行排序,得到一个token序列。 对于代码部分,我们采用同样的方法从代码片段中提取Body Token(函数体中的标记)和Method name(函数名)。 与 DCS 类似,我们在源代码中将令牌视为无序的。 此外,我们通过提取工具 TinyPDG () 从代码片段中提取 PDG。 然后,使用我们在第 3 节中提出的 G2SC 将所有 PDG 转换为 PDG 序列。对于预训练模型,CodeBERT 和 GraphCodeBERT 都在其下游任务中提供预处理源程序。 因此,我们可以直接在我们的 GSCodeBERT 中使用它们。

4.2 G2SC Enabled Multi-modal Model

 Figure 6: The pipeline of GSMM. The red box is our converter G2SC.

首先,我们介绍支持 G2SC 的多模态模型 GSMM。 特别是,GSMM 利用 MLP 学习 Body Tokens,BiLSTM 学习 Method Name 和 PDG sequence,并采用注意力机制将三种代码特征结合起来。 GSMM 与其他多模态模型的主要区别在于 GSMM 使用 G2SC 转换的 PDG 序列进行码图结构学习。

GSMM 的整体框架如图 6 所示。输入代码片段表示为 ,其中 是代码片段。 对于每个代码片段,它被表示为其method names, Body Tokens and PDG 的组合:

其中  表示  标记的有序序列中的方法名称,是作为标记集的 Body Tokens,𝑃 𝑖 = {𝑉 𝑖 , 𝐸 𝑖 } 是 PDG。 GSMM首先通过Text level representation、Graph level representation和Attention-based fusion三个组件嵌入代码片段,然后通过描述表示组件采集自然语言描述的embedding。 最后,通过模型训练推断代码片段与其自然语言描述之间的相关性。 接下来,我们分别详细介绍这五个步骤。

文本级表示:GSMM的文本级表示模型与DCS类似。 它将代码片段主体中的方法名称和令牌视为文本级别。 对于方法名分解为标记序列,GSMM 使用带最大池化的 BiLSTM 嵌入骆驼分裂标记序列:

其中 𝜔() 是词嵌入层,用于将每个方法名称标记 嵌入到 𝑑 维向量中;  和 反向分别表示 BiLSTM 中前向和后向 LSTM 的隐藏状态; [𝑎;𝑏]∈ 表示两个向量的串联。 BiLSTM 的最终隐藏状态 由相应的  和 反向 联合表示。 因此,方法名称被嵌入为 𝑑 维向量 𝑚。 至于Body Tokens  ,考虑到DCS认为它们在源代码中没有严格的顺序,我们也通过一个MLP层嵌入它们: 

其中 𝜔() 将每个标记  嵌入到一个 𝑑 维向量中,是可训练参数的矩阵。 所有隐藏状态 通过最大池化汇总为 Body Tokens 的单个向量 𝑡。 图级表示:给定一个 PDG 序列 ,它已经被我们的 G2SC 处理过,我们采用另一个带有最大池化的 BiLSTM 来嵌入它:

其中 𝜔() 是词嵌入层,用于将 PDG 序列中的每个标记 嵌入到 𝑑 维向量中。 另外,GSMM通过类似方法名的maxpooling得到最终的PDG序列表示𝑝。 

Attention-based fusion layer: 最后,通过注意力融合层将三个方面的向量融合为一个向量:

 其中代表每个向量的注意力权重。 输出向量𝑐代表代码片段的最终嵌入。 描述表示:对于自然语言描述, GSMM 使用带最大池化的 BiLSTM 嵌入骆驼分裂标记的序列:

 其中 𝜔() 是词嵌入层,用于将每个描述词 嵌入到 𝑑 维向量中。 另外,GSMM通过maxpooling得到最终的描述表示𝑑。

Model training:我们跟随 Gu[13] 和 Wan[45] 训练 GSMM 模型,以类似的协调将代码片段和描述联合嵌入到中间语义空间中。 联合表示的目标是,如果代码片段和描述具有相似的语义,则它们的嵌入向量应该彼此接近。 换句话说,给定任意代码片段𝐶和任意描述𝐷,GSMM 预测𝐶 和𝐷 的相似性。 在训练期间,我们将三元组 <𝐶, 𝐷+, 𝐷−> 馈入模型。 对于每个代码片段𝐶,都有一个正面描述𝐷+(对𝐶的正确描述)和一个负面描述(对𝐶的错误描述)𝐷-从所有𝐷的池中随机选择。 对于任何给定的一组 <𝐶,𝐷+,𝐷−> 三元组,GSMM 预测 <𝐶,𝐷+> 和 <𝐶,𝐷− > 对的余弦相似度,并minimizes the hinge range loss:

 其中𝜃表示模型参数; 𝑃表示训练数据集,𝜖是机器学习中常用的松弛变量,常设为0.05; 𝑐、𝑑+和𝑑−是𝐶、𝐷+和𝐷−的嵌入向量。 排名损失背后的直觉是推动模型预测代码片段与其正确描述之间的高相似度以及代码片段与其错误描述之间的低相似度。

 4.3 G2SC Enabled CodeBERT Model

接下来,我们介绍支持 G2SC 的 CodeBERT 模型 GSCodeBERT。 与其他预训练模型一样,CodeBERT 由两个阶段组成:预训练和微调。 由于预训练CodeBERT的源代码没有发布,我们在CodeBERT的下游任务中只使用了G2SC。

​​​​​​​

Figure 7: The pipeline of GSCodeBERT.

图 7 提供了 GSCodeBERT 的整体流水线。 每个输入代码片段被分解成两对 (𝐷,𝑆) 和 (𝐷, 𝑃)。 是标记,𝑖∈{1, 2, · · · ,𝑛}的序列,提取自代码片段的自然语言描述𝐷。 是标记序列 , 𝑗∈{1, 2, · · · ,𝑚},是从程序语言代码序列𝑆中提取出来的。  是标记序列 , 𝑡∈{1, 2, · · · ,𝑘},从我们的 𝐺2𝑆𝐶 转换后的 PDG 序列𝑃 中提取。 所有的 (𝐷,𝑆) 对和 (𝐷, 𝑃) 对分别被输入到预训练的 CodeBERT 模型中,带有一个特殊的标记 [𝐶𝐿𝑆],表示 𝐷 和 𝑆(或 𝑃)之间的语义相关性,作为下游 fine-tuning任务。 这使我们的 GSCodeBERT 模型能够增加对代码结构信息的理解,同时保留 CodeBERT 对自然语言和代码序列的理解。

Model fine-tuning: 我们使用二元分类损失函数微调模型,其中使用 softmax 层将输出向量𝐶𝑙𝑎𝑠𝑠𝐿𝑎𝑏𝑒𝑙 映射到 [0, 1] 之间的分数。 分数越高表示代码 Sequence/PDG Sequence 与自然语言的相似度越高。 我们的微调任务由两部分组成。 一个是自然语言描述𝐷和PDG序列𝑃之间的相似性,另一个是𝐷和代码序列𝑆之间的相似性。 它们都使用类似的损失函数,公式如下:

 其中𝜃表示模型参数; 𝐸 表示训练集; 𝐷表示自然语言描述,𝑋可以是代码序列𝑆或PDG序列𝑃; 𝜖 是一个松弛变量,类似于方程(10)中的那个; [𝐶𝐿𝑆] 是一个特殊标记,指示 (𝐷,𝑋) 是正样本还是负样本。 所有 (𝐷,𝑋) 对都作为正样本。 (𝐷,𝑋−)和(𝐷−,𝑋)都是负样本,它们具有均衡的实例数,并且是通过将(𝐷,𝑋)中的𝐷或𝑋分别随机替换为𝐷−或𝑋−而创建的。 函数𝑠𝑐𝑜𝑟𝑒()用于计算相似度。 我们的损失函数旨在增加(或减少)序列𝑋与其正确(或错误)描述𝐷之间的相似性得分。

4.4 Code Search

训练模型后,对于具有给定代码库𝐶和给定查询𝑞的多模态模型,目标是根据与查询𝑞的相似性对所有这些代码片段进行排名。 我们首先将代码片段𝑐输入GSMM并将查询𝑞作为描述输入以获得它们相应的表示,表示为𝑐和𝑞。 然后我们计算排名分数如下:

其中𝑐和𝑞分别是代码和查询的向量。 相似度越高,代码与查询的语义相关性就越高。 对于每个查询,GSMM 返回前 10 个最相关的结果。

对于预训练模型,如第 4.3 节所述,对于每个查询 𝑞,我们将 𝑞 与所有代码序列 𝑐 ∈ 𝐶 配对提供给模型。 输入形式化为([𝐶𝐿𝑆]𝑞[𝑆𝐸𝑃]𝑐)。 经过CodeBERT处理后,返回[𝐶𝐿𝑆]对应的tag embedding。 此外,我们通过如下所示的经过训练的下游分类器计算相似度:

​​​​​​​

 其中𝑐和𝑞分别是代码序列和查询。 [𝐶𝐿𝑆] 是对应于每个 (𝑐,𝑞) 对的特殊标记。 𝐷𝑇()表示对CodeBERT处理的Class Label打分的Downstream Task。 此外,较高的相似度表示代码与查询之间的匹配度越高。

5 EXPERIMENT

5.1 Research Questions

我们的实验以回答以下研究问题为指导:

RQ1:G2SC 可以在多大程度上改进用于语义代码搜索的最先进的多模态模型? 我们在两个真实数据集的代码搜索中将我们的 GSMM 与 DCS 和 MMAN 进行比较,以证明 G2SC 可以有效提高多模态模型的有效性。

RQ2:G2SC 可以在多大程度上改进最先进的基于 CodeBERT 的语义代码搜索模型? 我们通过整合我们的 PDG 序列来提升 CodeBERT,并将我们的 GSCodeBERT 与最先进的预训练模型 CodeBERT 和 GraphCodeBERT 进行比较。

RQ3:我们提出的模型如何使用由 G2SC 转换的其他特征? 由于 G2SC 还可以使用一些其他代码特征,我们设计了一系列实验来展示为多模态模型和预训练模型选择文本信息和 PDG 的好处。

5.2 Experiment Setup

5.2.1 Data Set.

在我们的实验中,我们使用了两个不同的数据集,包括 CodeSearchNet 和 JAVA-2M。 在 [13] 和 [45] 之后,我们基于 CodeSearchNet [22] 的源代码构建了我们的第一个数据集作为我们的第一个数据集。 特别是,原始数据集包含 542,991 个 java 代码片段。 在删除无法提取其 AST、API、CFG 或 PDG 的代码片段后,我们保留 390,504 个片段作为最终的训练数据集。

为了进一步研究模型处理大型数据集的能力,在 [13、22] 之后,我们通过以下三个步骤构建了第二个更大的数据集 JAVA-2M:1.) 我们下载了 2016 年 8 月至 2020 年 9 月发布的 Github 存储库 通过 Github API 标记为 Java 的编程语言。 在[13]的基础上,我们将存储库的最小星数设置为10,以确保代码质量。 2.) 为了提供具有自然语言描述的模型代码片段,我们在代码片段之前保留了从存储库中提取的带有英文注释的Java 方法。 并且我们去掉了没有注解或者其他语言注解的方法。 因此,每个方法都由代码片段及其相应的自然语言注释组成。 3.) 我们从所有提取的方法中提取 API、AST、CFG 和 PDG,并丢弃那些没有这些信息的方法。 最后,JAVA-2M 包含 2,141,921 个 Java 方法。

对于代码库,我们使用与 Husain 等人[22] 提供的 CodeBERT 相同的代码库。 并保留包含所有 API、AST、CFG 和 PDG 信息的方法。 这些方法与训练语料库不同,因为它们被孤立地考虑并且包含没有描述的代码。 最后,我们得到 1,569,525 个候选方法作为我们的代码搜索库。

5.2.2 Experiment Setting.

为了训练 GSMM,我们将批量大小设置为 64。我们将词汇量设置为 10,000,以确保语料库的单词覆盖率达到 95% 以上。 受[13]的启发,我们将方法名、自然语言和token的最大长度分别设置为6、20和50。 我们截断长度超过最大长度的序列。 低于最大长度的序列用特殊标记 <PAD> 填充到最大长度。 对于 LSTM 单元,我们将隐藏大小设置为 256。同样,对于 MLP,嵌入向量维数设置为 512。我们利用 Adam [24] 优化器更新参数。 为了使模型具有更好的泛化能力,我们将 dropout rate 设置为 0.25。 所有实验均使用 PyTorch 1.2 和 Python 3.7 实现,并且实验在具有 2 Nvidia RTX 2080Ti 的服务器上进行。 我们遵循原作者发布的相同参数,并将它们应用于所有考虑的算法以进行公平比较(DCS()、CodeBERT 和 GraphCodeBERT(https:// github/microsoft/CodeBERT))。

5.3 Answer to RQ1

为了回答 RQ1,我们测量了 GSMM、GSMM-w/o.A(没有注意的 GSMM)、DCS 和 MMAN 在两个真实数据集 CodeSearchNet 和 JAVA-2M 上的有效性差异。

表 1 显示了 GSMM、DCS 和 MMAN 在 CodeSearchNet 上的性能。 结果表明 GSMM 在所有评估指标上始终优于 MMAN 和 DCS。 例如,GSMM 在 MRR、R@1、R@5 和 R@10 方面分别比 MMAN 高出 62%、55%、45% 和 24%。 GSMM 在 MRR、R@1、R@5 和 R@10 方面分别优于 DCS 81%、70%、61% 和 29%。

我们按照相同的设置在 JAVA-2M 上进行实验。 如表 2 所示,与 DCS 和 MMAN 相比,GSMM 在所有指标上都有显着改善。 例如,GSMM 在 R@1、R@5、R@10 和 MRR 上分别将 MMAN 提高了 92%、43%、16% 和 63%,同时它的性能分别优于 DCS 150%、90%、30% 和 100% 在 R@1、R@5、R@10 和 MRR 方面。 此外,表 3 中的 FRank 统计数据显示 GSMM 的 NF(未找到)少于两个基线。 这意味着 GSMM 可以回答更多的问题,并且 GSMM 推荐的正确代码片段在推荐列表中排名靠前。

为了进一步研究 GSMM 的性能改进,我们将 GSMM-w/o.A(没有注意机制的 GSMM 版本)与表 1 和表 2 中所示的基线进行比较。从结果中我们可以看出,即使没有注意机制,GSMM 仍然优于其他基线,如 DCS、MMAN。 例如,GSMM-w/o.A 在 CodeSearchNet 数据集上的 MRR 分别比 DCS 和 MMAN 高 27% 和 14%,在 JAVA2M 数据集上的 MRR 比 DCS 和 MMAN 高 29% 和 58%。 这进一步验证了 GSMM 搜索有效性的提高不仅来自注意力机制,还来自代码图的特征学习。

此外,结果表明 GSMM 显着优于两个基线。 GSMM 优于 DCS 的潜在原因可能是 GSMM 使用 G2SC 从代码图中学习了更丰富的语义信息,而 DCS 无法利用代码图信息。 GSMM 优于 MMAN 的原因有两个。 首先,代码图的大小通常很小。 如第 1 节所示,GNN 通常在大规模图上表现更好。 得益于 G2SC,GSMM 可以通过对代码图执行特定的遍历并将它们无损地转换为 BiLSTM 可以轻松学习的序列来解决这个问题。 另一个原因是 MMAN 没有利用 GNN 代码图中的节点属性信息。 代码图中每个节点的属性就是该节点对应的语句,其信息正是属性图嵌入所需要的。 G2SC 不仅可以保存节点之间的结构信息,还可以保存节点内部令牌的顺序。 这样,代码语句的信息也可以原封不动地保留下来。

Answer to RQ1: GSMM outperforms the state-of-the-art model MMAN and DCS significantly in terms of all the evaluation metrics for code search.

5.4 Answer to RQ2

为了探索我们的 G2SC 是否可以改进预训练模型,我们选择了两个最近的知名模型 CodeBERT 和 GraphCodeBERT 进行比较。 如第 4.3 节所述,GSCodeBERT 基于代码序列和 G2SC 转换的 PDG 序列进行微调。

 表 4 展示了 CodeBERT、GraphCodeBERT 和我们的方法 GSCodeBERT 的性能。 结果表明,GSCodeBERT 的性能明显优于 CodeBERT,例如,在 MRR 和 R@1 方面分别提高了 13% 和 25.7%。 潜在的原因可能是 CodeBERT 可以进一步利用代码片段中的结构信息,在 G2SC 的支持下学习代码片段和自然语言之间更好的映射。 与 GraphCodeBERT 相比,GSCodeBERT 在所有指标上均取得了更好的性能,例如 MRR 为 11.5%,R@1 为 22%。 原因可能是 GraphCodeBERT 使用了一个自创的变量图,它只包含变量之间的结构信息。 不同的是,我们的 PDG 序列携带了更丰富的信息,例如代码片段的控制依赖性和数据依赖性。

Answer to RQ2: By integrating G2SC into CodeBERT, the performance can be significantly improved for code search, even better than GraphCodeBERT by large margin in terms of R@1 and MRR.

5.5 Answer to RQ3

为了探索我们模型中潜在的最佳特征组合,我们设计了一个实验,将常用代码特征与多种组合进行比较。 特别是,我们考虑了五种类型的代码特征,文本、API、AST、CFG 和 PDG。 我们使用 G2SC 将代码结构表示转换为代码序列,并使用 BiLSTM 进行特征嵌入。 对于 AST,我们遵循 [20] 并保留每个节点的属性以获得 AST 的序列属性而不是代码的原始序列。 对于AST和CFG,由于它们的边都没有属性,我们忽略了G2SC中边属性的相关判断。

表 5 给出了 GSMM 中五种特征和四种组合的比较。 结果表明,GSMM 在 PDG 中取得了最好的性能。 此外,我们发现 CFG 和 PDG 都比代码文本信息表现得更好。 这意味着图包含更丰富的语义信息。 但是,我们仍然可以观察到 Text 对性能有自己的贡献。 特别是,“Text+PDG”组合在所有考虑的组合中表现最好。

在表 6 中,GSCodeBERT (Text) 表示原始的 CodeBERT。 我们观察到与 GSMM 相似的结果,“Text+PDG”组合获得最佳性能,而“Text+CFG”表现次之。 特别是,“Text+PDG”组合在 MRR 和 R@1 方面优于“Text”13% 和 25.7%。

 Answer to RQ3: Adopting G2SC algorithm to convert PDG is more effective than other code features in performing semantic code search. Moreover, the combination of feature Text and PDG can achieve promising results in both multimodal models and pre-trained models.

5.6 Threats to Validity

在本文中,我们分析了所有模型在 CodeSearchNet 上的性能以及多模态模型在 JAVA-2M 上的性能。 两个真实的数据集都是从Github上收集的。 训练集包含具有相应描述的源代码,而[22]提供的搜索代码库包含所有源代码(包括没有描述的代码)。 根据 [13] 中的报告,我们认为这种重叠的过度拟合威胁并不显着。 从 Stack Overflow 收集的 50 个查询可以进一步满足真实世界的搜索,这些不是用于训练的代码片段的描述。

在我们的实验中,代码片段的人工评估是手动完成的,可能会受到人为偏见的影响。 为了减轻这种威胁,我们采取了以下两种预防措施: 1.) 我们将代码片段平均分为三部分,分发给三个开发人员; 2.) 开发人员举行公开讨论,以减轻 50 个查询的手动偏差。

6 RELATED WORK

Code search.

在代码搜索任务中,许多研究关注 API 推荐 [14,15,31,55]。 Li [28], Van [44] 和 Nguyen [35] 将代码片段表示为 API 集,并基于 Word2vec 模型表示 API 特征以推荐合适的 API。 陈等。 最近,随着 GitHub [13] 等开源代码存储库的增长,开发人员根据自己的需求搜索相关代码片段变得越来越普遍。 一些代码检索工具已经出现 [4, 25, 26, 36, 54]。 传统代码搜索工具基于关键字匹配。 特别是,代码片段和自然语言查询被视为标记集,并根据关键字的相似性推荐合适的代码片段[5,18,32,42]。 Lu [30] 等人通过 WordNet 在语义上扩展了查询。 Gvero [17] 等人。 允许英语和 Java 混合输入,并为 Java 构造和库调用构建了概率上下文无关语法。 Keivanloo [23] 等人。 使用代码克隆检测模型来支持发现工作代码示例。 随着深度学习的成功发展,Gu 等人。 [13]首先将深度学习技术应用于代码搜索,提出了DCS模型。 万等人。 [45] 提出 MMAN 进一步将代码的图信息引入到代码检索任务中。 除了代码特征(API[8]、AST[12, 51] 和 graph[45])和注意力 [9] 之外,研究人员还从其他方向改进了代码搜索模型。 姚等。 [52]引入了强化学习机制,并结合现有的代码搜索模型提高了搜索效果,单独使用强化学习模型的性能不如DCS。 叶等。 [53]将代码摘要任务与代码检索任务连接起来,通过对偶学习的方法同时学习这两个任务,以提高代码摘要和代码搜索的效果。

Deep code representation.

在软件工程中,还有其他与代码相关的工作[6、21、37、38、50],例如错误定位[27、27]、代码摘要[1、46、48]、克隆检测[49]和代码 完成[41]。 代码结构信息的引入也应用于这些深度代码表示任务。 Code2vec [3] 将代码片段转换为 AST,提取所有叶节点的路径信息,通过注意力机制学习代码特征来预测功能方法名称。 牟等人。 [34] 使用基于树结构的卷积神经网络来捕获 AST 中邻居节点的特征,并获得用于程序分类和源代码相似性检测的语义信息。 阿拉马尼斯等。 [2] 以 AST 为结构主干,在 AST 的基础上加入数据流信息和边信息,将 AST 转化为包含更多信息的图,并应用 GGNN 将其嵌入用于代码变量误用任务。 王等。 目前用于代码相关生成任务的 CodeT5[47],是基于 T5[39] 的预训练模型。 此外,CodeBERT [10] 和 GraphCodeBERT [16] 都设计了一个预训练模型来学习编程语言和自然语言之间的关系。 它们可以通过不同的下游任务应用于代码表示中的各种任务,例如本文描述的代码搜索任务。

7 CONCLUSION AND FUTURE WORK

在本文中,为了更好地学习代码图,我们提出了 G2SC,一种可以将图转换为无损序列以进行语义代码搜索的算法。 G2SC将图转化为一种特殊的序列,能够保留图的信息用于表示学习。据我们所知,这是第一次将这样的图转序列算法引入到语义代码搜索任务中,可以是 使用深度神经网络有效学习以捕获数据表示上的结构信息。 我们的实验结果表明,通过将 G2SC 引入多模态模型,GSMM 在代码搜索有效性方面显着优于最先进的多模态模型。 此外,我们将 G2SC 添加到预训练模型的下游任务中,并在代码搜索性能上取得了很大的提升。

未来,我们将进一步尝试将我们的 G2SC 应用到其他类型的代码搜索模型中。 我们将尝试研究我们提出的 G2SC 与这些模型的合作程度。

译自论文:.1145/3540250.3549087​​​​​​​

REFERENCES

[1] Miltiadis Allamanis, Hao Peng, and Charles Sutton. 2016. A convolutional attention network for extreme summarization of source code. In International conference on machine learning. 2091–2100.

[2] Miltos Allamanis, Daniel Tarlow, Andrew Gordon, and Yi Wei. 2015. Bimodal modelling of source code and natural language. In International conference on machine learning. 2123–2132.

[3] Uri Alon, Meital Zilberstein, Omer Levy, and Eran Yahav. 2019. code2vec: Learning distributed representations of code. Proceedings of the ACM on Programming Languages 3, POPL (2019), 1–29.

[4] Sushil Bajracharya, Trung Ngo, Erik Linstead, Yimeng Dou, Paul Rigor, Pierre Baldi, and Cristina Lopes. 2006. Sourcerer: a search engine for open source code supporting structure-based search. In Companion to the 21st ACM SIGPLAN symposium on Object-oriented programming systems, languages, and applications. 681–682.

[5] Sushil Krishna Bajracharya and Cristina Videira Lopes. 2012. Analyzing and mining a code search engine usage log. Empirical Software Engineering 17, 4-5 (2012), 424–466.

[6] Hoa Khanh Dam, Truyen Tran, and Trang Pham. 2016. A deep language model for software code. arXiv preprint arXiv:1608.02715 (2016).

[7] Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova. 2018. Bert:

Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805 (2018).

[8] Lun Du, Xiaozhou Shi, Yanlin Wang, Ensheng Shi, Shi Han, and Dongmei Zhang.

2021. Is a Single Model Enough? MuCoS: A Multi-Model Ensemble Learning for Semantic Code Search. arXiv preprint arXiv:2107.04773 (2021).

[9] Sen Fang, You-Shuai Tan, Tao Zhang, and Yepang Liu. 2021. Self-Attention Networks for Code Search. Information and Software Technology (2021), 106542.

[10] Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xiaocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, and Ming Zhou. 2020. CodeBERT: A Pre-Trained Model for Programming and Natural Languages (Findings of ACL, Vol. EMNLP 2020). Association for Computational Linguistics, 1536–1547.

[11] Jeanne Ferrante, Karl J Ottenstein, and Joe D Warren. 1987. The program dependence graph and its use in optimization. ACM Transactions on Programming Languages and Systems (TOPLAS) 9, 3 (1987), 319–349.

[12] Jian Gu, Zimin Chen, and Martin Monperrus. 2021. Multimodal Representation for Neural Code Search. In 2021 IEEE International Conference on Software Maintenance and Evolution (ICSME). IEEE, 483–494.

[13] Xiaodong Gu, Hongyu Zhang, and Sunghun Kim. 2018. Deep code search. In 2018 IEEE/ACM 40th International Conference on Software Engineering (ICSE). IEEE, 933–944.

[14] Xiaodong Gu, Hongyu Zhang, Dongmei Zhang, and Sunghun Kim. 2016. Deep API learning. In Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering. 631–642.

[15] Xiaodong Gu, Hongyu Zhang, Dongmei Zhang, and Sunghun Kim. 2017. DeepAM:

Migrate APIs with multi-modal sequence to sequence learning. arXiv preprint arXiv:1704.07734 (2017).

[16] Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, and Ming Zhou. 2021. GraphCodeBERT: Pre-training Code Representations with Data Flow. In 9th International Conference on Learning Representations, ICLR 2021, Virtual Event, Austria, May 3-7, 2021.

[17] Tihomir Gvero and Viktor Kuncak. 2015. Interactive synthesis using free-form queries. In 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering, Vol. 2. IEEE, 689–692.

[18] Emily Hill, Lori Pollock, and K Vijay-Shanker. 2011. Improving source code search with natural language phrasal representations of method signatures. In 2011 26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011). IEEE, 524–527.

[19] Weihua Hu, Matthias Fey, Marinka Zitnik, Yuxiao Dong, Hongyu Ren, Bowen Liu, Michele Catasta, and Jure Leskovec. 2020. Open graph benchmark: Datasets for machine learning on graphs. arXiv preprint arXiv:2005.00687 (2020).

[20] Xing Hu, Ge Li, Xin Xia, David Lo, and Zhi Jin. 2018. Deep code comment generation. In 2018 IEEE/ACM 26th International Conference on Program Comprehension (ICPC). IEEE, 200–20010.

[21] Xing Hu, Ge Li, Xin Xia, David Lo, Shuai Lu, and Zhi Jin. 2018. Summarizing source code with transferred api knowledge. (2018).

[22] Hamel Husain, Ho-Hsiang Wu, Tiferet Gazit, Miltiadis Allamanis, and Marc Brockschmidt. 2019. Codesearchnet challenge: Evaluating the state of semantic code search. arXiv preprint arXiv:1909.09436 (2019).

[23] Iman Keivanloo, Juergen Rilling, and Ying Zou. 2014. Spotting working code examples. In Proceedings of the 36th International Conference on Software Engineering. 664–675.

[24] Diederik P Kingma and Jimmy Ba. 2014. Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980 (2014).

[25] Koders 2020. /.

[26] Krugle 2020. //.

[27] An Ngoc Lam, Anh Tuan Nguyen, Hoan Anh Nguyen, and Tien N Nguyen. 2015. Combining deep learning with information retrieval to localize buggy files for bug reports (n). In 2015 30th IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 476–481.

[28] Xiaochen Li, He Jiang, Yasutaka Kamei, and Xin Chen. 2018. Bridging semantic gaps between natural languages and APIs with word embedding. IEEE Transactions on Software Engineering (2018).

[29] Jinting Lu, Ying Wei, Xiaobing Sun, Bin Li, Wanzhi Wen, and Cheng Zhou. 2018.

Interactive query reformulation for source-code search with word relations. IEEE Access 6 (2018), 75660–75668.

[30] Meili Lu, Xiaobing Sun, Shaowei Wang, David Lo, and Yucong Duan. 2015. Query expansion via wordnet for effective code search. In 2015 IEEE 22nd International Conference on Software Analysis, Evolution, and Reengineering (SANER). IEEE, 545–549.

[31] Fei Lv, Hongyu Zhang, Jian-guang Lou, Shaowei Wang, Dongmei Zhang, and Jianjun Zhao. 2015. Codehow: Effective code search based on api understanding and extended boolean model (e). In 2015 30th IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 260–270.

[32] Collin McMillan, Mark Grechanik, Denys Poshyvanyk, Qing Xie, and Chen Fu.

2011. Portfolio: finding relevant functions and their usage. In Proceedings of the 33rd International Conference on Software Engineering. 111–120.

[33] Tomas Mikolov, Martin Karafiát, Lukas Burget, Jan Cernock`y, and Sanjeev Khudanpur. 2010. Recurrent neural network based language model.. In Interspeech, Vol. 2. Makuhari, 1045–1048.

[34] Lili Mou, Ge Li, Lu Zhang, Tao Wang, and Zhi Jin. 2014. Convolutional neural networks over tree structures for programming language processing. arXiv preprint arXiv:1409.5718 (2014).

[35] Trong Duc Nguyen, Anh Tuan Nguyen, Hung Dang Phan, and Tien N Nguyen.

2017. Exploring API embedding for API usages and applications. In 2017 

IEEE/ACM 39th International Conference on Software Engineering (ICSE). IEEE, 438–449.

[36] ohloh 2020. /.

[37] Hao Peng, Lili Mou, Ge Li, Yuxuan Liu, Lu Zhang, and Zhi Jin. 2015. Building program vector representations for deep learning. In International Conference on Knowledge Science, Engineering and Management. Springer, 547–553.

[38] Chris Piech, Jonathan Huang, Andy Nguyen, Mike Phulsuksombati, Mehran Sahami, and Leonidas Guibas. 2015. Learning program embeddings to propagate feedback on student code. arXiv preprint arXiv:1505.05969 (2015).

[39] Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, and Peter J Liu. 2019. Exploring the limits of transfer learning with a unified text-to-text transformer. arXiv preprint arXiv:1910.10683 (2019).

[40] Mohammad Masudur Rahman and Chanchal K Roy. 2016. QUICKAR: Automatic query reformulation for concept location using crowdsourced knowledge. In 2016 31st IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 220–225.

[41] Veselin Raychev, Martin Vechev, and Eran Yahav. 2014. Code completion with statistical language models. In Proceedings of the 35th ACM SIGPLAN Conference on Programming Language Design and Implementation. 419–428.

[42] Steven P Reiss. 2009. Semantics-based code search. In 2009 IEEE 31st International Conference on Software Engineering. IEEE, 243–253.

[43] Ilya Sutskever, Oriol Vinyals, and Quoc V Le. 2014. Sequence to sequence learning with neural networks. arXiv preprint arXiv:1409.3215 (2014).

[44] Thanh Van Nguyen, Anh Tuan Nguyen, Hung Dang Phan, Trong Duc Nguyen, and Tien N Nguyen. 2017. Combining word2vec with revised vector space model for better code retrieval. In 2017 IEEE/ACM 39th International Conference on Software Engineering Companion (ICSE-C). IEEE, 183–185.

[45] Yao Wan, Jingdong Shu, Yulei Sui, Guandong Xu, Zhou Zhao, Jian Wu, and Philip Yu. 2019. Multi-modal attention network learning for semantic source code retrieval. In 2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 13–25.

[46] Yao Wan, Zhou Zhao, Min Yang, Guandong Xu, Haochao Ying, Jian Wu, and Philip S Yu. 2018. Improving automatic source code summarization via deep reinforcement learning. In Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering. 397–407.

[47] Yue Wang, Weishi Wang, Shafiq Joty, and Steven CH Hoi. 2021. Codet5: Identifieraware unified pre-trained encoder-decoder models for code understanding and generation. arXiv preprint arXiv:2109.00859 (2021).

[48] Bolin Wei, Ge Li, Xin Xia, Zhiyi Fu, and Zhi Jin. 2019. Code generation as a dual task of code summarization. In Advances in Neural Information Processing Systems. 6563–6573.

[49] Martin White, Michele Tufano, Christopher Vendome, and Denys Poshyvanyk. 2016. Deep learning code fragments for code clone detection. In 2016 31st IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 87–98.

[50] Xin Xia and David Lo. 2017. An effective change recommendation approach for supplementary bug fixes. automated software engineering 24, 2 (2017), 455–498.

[51] Ling Xu, Huanhuan Yang, Chao Liu, Jianhang Shuai, Meng Yan, Yan Lei, and Zhou Xu. 2021. Two-Stage Attention-Based Model for Code Search with Textual and Structural Features. In 2021 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER). IEEE, 342–353.

[52] Ziyu Yao, Jayavardhan Reddy Peddamail, and Huan Sun. 2019. Coacor: Code annotation for code retrieval with reinforcement learning. In The World Wide Web Conference. 2203–2214.

[53] Wei Ye, Rui Xie, Jinglei Zhang, Tianxiang Hu, Xiaoyin Wang, and Shikun Zhang.

2020. Leveraging code generation to improve code retrieval and summarization via dual learning. In Proceedings of The Web Conference 2020. 2309–2319.

[54] Hongyu Zhang, Anuj Jain, Gaurav Khandelwal, Chandrashekhar Kaushik, Scott Ge, and Wenxiang Hu. 2016. Bing developer assistant: improving developer productivity by recommending sample code. In Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering. 956–961.

[55] Jing Zhou and Robert J Walker. 2016. API deprecation: a retrospective analysis and detection method for code examples on the web. In Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering. 266–277.

​​​​​​​

更多推荐

How to Better Utilize Code Graphs in Semantic Code Search?

本文发布于:2024-02-26 15:02:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1702929.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Code   Utilize   Graphs   Search   Semantic

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!