【论文笔记】An Extractive-and-Abstractive Framework for Source Code Summarization

news2024/11/15 23:37:45

An Extractive-and-Abstractive Framework for Source Code Summarization

    • 1. Introduction
    • 2. Model
      • 2.1 Overview
      • 2.2 Training of EACS
        • 2.2.1 Part i : Training of Extractor
        • 2.2.2 Part ii : Training of Abstracter
    • 3. Evaluation

1. Introduction

代码摘要可以细分为抽取式代码摘要(抽取方法)和抽象代码摘要(抽象方法):

  • 提取方法:使用检索技术从代码片段中提取重要语句和关键字的子集,并生成保留重要语句和关键字中事实细节的摘要。然而,这样的子集可能会丢失标识符或实体命名,因此生成的摘要的自然度通常很差。
  • 抽象方法:抽象方法广泛采用基于编码器-解码器架构的神经网络模型,然后在大型代码评论语料库上训练模型。编码器首先将代码片段转换为嵌入表示(也称为上下文向量),然后解码器将上下文向量解码为简短的自然语言摘要。然而,生成的摘要常常会遗漏重要的事实细节。

本文提出了一种用于代码摘要的提取和抽象框架,该框架继承了提取和抽象方法的优点并屏蔽了它们各自的缺点。具体来说,我们利用成对的代码片段和注释来训练提取器(提取方法)和抽象器(抽象方法)。训练有素的提取器可用于预测代码片段中的重要语句。这些重要的语句和整个代码片段被输入到抽象器中以生成简短的自然语言摘要。训练有素的抽象器首先利用两个单独的编码器将重要语句和整个代码片段转换为两个上下文向量。然后,将两个上下文向量融合以产生融合向量,该融合向量将被传递到解码器以生成自然语言摘要。与现有的抽象方法相比,我们的框架配备了提取器,基本上平衡了对重要信息和全局上下文信息的关注,降低了丢失重要事实细节的风险并提高了整体性能。

2. Model

在这里插入图片描述

2.1 Overview

阶段 (i) 的目标是训练一个能够从给定代码片段中提取重要语句的提取器。为了训练这样的提取器,EACS 首先根据代码片段中每个语句的信息性生成真实的重要语句 (GIStates)。然后,EACS 使用提取器提取预测的重要语句 (PIStates)。在此阶段,提取器的模型参数被随机初始化并根据损失 L E x L_{Ex} LEx 迭代更新。 L E x L_{Ex} LEx 是根据 PIStates 和 GIStates 计算的。

阶段(ii)的目标是训练一个能够为给定代码片段生成简洁自然语言摘要的抽象器。为了训练这样的抽象器,给定一个代码片段,EACS 首先使用训练好的提取器来提取重要的语句 (IState)。 IStates 将通过名为 ExEncoder 的编码器进一步转换为嵌入表示 e E x e^{Ex} eEx。同时,EACS 使用另一个名为 AbEncoder 的编码器将整个代码片段转换为嵌入表示 e A b e^{Ab} eAb。然后,EACS 通过融合 e E x e^{Ex} eEx e A b e^{Ab} eAb生成融合嵌入表示 e F u e^{Fu} eFu。进一步, e F u e^{Fu} eFu将被传递到解码器(Decoder)以生成预测摘要(PSummaries)。在此阶段,抽象器的模型参数(包括ExEncoder、AbEncoder和Decoder)也被随机初始化。 EACS根据损失 L A b L_{Ab} LAb迭代更新抽象器的参数。 L A b L_{Ab} LAb是根据 PSummaries 和真实摘要计算的。

2.2 Training of EACS

2.2.1 Part i : Training of Extractor

令 c 表示包含一组语句 stat = [stat1, stat2, …, statn] 的代码片段,其中 s t a t i stat_i stati 是 c 中的第 i 个语句。提取代码摘要可以定义为为每个 s t a t i stat_i stati分配标签 l i ∈ { 0 , 1 } l_i ∈ \{0, 1\} li{0,1} 的任务。该标签表示语句 s t a t i stat_i stati 中包含的事实细节是否应该被包含在摘要中。假设摘要代表了代码片段的重要内容。因此,我们可以将提取器视为一个分类器,它接收代码片段的所有语句并预测重要的语句。

