Page 28 - 《软件学报》2021年第11期
P. 28

3354                                Journal of Software  软件学报 Vol.32, No.11, November 2021

                 断模型网络的记忆状态(之前网络的状态)在该层输出的结果是否达到阈值,从而加入到当前该层的计算中.所
                 有门控单元都具有 sigmoid 非线性,而输入单元可具有任意的压缩非线性.状态单元也可以用作门控单元的额外
                 输入.

                 1.3   RNN Encoder-Decoder模型
                    循环神经网络编码-解码模型(RNN Encoder-Decoder  model)是自然语言处理中比较常用的方法,通过两个
                 RNN 分别作为编码器和解码器,来实现对应的自然语言之间的翻译.该框架对解决 Sequence-to-Sequence 类问
                 题有比较好的效果,Sequence 可以理解为一个字符串序列,当给定一个字符串序列后,期望得到与之对应的另一
                 个字符串序列.
                    该模型的不足在于编码器 RNN 输出的上下文 C 的维度较小而难以适当地概括一个长序列.这种现象由
                 Bahdanau 等人 [11] 在机器翻译中观察到.因此,他们提出让 C 成为一个可变长度的序列.此外,他们还引入了将序
                 列 C 的元素和输出序列的元素相关联的注意力机制(attention mechanism).本文的方法将基于该机制.
                 2    数据收集和数据质量评估


                 2.1   源数据选取
                    为使数据种类更加丰富,本文收集了 80 个最常用的 Java 的 jar 包.源码数据集的选择标准如下.
                    •   首先,这些项目都是开源的,并且在软件工程相关的研究中具有较高的使用频率.因此,可以认为它们具
                        有更高的质量,更加符合一般的编程规范,代码简洁并且上下文联系更加紧密.
                    •   其次,这些 jar 包项目的版本更新较为活跃,具有悠久的演化历史.
                    我们从中选择相对稳定的版本作为数据集.并且,大部分这些 jar 包隶属于正规组织或软件公司.其中一部
                 分见表 1.
                               Table 1    Examples of open source projects and jar packages used in this paper
                                            表 1   本文使用的开源项目和 jar 包示例
                             开源项目      Open-source project  junit-team  square  OpenRefine  b3log
                               Star         8.2k         7.2k        6k         5.7k     5.5k
                              Jar 包         junit        guava    commons-io   testng    log4j
                              版本            4.8          23.3        1.3        5.13     1.2

                    数据收集过程中,为了构造具有较高质量的代码块数据集,本文提出一个面向 GitHub 平台的开源源码数据
                 质量评估框架,通过在 GitHub 上收集项目托管者和项目的信息来评估源码质量.具体来说,本文通过计算
                 Watch/(Watch+Star+Fork)的值来评估 GitHub 项目托管者是否是有经验的开发人员.因为我们在调研 GitHub 项
                 目刷 Star 数的行为时,发现更多的是同时刷 Star 和 Fork 数目,但较少有刷 Watch 数量.所以,本文使用 Watch 作
                 为分子.通过实验研究,得到阈值为 0.058 可以作为评估项目托管者是否具有一定开发经验的依据.
                    此外,我们还使用 Watch、Star、Fork、Issues、Pull  requests 以及 Commits 来评估单个 GitHub 项目质量.
                 为了计算每个指标对应的阈值,我们随机收集了 6 000 个项目.为了减少极值的影响,对 6 000 个项目的每个指标
                 值,将它们从高到低排序,然后在去除最高的 10%的值和最低的 10%的值后,计算得到平均值.每个指标的对应阈
                 值分别为 11,76,28,4,1 和 58.所以,为了构建一个质量更高的项目数据集,我们按照如下流程选择项目:(I)  项目托
                 管者在 Watch/(Watch+Star+Fork)指标上的值大于 0.058;(II)  项目的相应指标值高于阈值 11,76,28,4,1 和 58.
                    本文使用 PMD(一种可扩展的跨语言静态代码分析器)来进行源码静态检测.PMD 通过其内置的规则来检
                 查 Java 代码,包括潜在的缺陷、未使用的代码和重复的代码等等.这些规则涵盖了源代码可能存在的缺陷.根据
                 30 名具有 4~6 年 java 开发经验的开发人员的意见,最终选择 8 条重要的 PMD 规则,包括 basic、braces、unused
                 code、string、strict exception、naming、design 以及 coupling.为了计算每条规则对应缺陷数阈值,我们对 45 个
                 具有高质量的 java 项目进行 PMD 检测,最终计算得到对应阈值分别为 2,1,1,3,1,4,0 和 1.
   23   24   25   26   27   28   29   30   31   32   33