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.