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

陶传奇  等:编程现场上下文深度感知的代码行推荐                                                        3361


                 来观察推荐结果数对推荐结果的影响.
                    •   问题 4:本方法中,对推荐结果进行二次排序是否能使相关度更高的结果具有更高优先级以及比较合适
                        的θ值设置是多少?
                    本文方法中,在通过集束搜索得到最合适的 n 个排好序推荐结果之后,还要利用之前提到的 LSA 相似度对
                 推荐结果进行二次排序.这一过程是否必要,需要通过实验验证.对于优先级调整的 LSA 相似度阈值设置,设置
                 太低或者太高,虽然对二次排序结果影响很大,但是对排序所花费时间影响同样很大.因此,根据经验,将 LSA 相
                 似度的可能的取值设为 0.4~0.8,并根据实验找出合适的θ值.
                    在方法测试过程中,本文使用 MRR(mean reciprocal rank)和准确率(precision)作为衡量指标.当推荐项和参
                 考推荐结果的 BLEU 相似度得分大于阈值 62.79(%)时,我们评定该推荐项为有效推荐项.该阈值是在实验 3 中
                 通过对 100 个测试集进行人工观测评定准确性后,取有效推荐项计算平均 BLEU 相似度得分所得.在 4 个实验
                 中,我们对实验 3 的结果进行人工观测评估,其他 3 个实验采用 BLEU 相似度得分来衡量推荐结果中推荐项是
                 否有效.

                 4.2   实验结果
                    本节将展示实验的结果,并对第 4.1 节中提出的 4 个问题逐一回答.
                 4.2.1    对问题 1 的回答
                    为了回答问题 1,我们探讨源代码数据集的处理程度对推荐结果的影响.在该实验中,我们对原始数据集进
                 行不同程度的处理.按照处理程度的不同,分为 4 个等级,从 0~3 分别为原始数据集、对 API 进行统一化、对基
                 本数据类型进行处理和删除某些特定字符(如无意义的括号和变量值),高等级包括所有低等级的处理.
                    为了控制变量,在进行该实验时,我们将 k 值设置为 10,即对每个测试用例推荐 10 个供选择的代码行.用于
                 测试的实例数共 1 000 个.表 3 中给出了 5 个实验中真实使用的实例,由表可知,对源码进行统一化处理的程度
                 不同,对推荐结果的准确率和 MRR 两个指标都有影响.

                                             Table 3    Instance of dataset processing
                                                   表 3   数据集处理实例
                        ID                   输入                                 输出
                             boolean boolean_type=true
                         1                                        if (list.get(int_type).equals(“stringValue”))
                             for (int int_type=0; int_type<list.size(⋅); int_type++)
                             List〈String〉 list〈string〉=new ArrayList〈String〉(⋅)
                         2                                        while (string=bufferedreader.readLine(⋅)!=null)
                             String string=“stringValue”
                             bufferedwriter.append list〈string〉.get(int_type)
                         3                                        bufferedwriter.flush(⋅)
                             bufferedwriter.newLine(⋅)
                             String string=list〈string〉.get(int_type)
                         4                                        continue
                             if (string.equals(“stringValue”))
                             String string=“stringValue”
                         5                                        string=string+string.trim(⋅)+“stringValue”
                             for (String string: list〈String〉)
                    表 4 展示了两个衡量指标在 4 个不同等级处理程度的结果.
                                    Table 4    Experimental results of two metrics at different levels
                                        表 4   不同处理等级在两个衡量指标上的实验结果
                                                                 等级
                                         指标
                                                   Level 0   Level 1   Level 2   Level 3
                                      Precision (%)  17       29       55       58
                                        MRR        0.052 8   0.129 5   0.274 3   0.298 6
                    从表中可以看到,在没有对数据集进行任何处理时,准确率仅仅只有 17%.这是因为没有做任何处理的源代
                 码中包含大量的个性化字符,包括用户自定义的变量名、变量值和对象名等.这些字符都是噪声,会对方法的推
                 荐结果产生影响.而对 API 进行处理和对数据类型进行统一化之后,准确率分别是从 17%提高到 29%,从 29%提
                 高到 55%.这说明推荐结果的准确率受处理的 API 和数据类型影响较大.从表中可以看出,0~3 不同处理等级对
   30   31   32   33   34   35   36   37   38   39   40