Neural Code Summrization: 2016-2021年 论文解读 (一)

文章目录

    • What is code summarization
    • Example
    • Overview of neural code summarization method
    • Sequence model (序列模型)
      • Codenn: 第一篇使用Neural network来做code summarization
      • Deepcom: Structure-based 遍历的方式来展平AST(抽象语法树)
        • 插曲 what is AST
          • ---------------------------插曲结束------------------------------------
      • H-deepcom and Ast-attn-gru
      • Code2vec and Code2seq
      • A Transformer-based Approach for Source Code Summarization
      • Codebert
    • Tree-based model (树结构的模型)
      • Hybrid-DRL
    • Graph-based model (图结构的模型)
      • Structured neural summarization
      • Improved Code Summarization via a Graph Neural Network
    • 最新的SOTA: CAST: Enhancing Code Summarization with Hierarchical Splitting and Reconstruction of Abstract Syntax Trees
    • Summarization (小结)

What is code summarization

代码摘要(Code Summarization)生成任务自动生成自然语句 描述这段代码的功能。由于摘要能够精简地描述代码的功能、可读性强,所以良好的摘要可以帮助开发者更便捷地理解、重用和维护代码,大大提高生产效率。然而,现实中的摘要却存在着缺失、错误和未及时更新等问题,而且人为标注代码的摘要需要具有一定的专业知识背景,整个过程耗时耗力。因此,自动为代码生成摘要尤为重要。

Code Summarization evalaution的问题可以参考
Neural Code Summarization: How Far Are We?, 这篇文章已经被ICSE‘22所接受。

举些例子介绍一下code summarization.

Example

如下图所示,给定一段java method,他的summarization就是check whether a resource is occupied。
Neural Code Summrization: 2016-2021年 论文解读 (一)_第1张图片
当然这是个简单的例子,更复杂的例子是:

Neural Code Summrization: 2016-2021年 论文解读 (一)_第2张图片
他的summary是loop through each of the columns in the given table, migrating each as a resource or relation
这个需要深入理解for循环时loop throug某个object,嵌套的if-condition statement是要conditionally的migrate something。因此自动生成代码的摘要(summarization),需要根据代码的结构,逻辑,深入理解代码的语义,然后才能生成make sense的summarization。

Overview of neural code summarization method

Big data的时代,neural network在CV,NLP等领域取得了promising的结果,因此相当多的研究者试图使用neural network的方式做code summarization称之为Neural Code summarization method。根据使用的模型不同,可以分为三类Sequence model, Tree-based model 和 Graph-based model.

Sequence model (序列模型)

Codenn: 第一篇使用Neural network来做code summarization

Iyer, S., Konstas, I., Cheung, A., & Zettlemoyer, L. (2016). Summarizing source code using a neural attention model. 54th Annual Meeting of the Association for Computational Linguistics, ACL 2016 - Long Papers, 4, 2073–2083. https://doi.org/10.18653/v1/p16-1195

他是第一篇使用Neural network来做code summarization,把code summarization当作NMT(神经机器翻译问题),encode的时候,将code 当作text,一个word 一个word的feed to Neural network,,decode的时候,一个word,一个word的生成summarization
Neural Code Summrization: 2016-2021年 论文解读 (一)_第3张图片
Neural Code Summrization: 2016-2021年 论文解读 (一)_第4张图片
总结来说

  • Model: Sequence model ; Attentional LSTM
  • Dataset: c#
  • Metric : BLEU,METEOR
  • Cons(缺点): Regarding source code as simple plain text

Deepcom: Structure-based 遍历的方式来展平AST(抽象语法树)

Hu, X., Li, G., Xia, X., Lo, D., & Jin, Z. (2018). Deep code comment generation. Proceedings - International Conference on Software Engineering, 200–210. https://doi.org/10.1145/3196321.3196334

这篇文章的出发点是:

source code 里结构很丰富,自然语言可能不会一下嵌套好几个定语说一件事情The dog the stick the fire burned beat bit the cat.”,但是在source code种,嵌套,递归,循环,条件判断等结构处处可见,因此structure information很重要。而AST(Abstract syntax tree)包含了语法(syntax)和结构(structure)等信息。用AST来表示代码,将会得到更丰富的语义。

插曲 what is AST

回答我们之前的例子,给定一段代码,下面就是所得到的AST(抽象语法树),他可以告诉这段代码是一个method。modifier是public还是private, return type是boolen还是void等等。
在这里插入图片描述
Neural Code Summrization: 2016-2021年 论文解读 (一)_第5张图片

