论文阅读《Summarizing Source Code with Transferred API Knowledge》

在这里插入图片描述

1、Abstract

代码摘要旨在生成源代码的简洁自然语言描述,对于代码搜索和代码理解非常有用。它在软件维护和发展中发挥了重要作用。以前的方法通过从类似的代码片段中检索摘要来生成摘要。然而,这些方法严重依赖于是否可以检索到类似的代码片段,这些片段有多相似,并且无法在源代码中捕获API知识,源代码中包含有关源代码功能的重要信息。在本文中,我们提出了一种名为TL CodeSum的新方法,它成功地将在不同但相关的任务中学习到的API知识用于代码摘要。在大型真实世界工业Java项目上的实验表明,我们的方法是有效的,并且在代码摘要方面优于最先进的。

2、Introduction

提出了一种名为TLCodeSum的新方法,利用学习的API知识生成Java方法摘要。
设计了一个框架从API摘要任务中学习API知识,并使用来帮助代码摘要任务。

图片: https://uploader.shimo.im/f/4yVAW9iBdRr8QZ1d.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

3、Approach

在本节中,我们介绍了我们提出的方法TLCodeSum,它使用传递的API知识从源代码中解码摘要。如图1所示,该方法主要由三个部分组成:数据处理、模型训练和在线代码摘要生成。该模型旨在实现两个任务,即API序列摘要任务和代码摘要任务。API序列摘要任务旨在构建API知识和功能描述之间的映射。将学习到的API知识应用于代码摘要任务,以帮助生成摘要。以下章节将介绍这两项任务的详细内容。

3.1 API Sequence Summarization Task

API序列摘要旨在建立API知识和自然语言描述之间的映射。为了实现某种功能,例如如何读取文件,开发人员通常会调用相应的API序列。在本文中,作者利用API知识来帮助代码摘要。

在本文中,作者利用了API知识来帮助代码注释的生成,api知识是在生成API序列摘要任务中学习,而该任务是基于seq2seq模型完成的。

