在软件开发过程中,开发人员经常花费19%的时间搜索一些可重用的代码示例,以节省开发工作量[6,24,43]。为了提高开发效率,开发人员经常搜索和重用来自大规模开源存储库[33、42、64]的现有代码,如GitHub[1]。然而,开发一个令人满意的代码搜索引擎是一项挑战[11,24,40]。早期研究首先利用信息检索(IR)技术,例如基于Lucene的模型Koders1、Krugle2和Google代码搜索[28、33、46]。但这些模型只是将代码和搜索查询视为普通web搜索引擎的纯文本,并忽略了上下文中的编程信息[38]。为了捕捉代码和查询中的编程语义,研究人员提出了许多模型[5、9、15、17、19、31]。其中一个代表性模型是Erik等人[28]提出的Sourcerer,该模型将Lucene与代码结构信息集成在一起。另一个是Fei等人[32]提出的CodeHow,它将用户查询识别为相关API,并使用扩展布尔模型执行代码检索。然而,上述模型未能弥合代码中的编程语言和查询中的自然语言之间的语义鸿沟[14,15,41]。为了解决这个问题,Gu等人[56]提出了一种基于深度学习的模型,称为DeepCS3(深度代码搜索)。这是最先进的方法之一。DeepCS通过两个独立的LSTM(长短时记忆)模型将代码和查询嵌入到向量空间中,学习联合嵌入以对齐两个向量空间,最后将具有更高余弦相似度的代码返回给嵌入式搜索查询。他们的实验结果表明,DeepCS显著优于传统模型[56],包括Sourcerer[28]和CodeHow[32]。尽管深度计算与传统模型相比具有优势,但我们观察到其联合嵌入无法完全捕获代码和查询之间的语义相关性。例如,在图1中,DeepCS只能将查询中的“文件”一词与代码中的两个API“createNewFile()”和“FileWriter()”相关联,因为它们都包含关键字“file”。然而,根据开发人员的理解,其他四个API也应该与关键字“file”密切相关,包括“BufferedWriter()”、“write()”、“flush()”和“close()”。在实践中,任务(或查询)描述中使用的词语与与任务相关的API之间存在语义差异。[8, 11]. 因此,我们假设,如果不完全理解这种语义关联,DeepCS不太可能向开发人员的查询返回预期的代码
代码搜索是软件开发实践中非常常见的活动[57,68]。为了实现某种功能,例如解析XML文件,开发人员通常通过在大规模代码库上执行自由文本查询来搜索和重用以前编写的代码。已经提出了许多代码搜索方法[13、15、29、31、32、35、44、45、47、62],其中大多数基于信息检索(IR)技术。例如,Linstead等人[43]提出了Sourcerer,这是一种基于信息检索的代码搜索工具,将程序的文本内容与结构信息相结合。McMillan等人[47]提出了一个投资组合,通过关键字匹配和PageRank返回一系列函数。Lu等人[44]使用从WordNet获得的同义词扩展了一个查询,然后对方法签名执行关键字匹配。Lv等人[45]提出了CodeHow,通过扩展布尔模型将文本相似性和API匹配结合起来。基于IR的代码搜索的一个基本问题是自然语言查询中反映的高级意图与源代码中的低级实现细节之间的不匹配[12,46]。源代码和自然语言查询是异构的。它们可能不共享共同的词汇标记、同义词或语言结构。相反,它们可能仅在语义上相关。例如,查询“从xml读取对象”的相关片段可以如下所示:
现有方法可能无法返回此代码段,因为它不包含诸如read和object之类的关键字或它们的同义词,例如load和instance。因此,一个有效的代码搜索引擎需要在代码和自然语言查询之间建立更高层次的语义映射。此外,现有方法在查询理解方面存在困难[27,29,45]。它们无法有效处理查询中的不相关/嘈杂关键字[27]。因此,一个有效的代码搜索引擎还应该能够理解自然语言查询和源代码的语义,以提高代码搜索的准确性。在我们之前的工作中,我们介绍了DeepAPI框架[27],这是一种基于深度学习的方法,用于学习查询的语义和相应的API序列。然而,搜索源代码比生成API困难得多,因为933 2018 ACM/IEEE第40届软件工程国际会议
ICSE'182018年5月27日至6月3日,瑞典哥德堡顾晓东、张宏宇和金成勋代码段的语义不仅与API序列相关,还与其他源代码方面相关,如令牌和方法名称。例如,DeepAPI可以返回相同的API ImageIO。编写查询,将图像另存为png,将图像保存为jpg。然而,回答这两个查询的实际代码片段在源代码标记方面是不同的。因此,代码搜索问题需要能够利用源代码更多方面的模型。
Traditional
许多代码搜索引擎已经被开发用于代码搜索。它们主要依赖于传统的信息检索(IR)技术,如关键字匹配[13],或文本相似性和应用程序接口(API)匹配的组合[14]。
Reiss等人[3]开发了一个代码检索系统名为Sourcerer,通过概率主题模型学习源代码的语义表示。
Sourcerer(2009)
不断增加的公开源代码数量为挖掘和搜索软件存储库带来了新的挑战和机遇。在这里,我们介绍了Sourcerer,这是一个广泛的基础设施,用于下载、解析、存储和分析互联网规模的软件语料库,以及一个支持基于关键字和基于结构的查询的搜索引擎。在用4600多个开源项目填充Sourcerer之后,简单的统计分析验证了Java实体和关系之间存在稳健的幂律分布。然后,我们开发并应用了软件的概率主题和AT模型,作为一种自动提取程序功能、相似性和开发人员贡献的手段,以及量化熵散射和纠缠,应用范围从软件人员配置到重构。开发的方法适用于多个规模,从单个项目到互联网规模的存储库。最后,通过将基于术语的IR技术与从程序结构衍生的图形信息相结合,我们能够显著提高软件搜索和检索性能,提高软件开发人员识别、探索和重用现有开源实现的效率。
CodeHow(2015)
在本文中,我们提出了CodeHow,这是一种代码搜索技术,它应用扩展布尔模型来检索匹配用户自由文本查询的代码段。CodeHow可以识别查询引用的潜在API,并合并API信息以提高搜索结果的准确性。我们将CodeHow的后端实现为Azure云服务,前端实现为Visual Studio扩展。我们在一个包含26K个C#项目的代码库上进行了实验。我们的评估结果表明,CodeHow是有效的,并且优于传统的基于Lucene的代码搜索。我们还进行了一项对照实验和一项涉及微软开发人员和实习生的用户调查。结果证实了该工具的实用性。今后,我们计划解决第七节中讨论的问题。目前,CodeHow工具仅支持C#程序的代码搜索。我们计划支持更多的编程语言,如Java。我们还将研究从代码搜索结果合成示例使用代码的方法。
Deep Learning
最近,许多工作已经采取步骤,将深度学习方法[3,8,20,22,24]应用于代码搜索[2,4,5,7,10–12,18,23,25,26],使用神经网络捕捉自然语言查询和代码片段之间的深度和语义关联,并取得了令人鼓舞的性能改进。这些方法采用各种类型的模型结构,包括顺序模型[2,4,5,7,10,18,23,25,26]、图模型[6,12]和变换器[4]。
受计算机视觉和自然语言处理任务中深度学习成功的启发,深度学习已被应用于更好地表示克隆检测[7]和代码摘要[8]等任务的源代码。据我们所知,Gu等人[6]是第一个将深度学习网络应用于代码检索任务的人,该任务捕捉了中间语义空间中语义源代码和自然语言查询之间的相关性。
DeepCS(20180527)
为了实现程序功能,开发人员可以通过搜索大规模代码库来重用以前编写的代码段。多年来,人们提出了许多代码搜索工具来帮助开发人员。现有方法通常将源代码视为文本文档,并利用信息检索模型检索与给定查询匹配的相关代码段。这些方法主要依赖于源代码和自然语言查询之间的文本相似性。他们对查询和源代码的语义缺乏深入理解。本文提出了一种新的深度神经网络CODEnn(代码描述嵌入神经网络)。CODEnn不匹配文本相似度,而是将代码段和自然语言描述联合嵌入到高维向量空间中,使得代码段及其对应的描述具有相似的向量。使用统一向量表示,可以根据向量检索与自然语言查询相关的代码片段。还可以识别语义相关的词,并且可以处理查询中的不相关/嘈杂的关键字。作为概念验证应用,我们使用所提出的CODEnn模型实现了一个名为DeepCS的代码搜索工具。我们在从GitHub收集的大规模代码库上对DeepCS进行了经验评估。实验结果表明,我们的方法可以有效地检索相关的代码片段,并且性能优于以前的技术。
在本文中,我们提出了一种新的用于代码搜索的深度神经网络CODEnn。CODEnn学习源代码和自然语言查询的统一向量表示,从而可以根据向量检索与查询语义相关的代码片段,而不是匹配文本相似度。作为概念验证应用,我们基于所提出的CODEnn模型6实现了一个代码搜索工具DeepCS。我们的实验研究表明,所提出的方法是有效的,性能优于相关方法。
Fusion
MMAN(20191101):
在本文中,我们提出了一种具有注意机制的新型多模态神经网络MMAN,用于代码检索任务。除了考虑源代码的顺序特征(如令牌和API序列)外,MMAN还考虑了代码的结构特征(如AST和CFG),以学习更全面的语义表示,便于代码理解。此外,我们提出了一种注意机制来解释代码各部分的贡献。此外,我们提出了一个统一的框架来同时学习代码表示和自然语言查询的表示。我们的实验研究表明,所提出的方法是有效的,并且优于现有的方法。
Improving Code Search with Co-Attentive Representation Learning(20200713):
为开发人员开发一个令人满意的代码搜索引擎一直是一个具有挑战性的问题。最近,Gu等人[56]提供的基于深度学习的代码搜索模型DeepCS被证明优于传统的基于IR的模型,如Sourcerer[28]和CodeHow[32]。通常,DeepCS通过两个LSTM模型分别嵌入代码和查询,并通过组合嵌入优化模型,因此可以通过将具有更高余弦相似度的代码返回到搜索查询来完成代码搜索。然而,单个嵌入很难捕获代码和查询之间的相互依赖关系。为了克服这一挑战,我们提出了一种改进的模型,名为CARLCS-CNN7,该模型利用CNN与共同注意机制相关联,在单独嵌入后学习代码和查询的相互依赖表示。自动评估表明,提出的CARLCS-CNN在MRR方面显著优于深度CS 26.72%。此外,运行CARLCS-CNN在模型训练上比深度CS快5倍,在模型测试上快4倍,因为其网络结构不太复杂。因此,共注意表征学习有利于代码搜索。我们考虑两个未来的工作。首先,我们计划通过利用基于树的嵌入来增强代码表示,如Wan等人[50],并通过结合代码摘要的损失函数来改进查询表示,如Yao等人[60]。其次,我们计划提高训练数据的质量,因为代码注释并不总是代表开发人员查询的基本事实。
Multimodal Representation for Neural Code Search(20210702):
我们的工作是通过多模态学习方式将树序列化表示应用于代码搜索。我们的多模态表示模型的核心思想是利用代码片段的语义和句法信息。我们设计了一种新的树结构,称为简化语义树(SST)。SST在语义上比AST更具信息性,然后我们在SST上引入了几种树序列化方法来构建树序列化表示,以补充令牌表示。此外,我们将树序列化表示和令牌表示组合为多模态表示。我们的多模式学习模型遵循伪暹罗网络架构,并采用自注意力模型作为其编码器。最后,我们定义了直观的量化度量、链接覆盖率和节点覆盖率,以衡量令牌表示和树序列化表示所传递的语义信息和语法信息的完整性。在我们对大规模多语言语料库的实验中,考虑到上下文信息,自注意力模型是最令人满意的。在所有引入的树序列化表示中,基于遍历的表示通常比基于采样的表示性能更好。更多的结果表明,树遍历表示带来最多16.88%的改进,而多模态模型将MRR分数最多提高17.82%。我们建议尽可能采用树序列化表示以及多模式学习模型进行代码搜索。在未来,我们将探索我们的工作可能适用的其他软件工程问题。此外,我们将研究代码数据方面的更多方面,例如,研究与SST类似的现有新颖设计的细节。
Is a Single Model Enough? MuCoS: A Multi-Model Ensemble Learning Approach for Semantic Code SearchIs a Single Model Enough? MuCoS: A Multi-Model Ensemble Learning Approach for Semantic Code Search(20211026)
在本文中,我们提出了一种用于代码搜索的高级多模型体系结构。我们不需要为代码片段和查询训练单个模型,而是训练具有特定功能的多个模型并将它们组合起来,这可以帮助我们更好地捕捉代码片段和自然语言查询的不同含义。对于具有特定特征的训练模型,我们使用adata增强和分离策略来强制模型捕获特定视角的特征。然后我们使用集成学习策略来组合我们的模型。我们的实验研究表明,所提出的方法是有效的,并且优于其他现有方法。未来,我们计划在更多的数据集上评估我们的方法。我们将培训更多的个人学习者,关注更多的特点。
Enhancing Semantic Code Search with Multimodal Contrastive Learning and Soft Data Augmentation(20220407)
在本文中,我们提出了CoCoSoDa,它利用多模态收缩学习和软数据扩充进行代码搜索。软数据扩充有助于CoCoSoDa从序列级的角度学习代码段的表示。多模态对比学习可以将代码查询对的表示集合在一起,并将未配对的代码片段和查询分开。因此,CoCoSoDa可以学习代码片段和查询的序列级表示。我们使用六种编程语言(Ruby、JavaScript、Go、Python、Java、PHP)在大型基准数据集上进行了大量实验,结果证实了其有效性。我们还将CoCoSoDa应用于其他预训练模型RoBERTa RoBERTa(代码)和CodeBERT,并提高了它们在代码搜索方面的性能。我们还分配了不同的超参数,以检查它们对代码搜索的影响,并发现CoCoSoDa在一系列超参数上表现稳定。在我们未来的工作中,可以在我们的模型中考虑更多的上下文信息(如封闭类/项目和调用的API/方法),以进一步提高CoCoSoDa的性能。