【论文阅读-ASE 2020】利用单词重叠信息的代码检索 OCoR: An Overlapping-Aware Code Retriever
OCoR: An Overlapping-Aware Code Retriever
Conference: ASE 2020
Authors:
摘要
代码搜索任务是通过给出一段自然语言描述,模型能够找到一系列最相关的代码片段,由此来帮助开发人员重用代码。
然而现有的方法都无法来专门捕获一个重要的特征:单词重叠(overlaps)。
有不同的开发人员写的使用的不同名称可能是相关联的,比如“message”和“msg”它们表达的意思很可能是相同的。而且对于程序语言的变量名称和相应的自然语言描述之间的overlap也可能说明两者之间的相关程度。
本文提出的解决方案–OCoR:
- embds names by characters to capture overlaps
- introduces overlap matrix to represent the degree of overlaps
实验结果:
相比较于原来的SOTA,从13.1%提升到了22.3%。
简介
如下图所展示的例子,单词“join_table_b”与自然语言描述中的“join”和“table”存在重叠部分,以前的方法无法捕获这种overlap信息,而这篇论文中使用了字符级别的embedding来处理这种重叠信息,使得表达更加丰富。
下图展示了一个计算字符级别embedding和重叠矩阵的过程:
如图所示,在a图中,除了最后一个字符的向量外,这两个标识符的组合向量几乎是由相同的向量计算的。因此,这些标识符的最终嵌入在高维空间中是距离相近的。在b图中,展示了部分的重叠矩阵,可以看出单词“join_table_b”与自然语言描述中的“join”的匹配程度相对于其它单词较高。
模型
下图展示了模型的整体结构图:
其中 A ( C O D E , N L ) A(CODE, NL) A(CODE,NL) 和 A ( N L , C O D E ) A(NL,CODE) A(NL,CODE) 是重叠矩阵(Overlap Matrices)。
模型输入
模型的输入可以分为3部分:
- 自然语言描述
- 代码片段
- 重叠矩阵
其中重叠矩阵是根据自然语言描述和代码片段计算而来。
在此模型中考虑了NL和CODE的两种重叠矩阵,因为矩阵 A ( C O D E , N L ) A(CODE, NL) A(CODE,NL) 和 A ( N L , C O D E ) A(NL,CODE) A(NL,CODE) 的形状并不相同,所以此模型由此也分开了2个支线分别处理,后面再连接在一起。
Encoder
可以看出在模型框架图中的左上角和右上角展示了对于模型NL和CODE的分别编码。
编码器是一个包含了多个mechanism的栈,每一个mechanism中包含了3个sub-layers:
- self attention
- gating layer
- convoluational layer
在每一个mechanism之后,都用到有一个残差连接和正则化层。
编码信息连接
在Encoder多个mechanism之后,另外使用了max pooling进行池化。之后使用self attention关联两个编码的信息,在具体的关联中,会把另一边的编码信息作为Query输入到self attention中。
最后将输入的4个向量进行拼接,作为最后的MLP的输入信息,进而再进行预测。