Page 33 - 《软件学报》2021年第11期
P. 33
陶传奇 等:编程现场上下文深度感知的代码行推荐 3359
3.3 推荐过程
程序开发语言的编写过程中,代码行之间具有一定的无序性,即交换某些行的顺序并不会影响程序功能的
实现.为了更加精准地推荐代码行,我们应该尽可能获得所有可能正确的当前代码行,并按可能性优先级进行排
序,然后推荐给开发人员让其进行选择.
具体推荐过程的伪代码如算法 1 所示.
算法 1. 编程现场上下文深度感知代码行推荐过程算法.
Input:编程现场数据.
BEGIN
1: Action←getUserAction(⋅);
2: //获取用户动作
3: DO WHILE (Action==True)
4: //如果用户选择推荐
5: setParameters(⋅); //参数设置
6: CodeLines←getCodelines(⋅); //获取编程现场代码行数据
7: CodeStructureInformation←AST(CodeLines);
8: //利用抽象语法树抽取结构信息
9: UnifiedCodeLines←unifyCodelines(CodeStructureInformation);
10: //数据处理模块对初始代码行进行统一化处理
11: TaskData←GetTaskData(⋅);
12: //采集编程现场任务数据
13: RecommendedLines←deepModel(UnifiedCodeLines);
14: //以统一化处理之后的代码行上下文作为模型输入得到推荐代码行结果
15: OrderedRecommendedLines←beamSearch(RecommendedLines);
16: //集束搜索实现初次推荐结果排序
17: FOR j=0 TO n DO
18: 〈SippetData,SIMILARITY〉←LSA(TaskData,θ,SippetDataSets);
19: //根据 LSA 相似度和预设的阈值获取代码段数据集中和当前编写方法类似的代码段及相似度
20: COUNTER←0;
21: DO WHILE (COUNTER<n)
22: //对 n 个推荐结果进行二次排序
23: IF (OrderedRecommendedLines IN SippetData) THEN
24: SecondOrderedLines←Reordering(OrderedRecommendedLines,SIMILARITYS);
25: //调整推荐代码行优先级
26: END IF
27: COUNTER++;
28: END WHILE
END
Output:N 个排好序的代码行推荐结果.
为了实现上述目标,本文利用集束搜索(beam search) [20] 得到多个推荐结果.通过集束搜索得到经过初次排
序的 n 个推荐结果之后,还需要依据第 2.3 节采集到的当前任务数据对推荐结果的优先级进行二次排序.这部分
采用基于检索的方法.具体操作是:采集到的当前任务数据的形式是类名#方法名#代码行上下文#注释信息,利
用已有的类名#方法名#代码行上下文#注释信息和代码段数据集 D 中的代码段信息进行相似度比较.即将代码