---------------------------插曲结束------------------------------------

但是当时比较好用的是sequence model,需要把树扔到sequence model,可以按照先序遍历等,但是这个遍历不可逆,而且会丢失结构信息,因此这篇文章提出了用Structure-based 遍历的方式来展平AST,及类似XML的格式来存储tree和graph。
Neural Code Summrization: 2016-2021年 论文解读 (一)_第6张图片
之前codenn的input是code sequence,Deepcom的input是Structure-based 遍历的方式来展平AST,叫做SBT。
Neural Code Summrization: 2016-2021年 论文解读 (一)_第7张图片
值得注意的是本文还关注到了OOV(out-of-vocabulary)的问题,为了解决OOV,用AST种的type表示变量名。
总结一下:

Motivation:

  • Using the structure inforamtion of source code

Challenge:

  • Source code is structured
  • Out of vocabulary (OOV)

Data:

  • Java: TL-CodeSum, 后联系作者,确认不是TL-CodeSum数据集,是Deepcom数据集

H-deepcom and Ast-attn-gru

  • H-deepcom: Hu, X., Li, G., Xia, X., Lo, D., & Jin, Z. (2019). Deep code comment generation with hybrid lexical and syntactical information. In Empirical Software Engineering. https://doi.org/10.1007/s10664-019-09730-9
  • Ast-attn-gru:Leclair, A., Jiang, S., & McMillan, C. (2019). A Neural Model for Generating Natural Language Summaries of Program Subroutines. Proceedings - International Conference on Software Engineering, 2019-May, 795–806. https://doi.org/10.1109/ICSE.2019.00087

这篇文章的出发点是:

结合source code的词法信息(lexical information)和结构信息(structure)的深度神经网络来更好地生成注释。lexical information就是本身一次变量名identifier表示的是啥,比如return F1_score中的F1_score本身这个变量名的就表示F1 score,就具有词汇方面的含义。如果我们知道结构信息,比如for loop里面是否嵌套了其他结构,嵌套的if中的条件语句是什么,for loop的结束条件等扽,对于整个code的functionality的理解也是很重要的。

Neural Code Summrization: 2016-2021年 论文解读 (一)_第8张图片

Code2vec and Code2seq

  • Code2vec: Alon, U., Zilberstein, M., Levy, O., & Yahav, E. (2019). Code2Vec: Learning Distributed Representations of Code. Proceedings of the ACM on Programming Languages, 3(POPL), 1–29. https://doi.org/10.1145/3290353

  • Code2Seq: Alon, U., Levy, O., Brody, S., & Yahav, E. (2019). Code2Seq: Generating sequences from structured representations of code. 7th International Conference on Learning Representations, ICLR 2019, 1, 1–22.

出发点:
已经不是局限在单纯做code summarization,是想做code presentation,将code表示成distribution vector。就是和自然语言的sentence2vec把一个sentence里的每个word表示成一个vector,word vector经过加权组合,avg pooling等来表示整个sentence。
它首先找来AST,把AST当作graph,经过random walk(随机游走)得到一些paths,然后用Sequence model去建模这些path,这里的path其实考虑到了AST的一些特性,就是叶子节点(leaf node)都是出现在source code中的,所以这里的path的起始点和终点都是leaf node
Neural Code Summrization: 2016-2021年 论文解读 (一)_第9张图片
简单总结
Approach

  • Represents a code snippet as the set of compositional paths in its abstract syntax tree (AST)
  • Uses attention to select the relevant paths while decoding.

Data: Java-small; Java-med; Java-large

A Transformer-based Approach for Source Code Summarization

. Ahmad, W. U., Chakraborty, S., Ray, B., & Chang, K.-W. (2020). A Transformer-based Approach for Source Code Summarization. http://arxiv.org/abs/2005.00653 ACL'21

本文中了ACL2020的short,是个初期工作。由于source code存在long-range(长期依赖)的问题,所谓长依赖,是声明和使用的位置距离比较长。之前的RNN很难解决整个问题,本文使用基于self-attention机制的transformer,并且用了relative position embedding而不是traditional 的绝对的positional encoding。附加的一个点,就是加了copy机制去handle OOV。

Motivation:

  • Modeling the non-sequential structure of source code.
  • Capturing the long-range dependencies between code tokens.

Data: Java TL-CodeSum; Python dataset

Codebert

出自微软亚洲研究院,第一个使用pre-train model来做code 相关的task。
Feng, Z., Guo, D., Tang, D., Duan, N., Feng, X., Gong, M., Shou, L., Qin, B., Liu, T., Jiang, D., & Zhou, M. (2020). CodeBERT: A Pre-Trained Model for Programming and Natural Languages. http://arxiv.org/abs/2002.08155 EMNLP2020

