Page 213 - 《软件学报》2021年第7期
P. 213

陈翔  等:代码注释自动生成方法综述                                                              2131


                               Table 4    Comparison of deep learning-based generation methods (Continued)
                                           表 4   基于深度学习的生成方法的对比(续)
                        相关文献        模块粒度        编程语言          方法类型                 主要特征
                       Loyola 等人 [62]    代码变更   Python、C++、Java、 经典编码器-解码器        基于 LSTM
                                                JavaScript
                       Jiang 等人 [46,63]    代码变更   Java     经典编码器-解码器               基于 RNN
                        Xu 等人 [64]    代码变更        Java     经典编码器-解码器     抽取代码结构和代码语义信息,使用复制
                                                                               机制缓解 OOV 问题
                        Liu 等人 [66]    代码变更       Java     经典编码器-解码器     基于 AST 对代码变更进行编码,并提出
                                                                                一个混合排序模块
                        Liu 等人 [15]    Pull Request   Java   经典编码器-解码器     借助指针生成网络缓解 OOV 问题
                       Shido 等人 [67]    方法        Java     其他类型学习方法           使用扩展的 Tree-LSTM
                      LeClair 等人 [68]    方法       Java     其他类型学习方法             利用了图神经网络
                        Liu 等人 [69]    函数        C/C++     其他类型学习方法       基于联合代码属性图和基于检索增强
                                                                                机制的图神经网络
                       Wan 等人 [70,71]    代码段     Python    其他类型学习方法              利用了强化学习
                       Chen 等人 [72]    代码段    C#、SQL 查询    其他类型学习方法       通过构建两个 VAEs,同时考虑了注释
                                                                                 生成和代码检索
                        Ye 等人 [73]    代码段    Python、SQL 查询  其他类型学习方法     基于对偶学习,同时考虑了注释生成和
                                                                                   代码检索
                       Wang 等人 [74]    代码段       Python    其他类型学习方法      借助演员-评论者网络,同时考虑了注释
                                                                                 生成和代码检索
                        Wei 等人 [75]    代码段、方法  Python、Java   其他类型学习方法    基于对偶学习,同时考虑了注释生成和
                                                                                 代码生成问题
                        Hu 等人  [76]    方法         Java      其他信息来源            额外考虑了 API 序列信息
                       Zhang 等人 [77]    代码段、方法  Python、Java   其他信息来源     利用与目标代码语法和语义相似的代码段
                        Liu 等人 [78]    方法         Java      其他信息来源            考虑了代码的调用信息
                       Zhou 等人 [79]    方法         Java      其他信息来源       考虑了方法的上下文信息,综合使用了
                                                                              程序分析和预定义的模板
                       Haque 等人 [80]    方法        Java      其他信息来源            考虑了文件的上下文信息

                 5    代码注释语料库分析

                    早期的研究基本上都是从 Github 里选择流行的开源项目,并借助用户研究(human study)方式对所提方法
                 的有效性进行评估,因此实验规模较小,并以案例分析为主.随后,研究人员逐渐共享出他们整理的语料库,并吸
                 引了更多研究人员针对该研究问题展开深入的研究.不难看出,这些语料库是当前基于深度学习的方法能够生
                 成高质量代码注释的一个重要前提.本文对目前代码注释自动生成研究已共享的主流语料库进行了总结,具体
                 见表 5,包括相关文献、编程语言、模块粒度、共享网址和累计使用次数.接着,我们将简要介绍表 4 中的部分
                 经典语料库.
                                         Table 5    Statistics for shared code comment corpus
                                             表 5   目前已经共享的代码注释语料库
                  共享语料库的文献        编程语言     模块粒度                       共享网址                       累计次数
                     Hu 等人 [13]     Java     方法              https://github.com/huxingfree/DeepCom   8
                   Barone 等人 [81]    Python   代码段             https://github.com/rsennrich/nematus   6
                    Jiang 等人 [46]    Java   代码变更              https://sjiang1.github.io/commitgen/   3
                    Iyer 等人 [10]  C#、SQL 查询   代码段              https://github.com/sriniiyer/codenn   2
                   LeClair 等人 [82]    Java   方法                 http://leclair.tech/data/funcom     2
                  Allamanis 等人 [54]    Java   方法            https://groups.inf.ed.ac.uk/cup/codeattention   1
                     Hu 等人 [76]     Java     方法              https://github.com/xinghu/TL-CodeSum   1
                   LeClair 等人 [60]    Java   方法         https://s3.us-east-2.amazonaws.com/icse2018/index.html   1
                    Yao 等人 [83]  SQL、Python   代码段   https://github.com/LittleYUYU/StackOverflow-Question-Code-Dataset   1

                    Iyer 等人 [10] 首次基于 Stack Overflow 搜集了语料库并进行了共享.他们使用 C#标签来过滤与 C#相关的帖
                 子,使用 sql、database 和 oracle 标签来过滤与 SQL 相关的帖子.在 Stack Overflow 中,每个帖子均包含标题、具
                 体的问题和相关的回答(有时会将其中一个回答标记为已接受的回答).他们只提取了在已接受回答中仅含有一
   208   209   210   211   212   213   214   215   216   217   218