提取器的训练通过三个步骤完成:➀ 生成真实的重要语句(GIStates),➁ 生成预测的重要语句(PIStates),➂ 基于 GIStates 和 PIStates 计算损失( L E x L_{Ex} LEx)并更新模型参数。

  1. 生成真实的重要语句

    如前所述,我们的目标是训练一个提取器,可以预测代码片段 c 中的重要语句。我们将 c 中语句的标签表示为 l = [ l 1 , l 2 , ⋅ ⋅ ⋅ , l n ] l = [l_1, l_2, · · · , l_n] l=[l1,l2,⋅⋅⋅,ln] l i ∈ { 0 , 1 } li ∈ \{0, 1\} li{0,1} 是语句 s t a t i stat_i stati 的标签。 l i = 1 l_i = 1 li=1 表示该 s t a t i stat_i stati 是一个信息丰富(重要)的陈述;否则,就不是。

    我们构建一个训练数据集,其中每个样本都是一对 stat 和相应的标签 l ^ \hat{l} l^。我们将 l ^ \hat{l} l^ 视为 stat 的真实标签。

    为了获得真实标签,我们首先测量每个语句 s t a t i ∈ s t a t stat_i ∈ stat statistat 的信息量 i n f o r m a t i v i t y informativity informativity。具体来说,信息量是通过语句 s t a t i stat_i stati 和参考语句(reference statements)之间的 ROUGE-L 分数来衡量的。我们将代码片段的注释视为参考语句。然后,我们根据信息量对语句进行排序,并按照信息量从高到低的顺序选择它们。我们每次选择一个语句。如果新选择的语句可以增加所有所选语句的信息量,则它将被视为真实的重要语句。最后,我们获得真实的标签,即所有真实的重要陈述(GIStates)。

  2. 生成预测的重要语句

    我们使用提取器(Extractor)来预测代码片段中的重要语句。提取器是由编码器和分类层组成的神经网络模型。编码器将语句转换为嵌入表示。分类层根据语句的嵌入表示来预测语句的标签。

    编码器本质上执行将复杂源代码转换为数字(嵌入)表示的代码表示任务,同时保留语义。这种嵌入表示对于程序计算来说很方便。因此,我们的EACS可以采用大量现有的基于深度学习的代码表示技术来设计编码器。具体来说,语句 e s t a t e^{stat} estat 的嵌入表示可以形式化为 e s t a t = e n c o d e r ( s t a t ) e^{stat}=encoder(stat) estat=encoder(stat) e n c o d e r ( ⋅ ) encoder(·) encoder() 是一种神经网络架构(例如 LSTM)或预训练模型(例如 CodeBERT),可以在保留语义(即嵌入表示)的情况下对代码语句序列进行数值化。我们通过实验发现,在代码摘要任务中,通过微调预训练模型获得的编码器比基于神经网络架构从头开始训练的编码器表现更好。

    分类层与嵌入表示 e s t a t e^{stat} estat 相连接。在实践中,我们采用 s o f t m a x softmax softmax 作为分类层,即 l = s o f t m a x ( e s t a t ) l = softmax (e^{stat}) l=softmax(estat)

  3. 模型训练

    在训练过程中,我们根据 sigmoid 交叉熵损失更新提取器的模型参数 θ,即 L E x ( θ ) L_{Ex} (θ) LEx(θ),计算如下:

在这里插入图片描述

​ 其中 l ^ n ∈ 0 , 1 \hat{l}_n ∈ 0, 1 l^n0,1 是第 n 个语句的真实标签,N 是语句的数量。 l ^ n = 1 \hat{l}_n = 1 l^n=1 表示模型应关注第 n 个语句中包含的 事实细节,以利于最终生成摘要。

​ 一旦生成训练好的提取器,我们就可以使用它从给定的代码片段中提取重要的语句。

2.2.2 Part ii : Training of Abstracter