如下图所示,api序列摘要的生成主要是通过解码器和编码器两个部分组成
![在这里插入图片描述](https://img-blog.csdnimg.cn/2f846f86d68b4fd897f52732c5168dd0.png

设A0={A0(i)}表示一组API序列,其中A0(i)=[a01,…,a0m]表示Java方法中的API调用序列。对于每个A0(i)∈ A0,存在对应的自然语言描述D0(i)=[d01,…,d0n]。API序列汇总的目标是对齐A0和D0,即A0→ D0。

API编码器使用RNN逐个读取API序列A0(i)=[a01,…,a0m]。API序列嵌入到表示API知识的向量中。然后,解码器使用API知识来生成目标摘要。为了更好地捕捉API序列和摘要之间的潜在对齐关系,我们采用了经典的注意力机制[Bahdanau等人,2014]。根据API和先前的隐藏状态更新编码器的隐藏状态,计算的公式如下:
图片: https://uploader.shimo.im/f/2HiOmis4ODgkRcAB.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

a’t就是当前输入的API向量,h’t-1是上一个时间步RNN单元输出的隐藏状态,f是一个非线性函数,采用的是GRU(Gated Recurrent Units)

解码器是另一个RNN,用于预测输出生成摘要下一个单词的条件概率,同样,该单词的概率由之前生成的单词d,当前隐藏状态s和语义向量C决定(如下所示)。这里的g是一个非线性函数,同样使用GRU来实现。
图片: https://uploader.shimo.im/f/8ajjDw3PjvHiHgPP.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

其中,s计算公式如下:
图片: https://uploader.shimo.im/f/3hretVU9NOtk64yr.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

由于引入了attention机制,所以Ct不为常量,而是改为各个隐藏状态的加权求和:
图片: https://uploader.shimo.im/f/e0GaG86iEFLqQTTQ.png?sm_xform=image%2Fcrop%2Cx_0%2Cy_5%2Cw_479%2Ch_74&accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

α是权重,用softmax计算得出,如下:
图片: https://uploader.shimo.im/f/0PwCiEgPitIVqQfw.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

eij表示编解码状态的相关性得分,利用输出的第i-1个隐藏状态和编码器的第j个隐藏状态的计算得出,代表输入位置j和输出位置i处的匹配程度。

3.2 Code Summarization Task

TL-codesum模型使用的是seq2seq的变体,在原来的基础上添加了训练好的API序列摘要模型的encoder部分。具体如下图所示。
图片: https://uploader.shimo.im/f/J42RBkErgLRxP4cj.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

为了更好地让模型学习语义信息,作者结合了api摘要序列、源代码序列生成的语义信息,并将Decoder的注意力机制更改如下:
图片: https://uploader.shimo.im/f/6a76C2D94rp918Gn.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NzExNzcwNjQsImZpbGVHVUlEIjoiUktBV1ZwcnlKeFVSbG1rOCIsImlhdCI6MTY3MTE3Njc2NCwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjo4NTU3MDI1NH0.sRMb61augcYPNp2v__XTV9gtQ8Di0vl4481HOMipDvM

其中α和α0分别是源代码和API序列的注意力权重,解码过程类似于API摘要任务(只不过在输入上有所不同),该任务同样采用GRU逐词预测。

4 Experient

4.1 dataset details

4.1.1 数据集的基础信息

作者的工作中使用了两个数据集,一个用于API序列摘要,另一个用于代码摘要,两个项目均来自github,为了保持项目的质量,我们选择至少有20颗星的项目作为初步数据集。
API序列摘要数据集:包含2009年至2014年的Java项目
代码摘要生成数据集:包含2015年至2016年的Java项目
从前一个数据集中学习的api知识将会用于后一个数据集中用来训练代码摘要任务。

4.1.2 数据集的处理

作者在数据集处理上主要使用了4步:
使用Eclipse的JDT编译器将源代码解析为AST,然后提取Java方法、这些方法中的API序列以及相应的Javadoc注释(Java方法的官方标准注释)。
源代码送入网络之前先转换为token。
为了减少在学习过程中引入的噪声,只取注释的第一句话(根据Javadoc的指南,第一句话通常描述Java方法的功能)。
使用了一些启发式规则过滤进行挑选(过滤了具有空描述或只有一个字描述的方法。舍弃注释易于预测的方法,如setter, getter, constructor, test methods,override methods。
最终获得340,922对(API sequence, summary),69,708对(API sequence, code, summary)。按8:1:1划分训练集,验证集,测试集,具体数据集信息如下。
在这里插入图片描述

5 Experiment Results

5.1 评价指标的选择

主要可以分为以下两类:

  • IR指标(信息检索指标):precision,recall和F-指标
  • MT指标(机器翻译指标):BLEU-4,METEOR指标

5.2 实验结果数据

5.2.1 生成注释的准确性分析

5.2.1.1 消融实验的设置
  • API-Only:仅用API序列信息生成摘要
  • Code-Only:仅用代码片段信息生成摘要
  • API+CODE:API-Only和Code-Only的结合,但没有进行API序列摘要模型的预训练
  • TL-CodeSum(fixed):文章提出的方法,但是在Code Summarization部分使用的是参数固定的API Sequence Summarization模型
  • TL-CodeSum(fine-tuned):文章提出的方法,但是在Code Summarization部分API Sequence Summarization模型的参数也会进行训练调整
5.2.1.2 IR指标的对比结果

在这里插入图片描述

5.2.1.3 MT指标的对比结果

在这里插入图片描述

5.2.2 生成注释的质量分析

5.2.2.1 API Embedding Quality

API使用模式是代码摘要的重要组成部分。不同开发人员的不同编码约定提高了语义学习的难度。开发人员在API使用模式上具有一定的规律性,因此集成API知识有助于学习源代码的功能。API嵌入的学习质量对于我们提出的方法的良好运行至关重要。图3显示了API embedding的二维投影。选择“字符串”和“数学”相关的API,可以发现,具有相似语义和作用的API基本都能聚集到一起,因此TL-CodeSum很好地实现API功能的embedding。
在这里插入图片描述

5.2.2.2 API和代码的联系

TL-CodeSum根据源代码的语义和迁移的API知识生成摘要。下图显示了Java方法中的API序列和代码token在生成相应摘要时的权重(注意力机制)。TL CodeSum根据源代码的语义和传递的API知识生成摘要。图4显示了Java方法中API序列和代码标记在生成相应摘要时的注意力权重。作者在图4(a)中给出了Java方法、其中的API序列、人工编写的注释以及TL CodeSum自动生成的注释的详细信息。生成的令牌在API序列和代码token之间具有不同的关系。从图中可以发现单词“write”和“stream”API“DataOutputStream.writeByte”更相关,“常量”一词与变量“tab”更相关,其类型为“ConstantPool”。由此可见,TLCodeSum将不同的单词与特定的API或代码标记对齐。
在这里插入图片描述

5.2.2.3 人工摘要和生成摘要的对比

无论Java方法的长度如何,大多数生成的摘要都是清晰、连贯和信息相关的。总体来看,TL-codeSum生成注释效果较好。

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值