Page 95 - 《软件学报》2021年第9期
P. 95
贾统 等:基于程序层次树的日志打印位置决策方法 2719
该问题,提出了一种子树上提的方法来捕获这些孩子节点的特征.如算法 2 所示:子树上提利用深度优先遍历算
法,搜索某节点的所有子孙节点(第 2 行),然后将这些代码块依次遍历顺序排列组合成新的代码片段(第 3 行、
第 4 行),最后将该代码片段输入已训练的神经语言模型生成新的子向量(第 5 行).在逆序组合过程中,使用该新
的子向量替代原子向量.
算法 1. 基于逆序组合的特征向量生成算法.
Input: PLST and target code block(tb), n, m;
Output: Feature vector of target code block(fv).
1. fv=[⋅], layer=init_layer, temp_tb=tb
2. while layer>0 and init_layer-layer<n do:
3. fv.concatenate(temp_tb.sub_vector)
4. left_num=0
5. while temp_tb.left_cb!=null and left_num<m do:
6. temp_tb=temp_tb.left_cb
7. if temp_tb.children!=null then:
8. temp_tb=SubtreeRaising(temp_tb)
9. fv.concatenate(temp_tb.sub_vector)
10. left_num++
11. temp_tb=temp_tb.father_cb
12. layer−−
算法 2. 子树上提算法.
Input: PLST, root code block of a subtree(rcb), trained PV-DM model;
Output: feature vector of subtree(fv).
1. code_snippet=‘⋅’
2. codeblock_queue=DepthFirstSearch(rcb)
3. while codeblock_queue!=null do:
4. code_snippet.concatenate(codeblock.pop(⋅))
5. fv=PV-DM(code_snippet)
图 4 是子向量逆序组合过程的一个例子,其中,N 8 是目标代码块.
Fig.4 Example of reverse composition
图 4 子向量逆序组合示例
本方法首先逆序组合生成第 4 层到第 1 层的层向量.由于 N 8 是第 4 层中唯一的代码块,排列 N 8 对应的子向
量 v 8 并用零填充的其余部分作为第 4 层目标代码块的层向量.对于第 3 层,依次组合 N 8 的父节点 N 6 对应的子