Tree-based model (树结构的模型)

Hybrid-DRL

Wan, Y., Zhao, Z., Yang, M., Xu, G., Ying, H., Wu, J., & Yu, P. S. (2018). Improving automatic source code summarization via deep reinforcement learning. ASE 2018 - Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering, 397–407. https://doi.org/10.1145/3238147.3238206
使用强化学习加上AST的结构信息来做code summarization
Neural Code Summrization: 2016-2021年 论文解读 (一)_第10张图片

Motivation

  • Their encoders only consider the sequential content of code, ignoring the tree structure which is also critical for the task of code summarization;
    • Their decoders are typically trained to predict the next word by maximizing the likelihood of next ground-truth word with previous ground-truth word given

Data: Python dataset

Graph-based model (图结构的模型)

Structured neural summarization

Fernandes, P., Allamanis, M., & Brockschmidt, M. (2019). Structured neural summarization. 7th International Conference on Learning Representations, ICLR 2019, 2018, 1–18.
Allamanis, M., Brockschmidt, M., & Khademi, M. (2018). Learning to represent programs with graphs. 6th International Conference on Learning Representations, ICLR 2018 - Conference Track Proceedings, 1–17.
这里就是给AST加上一些edge,搞成extend的AST去建模
Motivation:

Extending existing sequence encoders with a graph component that can reason about long-distance relationships
Neural Code Summrization: 2016-2021年 论文解读 (一)_第11张图片

Improved Code Summarization via a Graph Neural Network

Verma, M., & Ganguly, D. (2019). Improved Code Summarization via a Graph Neural Network.ICPC2021
使用GNN来建模AST,但还是保留了code 本来的通道。
Neural Code Summrization: 2016-2021年 论文解读 (一)_第12张图片

最新的SOTA: CAST: Enhancing Code Summarization with Hierarchical Splitting and Reconstruction of Abstract Syntax Trees

Shi E, Wang Y, Du L, et al. CAST: Enhancing Code Summarization with Hierarchical Splitting and Reconstruction of Abstract Syntax Trees[J]. https://arxiv.org/abs/2108.12987 EMNLP 2021
本文着手于AST的建模,近年来,很多研究人员使用各种技术建模富含语法和结构信息的抽象语法树(AST), 以此来更好地生成代码摘要。但是,由于程序的复杂性,抽象语法树一般又大又深、难以建模。现有方法也存在着树的结构被破坏、训练代价大、信息丢失等诸多限制。为此,微软亚洲研究院的研究员们提出了一种层次化切分和重组 AST(Hierarchical Splitting and Reconstruction of Abstract Syntax Trees) 的方法——CAST。其核心在于将 AST 层次化地切分成合适粒度的子树,使得每个子树包含相对完整的语义;独立建模子树后再按照切分前子树的相对位置,重新聚合子树的表征。这样可以使 AST 的结构更容易被建模,代码的语义能够更加完整地被构建,生成的摘要体现的语义也更加全面。
Neural Code Summrization: 2016-2021年 论文解读 (一)_第13张图片

CAST 模型选择了常用的序列到序列的架构,主要包含三个模块:AST 的编码器、代码编码器和摘要解码器。AST 的编码器用来建模代码的语义和结构信息;代码编码器用来建模变量名层面的词汇和语义信息;解码器则结合两个编码器得到的代码表征以及复制机制来生成代码摘要。

Neural Code Summrization: 2016-2021年 论文解读 (一)_第14张图片
研究员们在两个公开的数据集、四种衡量指标下进行了自动化测试,并且开展了人工测评(human evaluation)实验。大量实验结果证明了该方法的有效性。
Neural Code Summrization: 2016-2021年 论文解读 (一)_第15张图片
这里的human evaluation是从Infomativeness,source code的一些key point有没有体现在summaries的content种; Naturalness
只关注写的是否流利 ,similarity 衡量和ground truth是语义上是否相似。

Summarization (小结)

  • Source code不仅有lexical information,还有structural 等信息,建模的时候尽量考虑这些信息
  • 主流的,好用的模型还是sequence 模型,尤其是transformer-based的模型
  • Data quality也是值得考虑的一个问题,比如summarization是否是functionality
  • Evaluation的metric尚存在争议,有使用自动化指标和BLEU, METEOR, ROUGH,Cider配合human evalution等

你可能感兴趣的:(code,summarization,人工智能)