Page 207 - 《软件学报》2021年第7期
P. 207
陈翔 等:代码注释自动生成方法综述 2125
这些软件仓库以寻找与目标模块相似的代码段,并利用这些相似代码段的描述、注释和讨论等以生成代码
注释.
3.2 已有工作的分析
3.2.1 基于代码关键词抽取的方法
这类方法尝试着从目标代码中识别出核心关键词或语句,随后将这些识别出的关键词或语句视为代码摘
要,我们将这类注释称为基于单词的代码注释.这类方法主要受到自动文本摘要(automatic text summarization)
研究问题的启发.自动文本摘要主要针对单个或多个文档,以尝试生成简短且包含文档核心内容的摘要.这类方
法的主要流程可总结如下:首先构造语料库,在构造时主要包括单词识别、停用词移除和词干还原等操作.与文
档不同,代码需要额外针对标识符,根据命名规范(例如驼峰命名法、下划线命名法)做进一步的切割.例如,可以
基于驼峰命名法将标识符 setValue 进一步切割成 set 和 value 这两个单词.除此之外,在确定停用词清单时,还需
要额外添加与编程语言相关的关键词.这类方法经常考虑的检索模型包括 VSM(vector space model)、LSI(latent
semantic indexing)和 LDA(laten Dirichlet allocation)等.在 VSM 模型中,向量中的每个元素表示文档中对应单词
的权重,其中,tf(term frequency)、idf(inverse document frequency)和 tf-idf 是使用最多的单词权重计算方法.LSI
模型使用 SVD(singular value decomposition)方法将文档向量从高维单词空间映射到低维的语义空间(即主题空
间).LSI 模型可以用于挖掘文本隐含的主题信息,而不需要依赖任何先验知识.LDA 模型将狄利克雷先验分布引
入到文档-主题分布和主题-单词分布中,模型的学习和推断算法主要基于贝叶斯估计.
[7]
Haiduc 等人 最早提出了基于信息检索的自动文本摘要技术.该方法主要包括两个步骤:首先,从系统中的
每个文档(例如函数或类等)内抽取单词,并通过切割标识符和移除停用词来构建语料库.接着,针对语料库内的
文档确定最为相关的单词.在他们提出的方法中,仅考虑了 LSI 和 VSM 这两种检索模型.以 VSM 检索模型为例,
如果将单词和文档建模为矩阵,则矩阵中的每个单元格表示单词在对应文档中的权重,在设置单词权重时,他们
考虑了 log、tf-idf 和 binary-entropy 这 3 种方法.随后给定一个文档,他们会根据单词权重,从中抽取出排名前 k
[8]
的单词,并将这些单词视为代码摘要.Haiduc 等人 随后基于代码的词法信息(lexical information)和结构信息
(structural information)以尝试生成注释.具体来说,首先,他们基于 LSI 建模模型来构建语料库,其中每个文档对
应一种方法.随后,在 LSI 处理后的空间内,计算出方法文本和语料库中每个单词的距离.接着,将语料库中的单
词按照与方法间的相似度从大到小进行排序.最后,将排名前五的单词视为方法的注释.Eddy 等人 [35] 对 Haiduc
[7]
等人的工作 进行了重现和扩展,他们基于分层主题模型 hPAM(hierarchical PAM),提出一种新的代码摘要生成
[7]
方法.但与 Haiduc 等人的研究工作 相比,他们发现所提方法的性能并不一定能带来提升.McBurney 等人 [36] 基
于主题模型,将代码内的主题以层次方式进行组织.在层次的顶层倾向于描述更高级别功能的主题,而在层次的
底层倾向于描述更低级别功能的主题.例如,主题 play sound 处于主题 decode mp3 和主题 open files 的顶层.
Rodeghero 等人 [11,37] 基于眼动追踪(eye-tracking)技术来识别出开发人员在代码阅读过程中重点关注的语
句和关键词.他们首先雇用了 10 名 Java 开发人员,要求这些开发人员阅读 Java 方法的代码并编写对应的注释.
随后通过分析这些人员的眼动和注视信息,来确定他们在查阅代码和编写注释时经常关注的关键词.通过与其
他工具识别出的关键词进行比较,Rodeghero 等人发现,基于眼动跟踪获取的关键词有助于生成更高质量的代
码注释.
Fowkes 等人 [38] 发现,很多集成开发环境具有代码折叠(code folding)的功能,该功能可以支持开发人员有针
对性地展示或隐藏部分代码段.目前开发人员一般借助手工方式,来决定使用代码折叠功能的时机.他们提出了
TASSAL 方法,该方法在折叠非核心代码时,可以自动生成对应的注释.其核心是需要确定与代码内容最为相关
的词素(token).在他们的研究工作中,主要比较了 VSM 模型和主题模型.
3.2.2 基于软件仓库挖掘的方法
仅基于项目内模块来构建语料库,可能存在信息不足的问题.为了缓解上述问题,通过挖掘软件仓库,有助
于搜集与目标代码相关的知识,并利用这些相关知识来生成更高质量的代码注释.
一些研究人员尝试着利用项目缺陷跟踪系统和开发人员往来邮件内的知识来生成代码注释.Panichella 等