抽象器的训练通过六个步骤完成:➃ 提取重要语句(IState),➄ 和 ➅ 生成重要语句和整个代码的嵌入表示( e E x e^{Ex} eEx e A b e^{Ab} eAb) ➆ 基于 e E x e^{Ex} eEx e A b e^{Ab} eAb 生成融合表示 e F u e^{Fu} eFu,➇ 生成预测摘要,以及 ➈ 根据预测摘要(PSummaries)和真实摘要(注释)计算损失 {L_Ab} 以更新模型参数。

  1. 提取重要语句

    为了生成摘要而不遗漏事实细节,我们的 EACS 更加关注代码片段的重要语句。这些重要的语句包在最终生成的摘要中的事实细节。因此,与现有抽象代码摘要技术中的抽象器不同,EACS的抽象器将重要语句视为输入的一部分。在此步骤中,我们首先使用训练好的提取器来预测给定代码片段的语句标签。然后,标签为1的语句将被选择为重要语句(IStates)。

    1. 生成嵌入表示

    步骤 ➄ 和步骤 ➅ 做了类似的事情,即利用编码器将源代码转换为嵌入表示。不同之处在于,步骤 ➄ 处理提取器选择的重要语句,而步骤 ➅ 处理整个代码片段。因此,在EACS中,我们可以使用相同的神经网络架构或预训练模型来设计ExEncoder和AbEncoder。给定一个代码片段 c = [stat1, stat2, · · · , statn],让 c′ ⊆ c 表示提取器从 c 中选择的一组重要语句,ExEncoder 和 AbEncoder 执行的任务可以形式化如下:

    e E x = e n c o d e r ( c ′ ) , e A b = e n c o d e r ( c ) e^{Ex}=encoder(c'), e^{Ab}=encoder(c) eEx=encoder(c),eAb=encoder(c)

    其中 e E x e^{Ex} eEx e A b e^{Ab} eAb 表示 c’ 和 c 的嵌入表示; e n c o d e r ( . ) encoder(.) encoder(.) 是一种可以处理顺序输入的神经网络架构(例如 LSTM 、Transformer)或预训练模型(例如 CodeBERT)。 ExEncoder 和 AbEncoder 执行类似的任务 - 生成代码的嵌入表示,因此我们使用与提取器的编码器相同的代码表示技术来设计它们。

  2. 生成融合表示

    在此步骤中,EACS 通过 Fusioner 组件融合 e E x e^{Ex} eEx e A b e^{Ab} eAb ,生成融合嵌入表示 e F u e^{Fu} eFu。考虑到 e E x e^{Ex} eEx e A b e^{Ab} eAb 没有对齐,我们以串联方式融合它们。我们尝试两种串联方式如下:

    在这里插入图片描述

  3. 生成预测摘要

    我们利用解码器来生成自然语言摘要。解码器接收融合嵌入表示 e F u e^{Fu} eFu 并预测单词。具体来说,基于神经网络的解码器是将上下文向量eFu展开为目标序列(即摘要的单词序列),通过以下动态模型,

    在这里插入图片描述

    其中 f (·) 和 g(·) 是激活函数; h t h_t ht 是神经网络在时间 t 的隐藏状态; y t y_t yt 是从 t 到 g(·) 的预测目标词,其中 Y < t Y_{<t} Y<t 表示历史记录 {y1, y2, · · ·, yt -1}。预测过程通常是词汇表的分类器。从上式可以看出,生成目标词的概率与当前隐藏状态、目标序列的历史和上下文 e F u e^{Fu} eFu 有关。解码器的本质是通过优化损失函数对词汇进行分类,从而生成代表目标词 y t y_t yt 特征的向量。向量经过一个softmax函数后,概率最大对应的词就是要输出的结果。

  4. 模型训练。

    在抽象器的训练过程中,三个组件(ExEncoder、AbEncoder 和 Decoder)被联合训练,以最小化负条件对数似然,即 L A b ( θ ) L_{Ab} (θ) LAb(θ) 计算如下:

    在这里插入图片描述

    其中 θ 是抽象器的模型参数,每个 (xn, yn) 是训练集中的一个(代码片段,注释)对。

3. Evaluation

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1353021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

眼镜店系统管理软件,眼镜店配镜视力检查顾客资料管理系统

一、软件程序问答 1、这个软件在配镜的时候可以开配镜处方吗&#xff0c;可以打印出来吗&#xff1f; 如上图&#xff0c;以 佳易王眼镜店配镜顾客信息管理系统为例说明&#xff1a; 点击软件中的 配镜处方按钮&#xff0c;填写配镜相关信息&#xff0c;即可打印&#xff0c;…

Spring系列学习六、深入Spring AOP——揭开代理的神秘面纱

深入Spring AOP——揭开代理的神秘面纱 一、动态代理的实现原理二、CGLIB字节码增强的实现原理三、结语 上一章节&#xff0c;我们体验了Spring AOP强大的能力的同时&#xff0c;是不是也想弄明白&#xff0c;它是怎么原理是什么呢&#xff1f;如果自己要做一个类似的框架&…

SQL Server注入之攻防技战法

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 1.Mssql报错注入 0.判断数据库类型 1.爆当前用户名 2.爆版本 3.爆服务器名 4.判断数据库个数 5.获取全部数据库 语句只适合>2005 爆当前数据…

旧电脑搭建NAS

旧电脑可以搭建NAS吗&#xff1f; 可以&#xff01; 性能好吗&#xff1f; 完全没问题&#xff01; 简单吗&#xff1f; 轻松上手&#xff01; 怎吗搭建&#xff1f; 这里&#xff1a;用旧电脑搭建NAS在您的家庭中&#xff0c;通过将旧 PC 转变为NAS服务器&#xff0c;您…

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

场景 Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中&#xff1a; Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中-CSDN博客 Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作&#xff1a; Wi…

BLE Mesh蓝牙组网技术详细解析之Access Layer访问层(六)

目录 一、什么是BLE Mesh Access Layer访问层&#xff1f; 二、Access payload 2.1 Opcode 三、Access layer behavior 3.1 Access layer发送消息的流程 3.2 Access layer接收消息的流程 3.3 Unacknowledged and acknowledged messages 3.3.1 Unacknowledged message …

轻松上手:Postman Interceptor 插件使用指南

什么是 Postman&#xff1f; Postman 是一种用于测试和开发 API 的工具&#xff0c;让开发者可以轻松地构建、发送、调试 HTTP 请求&#xff0c;并检查响应结果。通过Postman&#xff0c;开发者可以在不编写代码的情况下快速测试 API 的正确性和可靠性。Postman 还支持协作和自…

ubuntu18.04安装MySQL

1.安装mysql服务器端 sudo apt-get -y install mysql-server&#xff08;18.04/20.04不会提示输入密码&#xff0c;默认是没有密码&#xff09; 2.安装mysql客户端 sudo apt-get -y install mysql-client3.安装mysql模块 sudo apt-get -y install libmysqlclient-dev4.验证是…

融资项目——全局统一日志说明

通过日志可以查看程序的运行信息和异常信息等&#xff0c;便于维护。日志级别分为TRACE、DEBUG、INFO、WARN、ERROR级别&#xff0c;越往后打印的日志信息越少&#xff0c;如ERROR 级别只会在程序运行出错时才会打印日志。可在application.properties中设置日志级别。 logging…

Python+OpenGL绘制3D模型(七)制作3dsmax导出插件

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

最新Tomcat下载安装详细教程

Tomcat下载安装教程 Tomcat简介Tomcat下载tomcat安装验证安装是否成功 Tomcat简介 Tomcat是什么&#xff1f; Tomcat是web容器。你在做web项目时&#xff0c;多数需要http协议&#xff0c;也就是基于请求和响应&#xff0c;比如你在百度输入一行内容搜索&#xff0c;那么百度服…

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

Java_IO流(字节流)

一、IO流&#xff08;字节流&#xff09; 1.1 IO流概述 在前面已经学习过File类。知道File只能操作文件&#xff0c;但是不能操作文件中的内容。我们也学习了字符集&#xff0c;不同的字符集存字符数据的原理是不一样的。有了前面两个知识的基础&#xff0c;接下来我们再学习…

Git(3):Git环境常用命令

1 获取本地仓库 要使用Git对我们的代码进行版本控制&#xff0c;首先需要获得本地仓库 &#xff08;1&#xff09;在电脑的任意位置创建一个空目录&#xff08;例如test&#xff09;作为我们的本地Git仓库 &#xff08;2&#xff09;进入这个目录中&#xff0c;点击右键打开…

NSSCTF sql

开启环境: ?wllm1 回显正常,试试?wllm1 出现报错;加上%23正常 ?wllm-1or 11%23出现过滤 测试,空格用**替代, 等号用like替代 测试长度 ?wlmm1order/**/by/**/3%23正常 ?wlmm1order/**/by/**/4%23报错 长度为3,测试回显位置: ?wlmm-1union/**/select/**/1,2,3%23 …

c++ / day06

1. 利用模板类完成顺序表(两天时间&#xff0c;今天至少写出大致框架) 代码 //implement template in sqlist #include <iostream> #include <cstring>#define MAXSIZE 100using namespace std;template <typename T> class Sqlist {unsigned int len 0;T…

【普中开发板】基于51单片机音乐盒LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机音乐盒LCD1602显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P08 1. 主要功能&#xff1a; 基于51单片机AT89C51/52&#…

环境准备-VMware安装

照顾到很多人不是很会环境搭建,我这里会将搭建的步骤讲的细致点 第一步,VMware下载。目的是通过VMware搭建Linux服务器,因为大家大部分还是Windows的电脑,我们先下载虚拟机搭建一个Linux系统的服务器 下载完成之后,点击安装,如下: 点击“下一步” 勾选“我接受许可协议…

app store里面的构建版本在线上传

开发苹果ios应用&#xff0c;无论是用原生开发、用hbuilderx开发还是用其他h5框架开发的app&#xff0c;都需要将打包好的ipa文件上传到app store。 在上架app store的过程中&#xff0c;我们会遇到下图的这样一个问题&#xff1a; 就是它要求我们上传一个构建版本&#xff0c…