IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 代码摘要生成:《Summarizing Source Code with Transferred API Knowledge》论文笔记 -> 正文阅读

[人工智能]代码摘要生成:《Summarizing Source Code with Transferred API Knowledge》论文笔记

IJCAI2018
论文链接:https://xin-xia.github.io/publication/ijcai18.pdf
源码: https://github.com/xing-hu/TL-CodeSum

以往的代码摘要自动生成技术主要有基于信息检索(IR)和基于深度学习(DL)的方法,基于IR方法的弊端是标识符和方法命名很糟糕时无法提取关键字,且如果不存在相似的代码段,就无法输出准确的摘要;基于DL生成注释的弊端是大多方法将代码视为纯文本,会丢失很多有用信息,如约定的标识符命名和应用程序编程接口(API)的使用模式。因此论文提出了一种新的代码摘要生成方法——TL-CodeSum(也是针对JAVA的),受迁移学习的启发,模型学习不同但相关方法的API知识,最终成功利用源代码中潜在的API知识来帮助代码摘要生成。

论文贡献:

  • 提出了一种名为TL-CodeSum的新方法,利用学习的API知识生成Java方法摘要。
  • 设计了一个框架用于从API摘要生成任务中学习API知识,并用它来协助代码摘要生成。

一、方法原理

API能大大提高编程效率,程序员在开发时也会经常使用一些API。可见,代码片段的功能往往与其使用的API序列有关,开发人员通常会调用一个特定的API序列来实现一个新特性。与具有不同编码约定的源代码相比,API序列往往是规则的。于是作者推断,在API序列中蕴含的信息有助于生成代码摘要,基于这个思想,提出了TL-CodeSum。

1.整体框架

在这里插入图片描述
包含三个模块:数据处理、模型训练和在线代码摘要生成
模型旨在实现以下两个任务:

  • API sequence summarization task:构建API知识和功能描述之间的映射。对应上图的上部分。
  • code summarization task:用学习到的API知识辅助生成代码摘要。对应上图的下部分。
    就是先仅仅基于API序列预训练一个模型,用来生成API序列摘要的,这个模型就已经学习到了不同但相关联JAVA方法的API知识用来生成API摘要。然后再利用这个预训练模型,训练一个代码摘要生成的模型,也就是论文所说的迁移学习,这样就用到了API摘要的信息辅助生成代码摘要。

2. API Sequence Summarization Task

采用基于seq2seq的模型来实现API序列摘要的生成,如下图:
在这里插入图片描述

可以发现主要包含两部分工作:API序列的编码和解码。
编码器利用RNN读取API序列。API序列被嵌入成代表API知识的向量,此向量就被解码器用于生成摘要,为了更好的捕获API序列和摘要的潜在映射关系,作者还引入的注意力机制,之前的论文笔记也有写:点此转跳,公式都差不多,只不过这里用的是GRU,再复习下吧。
Figure2中的每个隐藏状态h由下式生成:
在这里插入图片描述
a’t就是当前输入的API向量,h’t-1是上一个时间步RNN单元输出的隐藏状态,f是一个非线性函数,采用的是GRU(Gated Recurrent Units)。

解码器是另一个RNN,用于预测输出生成摘要下一个单词的条件概率,同样,由之前生成的单词d,当前隐藏状态s和语义向量C决定。g是一个非线性函数。
在这里插入图片描述
s计算公式如下:
在这里插入图片描述
因为引入了注意力机制,那么语义向量C就不是固定的了,改为各个隐藏状态的加权求和:
在这里插入图片描述
α是权重,用softmax计算得出,如下:
在这里插入图片描述
eij表示编解码状态的相关性得分,利用输出的第i-1个隐藏状态和编码器的第j个隐藏状态的计算得出,代表输入位置j和输出位置i处的匹配程度,也就是注意力啦。
在这里插入图片描述

3. Code Summarization Task

利用从API序列摘要模型中学习到的API知识辅助生成代码摘要,代码摘要模型是基于Seq2Seq模型的一个变体,用迁移学习思想,用到了训练好的API序列摘要模型的encoder部分。如下图:
在这里插入图片描述
首先利用训练好的AIP序列摘要模型的encoder编码输入的API序列,用代码编码器编码输入的源码,两者作用是学习源码和API的语义信息。
然后为了更好结合两个编码器的语义信息,解码器的注意力机制更改如下:
在这里插入图片描述
就是简单相加。解码部分隐藏状态的生成用的也是GRU。


二、实验

1.数据集

  • API序列摘要生成:2009年到2014年的Java项目
  • 代码摘要生成:2015年至2016年Java项目

来源:github

2.数据预处理

  • 选择至少有20颗星的项目作为初步数据集。
  • 使用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划分训练集,验证集,测试集。


三、结果

1.评价指标

  • IR(信息检索)指标: precision, recall and F-sore
  • MT(机器翻译)指标:BLEU-4,METEOR(有时候翻译模型翻译的结果是对的,但跟参考译文没对上(比如用了一个同义词))

2.对比结果

(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模型的参数也会进行训练调整

无论是仅用API-Only还是Code-Only模型,精度都要比CODE-NN要好(好太多了),两者结合API+CODE又有了直观的提升。然后使用TL-CodeSum又有了很好的提升(预训练还是很有用的)。

(2)MT评估结果
在这里插入图片描述
无疑,TL-CodeSum还是很牛。

3.质量分析

(1)API embedding质量
在这里插入图片描述
API使用模式是代码摘要的一个重要组成部分,其使用模式相对有规律,因此集成API知识有助于学习源代码的功能。Figure3显示了API embedding的二维投影。选择“字符串”和“数学”相关的API,可以发现,具有相似语义的API基本都能聚集到一起(圈出部分),说明TL-CodeSum很好地实现API功能的embedding。

(2)API和代码的相关性
TL-CodeSum根据源代码的语义和迁移的API知识生成摘要。Figure4显示了Java方法中的API序列和代码token在生成相应摘要时的注意权重。可以发现,TL-CodeSum将不同的单词与特定的API或代码token可以很好地映射。
在这里插入图片描述
(3)与人工编写摘要的对比
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:13:42  更:2021-07-27 16:16:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:26:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码