Page 328 - 《软件学报》2025年第8期
P. 328

赵衔麟 等: 面向代码注释生成任务的注释质量评价研究                                                      3751


                 3.1  节的梳理中可以看出, 目前在准确性/相关性、简洁性、自然性/流畅性等维度都有可供参考的较为明确的评价
                 指标. 注释的完整性需要视具体的场景而定, 难以统一评价. 此外, 注释的有用性/信息量体现了注释对于开发者理
                 解代码的帮助程度, 是格外重要的一项维度. 为了丰富对这一维度的评价, 除了参考现有的指标                            c_coeff 外, 本文作
                 者还进一步提出了一个指标          mesia (mean supplementary information amount) 以评价注释提供额外信息的程度   [94] .
                 最终, 本文选取了相关性、简洁性、自然性、有用性这                  4  个维度共  8  个指标进行注释质量评价, 如表        5  所示. 下面
                 详细介绍各指标的具体情况.


                                              表 5 本文使用的注释质量评价指标

                      评价维度               相关性              简洁性               自然性              有用性
                    现有文献的指标           lexical_tfidf  [81,82]  comment_len [21,86]  flesch_ease [86,88]  -
                    本文设计的指标            lexical_w2v       conciseness     grammar_error    coefficient, mesia

                 3.2.1    相关性评价指标
                    本文采用的相关性指标是如下两个计算代码与注释相似度的指标. 代码与注释的相似度与注释的相关性有较
                 强的关联, 能够部分反映注释的相关性.
                    (1) lexical_tfidf
                    该指标是    Corazza 等人  [81,82] 提出的, 其将代码和注释表示成   TF-IDF  向量并计算二者的余弦相似度. lexical_tfidf
                 指标越高表明代码和注释在词汇分布上越相似. 其具体计算方式如下.
                    首先, 将语料库中的      N  对代码和注释中的所有词按驼峰命名法和蛇形命名法进行切分, 得到大小为                        M  的词汇
                 表. 对于第  i 对代码和注释, 设注释的       M  维  TF-IDF  向量为  com i com i  的第  j 维对应词汇  w  在该注释中出现的次数
                                                                 ,
                   num w , 语料库中包含  w                           com i_j  可以通过如下计算得到:
                 为                   的代码和注释总数为       docNum w . 则

                                                            num w
                                                         t f =                                        (2)
                                                             len

                                                          (          )
                                                               2N
                                                   id f = log                                         (3)
                                                           docNum w +1

                                                      com i_ j = t f ×id f                            (4)
                    由此可得注释的       M  维  TF-IDF  向量, 代码的  M  维  TF-IDF  向量  code i  可以按同样方式得到. 由此, 第  i 对代码
                 和注释的   lexical_tfidf 指标结果可计算如下:

                                                                 T
                                                              com code i
                                                                 i
                                                  lexical_tfidf =                                      (5)
                                                             |com i |·|code i |
                    (2) lexical_w2v
                    lexical_tfidf 基于词频分布表示代码和注释, 无法体现出词汇语义间的关联, 例如代码中含有“remove”而注释
                 中使用了“delete”, 二者的关联无法被识别. 为此, 本文对         lexical_tfidf 指标进行了调整, 进一步使用词嵌入      (Word2Vec)
                 进行代码和注释的向量表征, 提出了            lexical_w2v 指标. 其可以为语料库中的词语训练出具有语义关联的词向量.
                 具体来说, lexical_w2v 指标采用了经典的词向量模型——CBOW              模型  [95] 将代码和注释中的所有词汇都映射为向
                 量. 设  comW2v i  为注释中所有词汇的词向量平均值,        codeW2v i  为代码中所有词汇的词向量平均值, 则:

                                                                 T
                                                           comW2v codeW2v i
                                                                 i
                                               lexical_w2v =                                          (6)
                                                          |comW2v i |·|codeW2v i |

                 3.2.2    简洁性评价指标
                    (1) comment_len
                    参考   Khamis 等人  [86] 和  Steidl 等人  [21] 的工作, 本文也将注释长度纳入简洁性评价指标. 记注释的词数为
                 wordNum, 则:

                                                   comment_len = wordNum                              (7)
   323   324   325   326   327   328   329   330   331   332   333