Page 31 - 《软件学报》2021年第11期
P. 31
陶传奇 等:编程现场上下文深度感知的代码行推荐 3357
除了代码行上下文以外,数据采集模块还尽可能地采集用户当前的任务数据,主要包括类名、方法名以及注释
信息.
现场数据清洗模块主要对数据采集模块所采集到原始数据进行数据清洗,因为数据采集模块采集到的编
程现场的数据包含大量无用信息,无法直接使用.现场数据清洗模块按照第 2.2 节提出的数据处理规则对数据
进行统一化处理,以类名#方法名#代码行上下文#注释信息的形式进行保存,用于对推荐结果进行二次排序和
优化.
3 编程现场上下文深度感知的代码行推荐方法
本节具体描述编程现场上下文深度感知的代码行推荐方法,包括学习方法模型和推荐方法.本文学习方法
使用基于注意力的循环神经网络编码-解码模型(attention-based RNN Encoder-Decoder model)来实现代码行的
学习的任务 [7,14] .图 5 描述了方法的总体结构,包含了一个离线训练阶段和一个在线代码行生成推荐的阶段.
Fig.5 Overall workflow of DA4CLR
图 5 DA4CLR 总体框架图
本文方法在理论上可以应用于任何程序设计语言.为了方便描述,我们用 Java 程序设计语言为例进行描述.
下面,本文将对方法模型进行详细介绍.
3.1 方法模型
如第 2 节描述 , 循环 神经网络编码 - 解码模型是 对基本神经 语言模型的 扩展 , 能够 较好地解 决
Sequence2Sequence 问题.因此,循环神经网络编码-解码模型用来作为实现本文方法的重要手段.
图 6 展示了将循环神经网络编码器-解码器的 RNN 框架用于代码行上下文感知的示例.将已有的上下文代
码行 String string=“stringValue” for (String string: list〈String〉)作为输入序列、string=string+string.trim(⋅)+
“stringValue”为输出序列,即为当前代码行.如图所示,编码器 RNN 将源语句 String string=“stringValue” for
(String string: list〈String〉)中单词逐一读入,当读第 1 个单词 String 的时候,该单词被数值化表示为向量 x 1 ,并用该
[15]
向量计算当前的隐藏状态 h 1 .然后读入下一个单词 string,数值化表示为 x 2 ,然后用 x 2 将隐藏状态 h 1 更新为 h 2 .
不断重复该过程,直到读入最后一个单词 list〈String〉,并得到最后一个状态 h 8 ,最后的状态就是上下文向量 c.