Paper: A survey of automatic generation of source code comments: Algorithms and techniques
1 Introduction
Objectives
- 给出自动注释生成研究的代表性算法目录,并使研究人员对当前最新算法有更好的了解;
- 总结现存研究的主要挑战与限制。
Contributions
- 分析代码注释自动生成的动机与主要挑战;描述自动代码注释的工作流;
- 讨论注释自动生成的主流的三类算法,同时展现自动注释技术的潜在趋势;
- 总结注释质量评价的相关工作以及未来的研究方向。
2 Overview of automatic generation of code comments
Problem Statement
自动代码注释(Automatic code commenting)旨在根据源码分析自动地由源代码生成以自然语言书写的文本描述,继而可以反映源码的设计目标、程序逻辑、程序作用及相关参数的意义等。
The general process
- 数据收集。构建注释生成系统的数据集用于模型的训练、验证与测试、提取代码和相应的注释或提取一个注释生成系统需要的特定规则。数据可以从开源社区或网站以爬虫或下载的形式得到。
- 基于某种算法生成注释。该步可划分为两个子任务:源代码表示及文本生成。
- 生成注释的质量评估。如果质量不尽如人意,则会返回第一步准备更多更合适的数据、调整源代码模型、再次生成注释并加以评价,该过程直到生成的代码注释满足要求才终止。
Challenges
存在挑战的本质原因:程序语言与自然语言在本质上有所不同:源代码包含大量的类、方法和方法参数的信息以及许多复杂的嵌套结构和调用关系;而自然语言的注释是无结构的,形式上是自由表达的。
挑战一:代码注释自动生成算法。
-
源码表示:自动注释中的源代码模型可以分成三类:
- the token-based source code models: 提取tokens作为源码的关键词和主题。在该种表示方法中,源代码将被视为普通文本,因此常被建模为词袋模型。这一类模型仅表征了源代码的词法信息。以信息检索为基础的注释算法主要采用该类模型表示源码。
- the syntax-based source code models: 在抽象语法树(AST)层级对源代码建模,该类模型通常用于基于深度神经网络的注释算法中。
- the other source code models: 根据后续处理过程以合适的形式表示代码。
- the combined model: 一个可以综合有效的表示源码词法、语法、结构信息的混合模型尚未有效提出。
-
文本生成:该步需要在精准提取源代码中蕴含的信息继而变得十分困难。文本生成的解决方案同样可以分为三类:
- rule-based text generation solutions: 根据设计好的规则或自然语言模型(模板)生成文本。
- generative-based methods: 由decoder生成文本。
- search-based text generation solutions: 通过检索语料库中现存的注释产生文本。
挑战二:注释质量评估。
- 统一用于验证注释生成算法的数据集。
- 设计并制定适当的注释质量评估指标。
3 The algorithms of AUTOMATIC GENERATION of code comments
OverView of classification
如图所示,现有的自动代码注释生成算法主要分为三类:基于信息检索的、基于深度神经网络的以及其它。
Information retrieval based comment generation algorithms
一般而言,给定一段缺少注释的源代码和一个带有注释的源码数据集,信息检索算法首先计算目标代码和数据集中代码的相关性,然后返回一或多段与目标代码匹配的源码,同时它们的注释会被用于生成目标代码的注释。这类信息检索算法通常依赖于VSM(Vector Space Model)、LSI(Latent Semantic Indexing)、LDA(Latent Dirichlet Allocation)以及其它一些类似代码拷贝检测的技术。
VSM/LSI based Comment Generation Algorithms
该类算法利用Vector Space Model(VSM)、Latent Semantic Indexing (LSI)或者两者的结合来生成类或方法的注释。
VSM和LSI都属于信息检索的技术,它们最初都是为自然语言处理任务开发的。当我们应用VSM、LSI算法生成源码注释时,源码文本通常被表示为向量、矩阵或元组。向量中的每个元素都表示文档中某个单词的权重。计算VSM中项权重的方法有很多,最常用的方法是tf-idf。LSI则利用Singular Value Decomposition(SVD)识别术语与概念之间的关联度,同时提取文本的概念主题。注释系统根据术语的权重或query文本与源码文本之间的文本相似度来决定该术语是否出现在源代码注释中,具有较高相似度的术语代表了和代码片段或query主题更高的关联,因此注释系统将推荐这些术语作为关键词来构建目标源码的注释。
Haiduc and Aponte et al.使用VSM和LSI分析源代码文本并生成类和方法的抽取式抽象摘要:它们首先将源代码文档和程序包转换为语料库,然后以矩阵形式表示包含在标识符名称中的术语以及语料库中源码和文档的注释。当使用VSM从源码中生成抽取式摘要时,源码文档中关联度最高的术语将根据权重被挑选出来,同时使用LSI计算语料库中各术语向量和需要生成摘要的源码向量的余弦相似度,生成那些出现在语料库中,但没有出现在要生成摘要的方法或类中的高相似度的术语。通过这种方法,他们分析了Java项目中的方法和类的源代码,并为其生成了简短而准确的文本描述。在另一项工作中,Haiduc et al.仅使用LSI去生成开源仓库中Java类代码的摘要注释。
采取同样方法的还有:Vassallo et al.使用VSM模型将源代码文本以及Stack Overflow问答区开发者的讨论文本表示为向量,并计算目标源码与讨论文本之间的余弦相似度以建立映射。具有高相似度的片段将被推荐作为目标源码的注释。最终,他们挖掘了众包知识以实现方法注释的推荐。
类似的,Panichella et al.采用启发式和VSM来处理和分析开发人员对方法描述的交流。开发人员的交流主要是指与类、方法和参数有关的电子邮件和bug报告。他们提取了可以追溯到源代码的段落文本,并通过计算这些段落和目标代码的余弦相似度来识别相关段落,拥有高相似度的相关段落将被推荐作为方法描述。
这类方法的缺点是它仅考虑了出现在语料库或源码文档中的术语,而没有考虑源码中的程序调用、数据依赖关系、单词顺序等其他信息。因此,这些系统在生成注释时很难进一步提高准确率。
Code Clone Detection based Comment Generation Algorithms
基于代码拷贝检测的注释生成算法是指利用代码拷贝检测技术寻找数据库中的相似代码,而匹配代码的注释或讨论文本将被视为目标代码的注释。
Wong et al.提出一种基于代码拷贝检测技术的方法,该方法从Stack Overflow的问答区挖掘注释,这些问答区的帖子包含了代码片段及相应的文本描述,他们根据这样的映射关系建立了一个数据库。之后他们利用代码拷贝检测技术,即通过检测最长公共子串来发现数据库中的相似代码片段,并提取对应的注释。Wong et al.从另一角度出发,他们挖掘的是项目仓库GitHub中的开源软件项目中的注释,在代码拷贝检测技术的帮助下,他们发现了更多的匹配的代码片段。他们采用的代码拷贝检测工具利用代码解析器为代码段构建AST,并在比较之前对AST节点执行序列化操作。如此一来,他们的代码拷贝检测技术考虑了源代码的结构信息因而可以找到更多匹配的代码片段。最终,改进的代码注释系统为目标代码生成了更多的注释。
基于代码拷贝检测的注释生成算法的原理很简单,并且生成注释的数量及质量严重依赖于为注释系统构建的数据库的规模和质量。相应的,为了提升生成注释的质量,它要求我们收集更多高质量的开源软件项目,或者更多包含代码段和相应自然语言注释的讨论和交流信息。
该类方法的缺点是生成注释的数量要少得多。原因是生成的注释的数量很大程度上取决于数据库或GitHub上的开源软件项目所包含的信息。 例如,对于在任何帖子中都从未讨论过的代码段,注释系统将无法推荐任何注释。
LDA based Comment Generation Algorithms
Latent Dirichlet Allocation (LDA)是用于从文本中自动提取主题的主题模型之一,它是概率模型的一种。用于注释生成算法的概率模型包括n-gram语言模型、LDA以及其它LDA的变种。N-gram模型在统计自然语言处理邻域被广泛运用。LDA是一种可以根据文档语料库中各术语的出现次数来拟合生成概率模型的信息检索模型。基于LDA的注释生成算法通过LDA构建源代码模型并生成目标源代码的注释。换言之,LDA可以提取源代码的特定特征。当n-gram模型用于解决自动注释生成问题时,它通常用于协助其它统计模型来分析源码,或是训练源代码模型。这一类模型是简单有效的,同时成为挖掘源代码文本语义的有效模型。
Movshovitz-Attias and Cohen使用主题模型、LDA和n-gram模型来预测Java源代码的注释。他们基于来自多个训练数据库的相同的源代码训练n-gram和LDA模型,然后他们将源代码文档视为两种实体类型(代码和文本token)的混合成员,并在这些文档上训练link-LDA模型。接下来他们使用训练好的模型计算文档主题的后验概率,并以此进一步推断注释token的概率。最终拥有高概率的注释token将被推荐为源码文件的注释。
基于LDA,Rahman et al.分析Stack Overflow上的讨论以为开放源代码项目推荐注释。他们利用一种不同于Wongs的基于启发式的技术来挖掘众包知识,生成的注释主要用于描述源代码的清晰度、质量和范围,从而帮助改进源代码,并协助维护工程师执行维护任务。
Other Information Retrieval based Comment Generation Algorithms
Oda et al.使用了phrase-based machine translation(PBML)和tree to string machine translation(T2SMT)生成Python源码的伪码。PBML和T2SMT都是统计机器翻译框架。伪代码也是自然语言描述的一种,它可以帮助新手开发人员或经验不足的读者理解程序,因此可以将其视为特殊类型的注释。首先,他们构造了源代码/伪代码的平行语料库,即通过人工为现有源码添加了伪码;然后他们利用PBMT和T2SMT以及一些现有的开源工具在平行语料库上训练伪码生成器。这里的开源工具包括:目标自然语言的标注工具(tokenizer)和源程序语言的标注工具和解析工具(parser)。通过训练,他们自动获取了翻译规则,并在最终经过训练的伪码生成器可以输出针对目标源码的自然语言伪码。
此外,Allamanis et al.利用概率模型联合建模了源代码片段和相应自然语言查询之间的映射关系。他们训练源代码片段和自然语言查询之间的映射参数,在构建了可以双向映射的模型后,该模型可用于源码和自然语言之间双向检索的两项任务。根据源码匹配自然语言描述的任务就可以视为生成给定源码注释的任务。
综上所述,信息检索技术是代码注释生成研究的最早尝试。虽然人工智能和机器学习技术的发展,研究人员不断将深度学习之类的新兴技术应用于自动注释生成算法。接下来将对这一类型的技术进行总结和比较。
Deep Neural Networks based Comment Generation Algorithms
近年来,深度神经网络已在自然语言处理、机器翻译、图像识别和语音处理当任务上取得突出表现。在软件工程领域,研究人员将从源码到注释的转换任务视为编程语言和自然语言之间的翻译问题,并尝试使用深度神经网络来解决该问题。
基于深度神经网络的注释生成算法主要分为两类:基于RNN的算法和基于其它神经网络的算法。当应用神经网络解决注释生成问题时,encoder-decoder框架和attention机制是两个重要的结构。Encoder-decoder框架又被称为seqence to sequence模型,在该框架中,encoder起到将源码编码为固定大小向量的作用,decoder负责解码源代码向量,并对源代码的注释做出预测。众多encoder-decoder结构的不同源于输入的形式以及神经网络的类型。一般而言,encoder-decoder的内部结构会选择RNN、CNN以及RNN的变体,如GRU、LSTM。Attention机制通常被加在encoder-decoder框架中,负责动态分配较高的权重给那些解码器输入序列中关联程度更高的token。该机制可以显著提高长序列的性能。
因为基于深度神经网络的注释生成算法属于机器学习的类别,所以该算法需要包含代码和注释的高质量数据集来训练神经网络。在训练和调整神经网络模型参数时,可以采用一些预处理过的源代码(如AST或AST序列等)作为输入数据,相应的注释可视为注释系统的输出。
RNN based Comment Generation Algorithms
根据encoder中使用的RNN数量,我们将基于RNN的注释生成算法分为两类:基于single-encoder的注释生成算法和基于multiple-encoder的注释生成算法。
a)Single-encoder based comment generation algorithms
在基于single-encoder的注释生成算法中,encoder由一个RNN结构组成。Iyer el al.提出一个基于LSTM的注释生成模型CODE-NN,该模型使用带有attention机制的LSTM生成C#代码片段和SQL查询的自然语言摘要。CODE-NN基于从Stack Overflow中收集的包含标题-代码片段对的数据集训练,在此期间,attention机制会关注源码中相关的重要token,完成对相关及重要内容的选择,而LSTM则提供所有单词的上下文。
GRU同样用于encoder-decoder框架以生成源代码的注释。Zheng et al.使用基本元素为GRU的encoder-decoder框架以及全局的attention机制。他们将代码段中的嵌入标志(如标识符)作为可学习的先验权重以评估输入序列不同部分的重要性。再根据出现顺序将代码段中的标识符分类之后,他们将源码中的token编码为嵌入式token。这样一来,他们的注意力机制就可以专注于程序中的这些特定部分,换言之,注意力机制可以更好的理解代码结构。最终注意力机制提升了注释生成系统的准确性。
Hu and Li认为经过Structural-Based Traversal(SBT)生成的源码的AST序列带有更多的源码结构信息,因此他们提出DeepCom系统,使用根据SBT生成的源码的AST序列作为输入,以LSTM作为encoder和decoder的基本元素,经由训练,神经网络可以同时学得源码的结构信息和语义信息。
鉴于递归神经网络(RvNN)可用于表示自然语言语句的解析树,Liang et al.将RvNN应用于源码的解析树上以结合代码的语义信息和结构信息到表示向量中。随后他们利用RNN结构的decoder(Code-GRU)来解码这些向量。
b) Multiple-encoder based comment generation algorithms
该类注释生成算法在encoder-decoder结构中包含不止一个encoder,每一个encoder表示并抽取来自源代码的不同类型的信息,继而带来准确率的提升。
Hu and Li将从自动API摘要任务中获得的知识迁移到注释生成任务中。因此他们的注释生成系统配有两个encoder:API encoder和代码encoder。在已学习的迁移的API知识的帮助下,RNN decoder结合;恶来自两个encoder中的attention信息生成目标代码的摘要。
Wan and Zhao通过强化学习提升了自动代码摘要任务的性能。他们通过一个LSTM模型表示代码的序列信息,又通过另一个基于AST的LSTM模型来表示代码的结构信息。基于这两个encoder,他们通过强化学习模型解决了两个问题:exposure bias问题以及训练和测试测量的不一致问题。他们利用一个actor网络和一个critic网络联合决定每一个时间步的下一个最佳单词。此外,他们采用BLEU度量标准构成reward来训练以上两个网络。
Other Neural Network based Comment Generation Algorithms
CNN的作用在于它可以提取输入序列的层次特性。Allamanis et al.将CNN引入attention机制中,为源代码片段生成了简短的描述性摘要。注释系统采用的是encoder-decoder框架和注意力机制,而decoder的基本元素是GRU。他们的卷积注意力模块将卷积应用在输入源代码片段上,以检测应该关注的重要的token序列。CNN模型一般不常用于为时序序列建模,通常会选择CNN和其它辅助模型来解决时序序列问题。
除此之外,Mou and Li et al.利用CNN将源码的AST表示为向量,然后根据功能对程序进行分类。他们将程序完整的AST作为输入,同时设计了一个基于源码AST的卷积核以捕捉源代码的结构信息。尽管他们的目标并非生成程序注释,他们的源码模型可以为程序摘要生成任务所用。
尽管上述大多数方法都采用encoder-decoder结构,Allamanis et al.使用了神经网络中的对数双线性模型来推荐方法和类名。他们的模型利用连续嵌入来表示标识符名称。他们认为具有相似向量的标识符将出现在相似的上下文中。因此,他们通过选择具有相似向量的类和方法名称进行推荐,即对函数主体和候选标识符名称之间的向量进行比较。总之,他们利用神经概率模型替代encoder-decoder框架解决了方法命名问题。
总而言之,在基于深度学习的注释生成算法中,通常采用RNN、LSTM、GRU或CNN对源码进行建模然后实现各种软件工程任务。在注释生成模型中,RNN和CNN模型通常配备attention机制以提高准确率和效率。尽管基于深度神经网络的注释生成算法取得了一定成功,但它们仍旧难以同时对源码中的多个复杂信息同时建模。组合模型(Combined model)是未来研究的一个流行方向。
Other Comment Generation Algorithms
Software Word Usage Model based Comment Generation Algorithms
Software Word Usage Model(SWUM)由Emily Hill于2009年提出,这是一个源代码的全新表示模型。与早些时候常用的BOW相比,SWUM呈现了源码中更多的文本和结构信息。
Hill提出SWUM表示源码中的事实。一个SWUM模型由三层构成:为程序单词建模,为程序结构信息建模,为源码中的短语结构建模,各层之间有边相连。因此SWUM不仅能提取源代码的词汇和结构信息,还可以在语言信息和结构信息之间建立连接。基于这一模型,开发者们设计出了不同的得分函数以完成不同的应用任务。根据得分函数计算所得的分值,将从源代码中挑选出关键短语与结构信息。最终通过这些重点短语和关键词,注释将在设计好的语言模板的帮助下生成。
Sridhara and Hill et al.利用SWUM表示源代码并自动为Java方法和Java类的关键参数生成注释。通过传统的程序分析和自然语言分析,他们首先构建了SWUM,然后选择要包含在摘要注释中的内容,同时利用重要短语和关键词从方法模板中构建自然语言文本。在合并且平滑生成的文本之后,摘要注释便产生了。类似的,Sridhara and Pollock et al.结合SWUM启发式的产生方法的参数注释,并将它们添加到方法摘要中。他们首先利用源代码的结构和语言信息来确定要包含在方法参数摘要中的内容,然后借助模板生成简洁的用于描述方法内容的描述性短语。
基于同样的模型,McBurney et al.结合了PageRank算法和SWUM为Java方法生成摘要。他们使用SWUM来表示源代码并提取关于重要方法行为的关键字。PageRank的作用在于发现给定上下文中最重要的方法。他们的摘要由于附加了方法的上下文信息因此具有较高质量,此处的方法上下文信息由对方法调用的分析获得。
Ontology-RDF based Comment Generation Algorithms
一些系统利用ontology based Resource Description
Framework (RDF)来描述源代码的语义信息,并使用启发式方法找出源代码中的关键事实等。Rastkar and Murphy et al.提出一种自动生成自然语言摘要的方法用于横切源代码的问题(Crosscutting source code concerns)。他们从源代码中提取结构和词汇信息,并利用本体实例存储和描述所提取的语义信息,并通过最初用于描述资源的RDF图操作本体实例。在他们的方法中,三元组(资源,属性类型,属性值)用于表示一个特定类的一个属性。然后,他们使用一组启发式方法从相关的代码关注点中找到显著的代码元素和模式。最后,之前步骤中提取到的信息将根据模板构造摘要注释。他们的生成式摘要主要描述代码关注什么以及是如何实现的。
Stereotype Identification based Comment Generation Algorithms
Stereotype是系统设计中关于类的作用和责任的简单抽象,例如,accessor是一种返回信息的method stereotype。
Moreno and Aponte et al.使用Java类和Java方法的stereptype信息挑选可以包含在摘要中的内容并生成Java类的摘要。首先,他们识别Java类和Java方法的stereotype信息,然后利用启发式规则决定源代码中的那些信息可以被提取并添加到摘要中。他们的摘要关注类的职责与内容,而不关注与其他类的关系。此外,Abid et al.使用stereotype识别来区分C++方法的stereotype类型,并采用静态分析来提取方法的主要组成部分,以便根据针对不同类型stereotype预先设计的模板来生成摘要。
Other Algorithms
Sridhara and Pollock et al.仅采用启发式方法为Java方法中的高级别的操作生成简洁的注释。他们的注释系统基于识别的顺序语句、条件语句、循环语句设计并实现了规则集,然后开发相应的摘要模板,最后根据这些模板为Java方法生成摘要。
在与注释生成相关的重要文献中,有一些研究采用了最初并非为解决注释生成问题而设计的方法。Rodeghero et al.在摘要生成研究中引入了眼动追踪技术,基于对程序理解的眼动追踪的相关研究,他们可以检测出程序员在浏览源代码时所花费的眼动和凝视时间。根据这些信息,他们可以调整源代码中单词的权重并识别这些关键字,从而使生成的摘要更准确。Wang and Pollock et al.使用从开源项目中提取的一些规则来识别方法中与对象相关的动作单元,并为这些动作单元生成自然语言短语。他们使用数据驱动的方法来获取一组规则以标识源代码中的关键声明和自变量。最后,他们利用之前获得的信息,根据预定义的模板为动作单元构建自然语言描述。
Summarization of Comment Generation Algorithms
我们已经描述了注释生成算法的三个主要类别,接下来我们将进一步总结这些算法的特性。
基于信息检索(IR)的算法的特点主要表现在三个方面:首先这类注释算法将源代码视为普通文本,通过搜索源代码中的关键词、token或搜索相似代码的注释来构造注释。它们关注源代码的词汇语义,忽略了源代码的结构信息、数据依赖和调用信息。其次,这类算法的有效性很大程度上取决于数据集中的相似代码。如果在数据集中没有出现类似的代码,这类算法将无法为类生成准确的甚至是任何注释。如果源码包含不准确的命名标识符,同样很能生成准确的注释。第三,这类算法生成注释的数量和质量均取决于数据集中源代码的数量和质量。
基于深度神经网络的注释生成算法。大多使用基于RNN的encoder-decoder框架并借助attention机制将输入代码表示为向量,通常将注释生成任务视为机器翻译任务。attention机制的作用在于调整源码中各token的权重分布。当选择CNN构建注释生成系统时,有必要配备attention机制。基于深度神经网络的注释生成算法是监督学习的一种,因此这类算法需要高质量的数据集来训练神经网络的参数,以获取代码的生成模型。
除上述两类算法外,其它注释生成算法大多采用其它研究领域的现有模型来表示源代码,如眼动追踪和基于语义本体的RDF等等,也有采用其他模型如SWUM来表示源代码以产生令人满意的注释。
4 Quality Evaluation Criteria of Code Comments
现有的注释算法大多基于不同的数据集进行评估,从而导致实验结果难以比较,本质原因是缺乏统一的可用于评估的数据集。此外,就算法的效率和有效性而言,仍然缺少合适的注释评论标准。
近年来,一些研究学者们已在注释评估模型上展开研究,如下图所示:
Khamis et al.提出JavadocMiner,一个可以自动分析Javadoc注释质量的工具,他们使用一系列启发式规则,在语言质量和代码与注释之间的一致性方面对注释质量进行评估。Daniela Steidl et al.使用质量评估模型和一套全面而系统的指标对原生注释的质量评估开展了研究,他们将注释分为7个类别:copyright comments、 header comments、 member comments、 inline comments、 section comments、 code comments以及task comments。然后他们根据代码注释的相关性和长度为每种类型的注释提出了相应的评估指标和总体质量模型。他们的工作主要关注inline comments和member comments的质量。Yu et al.于2016年提出了一种给基于分类算法集合的源代码质量评估方法,该方法根据注释的格式、语言形式以及内容和代码的相关程度对注释进行评估。该方法的特点在于将机器学习和自然语言处理技术引入了注释质量评估中。他们通过使用基本分类算法的汇总来提高评估结果。总而言之,现有文献中针对源码注释质量评估的方法已开展了一些研究,但仍旧缺乏对生成注释(analytical comments)的质量评估的研究。
现有的评估方法可分为两类:手动评估和自动评估。手动评估依靠经验丰富的开发人员根据预定义的质量标准(如简明性、可读性、准确性等)对生成的注释逐一进行评估。尽管手动评估方法避免了特征选择和评估算法的复杂技术设计,但通常很耗时且成本高昂,因此对大量生成的注释而言并不合适。然而,现如今还没有专门用于代码注释的自动质量评估工具,软件工程邻域的研究者往往采用的是自然语言评估的标准和工具。常用的评价准则和工具有BLEU和METEOR,有时ROUGE和CIDEr也会被使用。总而言之,注释质量评估一般涉及以下三个方面:
- 实验数据集:指用于评估代码注释生成算法的数据集。
- 评估方法:一般包括人工评估和自动评估。
- 评估指标:指用于评估注释质量的标准。
Datasets for Validation
现有研究中用于验证的数据集通常在注释系统之间有所不同,这些数据集包括三个来源:来自GitHub软件仓库的开源项目、Stack Overflow的问答区以及开发人员通过如电子邮件等进行讨论和交流的信息。
尽管仅存在三种数据集,但是每个注释系统都将收集不同编程语言编写的不同项目作为数据集。即使某些系统从同一来源收集信息仍旧存在一些差异。总而言之,如今尚没有统一的公共验证数据集可供使用。
Automatic Evaluation
既然注释是以自然语言书写的句子,注释质量评估准则大多来源于自然语言处理领域相应的评估指标,这些度量标准最初旨在衡量机器翻译系统生成的句子的质量,已被证明可以很好地反映测试结果的准确性,并且测试结果与人工评估高度一致。现有的自动注释质量评价指标主要包括BLUE、METEOR、ROUGE和CIDEr。
BLEU
BLEU,全称Bilingual Evaluation Understudy,是一种自动评估机器翻译质量的方法,由Papineni et al.于2002年提出,可以用来自动分析候选文本和参考译文的共现程度。由于机器翻译的人工评估是广泛且昂贵的,BLEU被设计为一种快速、廉价且独立于语言的机器翻译自动评估方法。在评估结果的可靠性方面,BLEU的结构与人类评估高度一致,因此广泛应用于机器翻译和自动注释系统的质量评估。BLEU的核心评估内容是N-gram准确性,即匹配的n-gram在所评估的语句n-gram总数的占比。该指标分别为每个n-gram顺序计算准确性,并对每个准确性做加权几何平均得到最终准确性。对于候选文本而言,其与人类书写的自然语言参考文本越接近,得分就越高。对于n-gram准确性,n可以取1,2,3,4。当n=1时,BLEU在语料库级别上匹配程度较好的句子中拥有较好的性能表现,但随着句子的增长,其在句子级别上的匹配程度会下降。BLEU没有考虑召回,召回的缺失以及不考虑翻译和参考之间明确的单词匹配情况使得人类评估和BLEU评估之间的连贯程度难以提升。
METEOR
METOR,全称为Metric for Evaluation of Translation with Explicit Ordering,由Lavie于2005年提出。这是对BLEU的补充评估指标,它结合了召回率以反映翻译结果覆盖了原语句全部内容的程度,根据翻译和参考翻译之间显示的词对词匹配来计算得分,得分越高,其与参考翻译越接近,翻译质量也就越高。实验表明METEOR和BLEU相比显著提高了与人工评价之间的一致性。因此,METEOR常用作BLEU的补充对机器生成的代码注释质量进行评估。
ROUGE
ROUGE,全称为Recall-Oriented Understudy for Gisting Evaluation,是一种现在被广泛采用的自动摘要评估方法。ROUGE包括几个不同的指标,常用的四个是 ROUGE-N、ROUGE-L、ROUGE-W以及ROUGE-S。它们都是基于召回的方法,用于测量生成摘要和参考摘要之间的相似性。ROUGE-N和ROUGE-L通常用作衡量摘要注释质量评估的指标,ROUGE-L表示的是基于最长公共子序列的准确率和召回率的统计信息。
CIDEr
CIDEr,全称为Consensus-based Image Description Evaluation。研究人员认为,很多现有的评估指标与人类评估具有高度相关性,但是无法将它们统一为一个可以确定候选句子和参考句子之间相似性的指标。为了解决这个问题,一个基于共识的度量标准CIDEr就被提出了。它的主要原理是测量测试语句和大多数参考语句之间的相似度。实验结果表明,CIDEr指标在基于人类共识的匹配的结合度上比上述指标都要好。
因此,研究人员通常利用BLEU首先自动评估机器翻译,然后将METEOR用作最终评估结果的补充,这使得评估结果更加客观并且更接近于人类评估结果。一些代码摘要生成系统采用ROUGE和CIDEr来评估生成的注释,但ROUGE和CIDEr尚未得到广泛使用。
Human Evaluation
尽管人类评估主观且效率低下,但它仍旧是评估注释生成算法的重要方法之一。我们根据人工评估指标的特征将其分成了三类:
- 根据内容进行评估,,相关指标有准确性(accuracy,生成的注释在多大程度上反映了相关源码的语义)、内容充实性(Content adequacy,注释包含了源码内容的多少信息)、简洁性(Conciseness,用于评估注释包含不必要信息的程度)、信息度(Informativeness,忽略语言的流利度,衡量从输入代码到生成注释涵盖的内容量)、可解释性(Interpretability,生成的注释在多大程度删传达了源码的含义)。
- 根据自然语言特征进行评估,忽略内容,对生成注释的语法和流利程度进行评估,,相关指标有自然性(Naturalness,衡量注释的语法性和流畅性)、表现力(Expressiveness,衡量注释表述方式上的可读性和可理解性)、可理解性(Understandability,根据注释的流利程度和语法进行评估)。注:自然性课可理解性在不同研究中的名称不同但意义基本一致。
- 根据效果进行评估,判断生成的注释是否是有用、必要的,或是评估生成的注释在多大程度上帮助开发人员理解程序,相关指标有有用性(Usefulness,度量所生成的注释在多大程度上对开发人员理解代码有用)、代码的可理解性(Code understandability,用于评估生成的注释在多大程度上有助于开发人员理解程序)、必要性(Necessity,衡量生成注释的必要程度)、实用性(Utility,衡量生成的注释在多大程度上帮助开发人员理解代码)。
此外,准确性和召回率也可用于评估所生成注释的有用性,这两个指标均来自信息检索指标,准确性是正确n-gram在所评估注释中的比例,召回率是参考注释中正确预测的n-gram的比例。
人工评估的特点是准确性高和能产生令人信服的评估结果,但同时也要付出高昂的时间、人力、物力成本,也要评估者的主观影响。但是,人工评估仍然是代码注释的非常重要的质量评估方法。 并且它不会被自动评估取代。总而言之,自动评估有其自身的优势,它可以弥补手动评估的弱点。但到目前为止,还没有出现成熟、有效且廉价的注释质量评估工具,这是在代码注释生成任务中要解决的重要问题。
综上所述,在设计评估实验和选择评估标准时,应根据注释系统所采用的算法设计选择合适的评估标准,以使设计的实验和评估结果更具说服力。
5 Future Directions
作为软件工程领域的重要研究方向,源码注释技术近十年以来一直受到学者的关注。但是由于其内部复杂性和现有技术的局限性,它仍然是一个具有挑战性的研究主题。近年来,代表性的工作之一是利用深度神经网络解决自动注释生成的问题,并且已经获得了一些有潜力的结果,但其仍然存在一些缺点,例如,所生成评论的准确性低以及整体上所生成的评论不足。在下面的讨论中,我们总结了自动注释生成的未来研究方向:
- 探索深度神经网络与其他模型之间的协同作用。自动生成代码注释的问题不是自然语言中的简单翻译问题,而是从结构化源代码到自然语言句子的转换问题。因此,探索深度神经网络与其他模型之间的协同作用以表示源代码仍然是一个开放的研究主题。
- 融合不同的源代码模型。
- 设计定制的智能自动注释生成系统,以满足各种场景。为了解决自动代码注释生成的问题,应主要执行两个任务:源代码表示和文本生成。代码注释的目的是提高源代码的可读性,这有助于软件开发人员和维护工程师更快、更好地理解程序,并有益于他们执行其他任务;另一方面,代码注释可以使开发人员免于手动编写注释。因此,设计定制的、智能的自动注释生成系统以满足特定应用场景中不同开发人员的需求是自动代码注释生成的重要方向之一。
- 测试数据集和注释质量评估模型的统一。