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

3360                                Journal of Software  软件学报 Vol.32, No.11, November 2021

                 段数据集 D 中每个代码段信息抽取整合为类名#方法名#代码行上下文#注释信息形式,然后和当前任务数据进
                 行比较,计算相似度.如果存在相似度高于阈值的代码段,并且该代码段中含有推荐结果中优先级为 k 的推荐的
                 代码行,则将该推荐结果重新排序,将该推荐项在整个包含 k 个推荐项的推荐结果中的优先级进行上调,相似度
                 越高,优先级越高.相似度衡量使用 LSA(latent semantic analysis)潜在语义分析,LSA 的核心思想是:将词和文档
                 映射到潜在语义空间,再比较其相似性,从而去除了原始向量空间中的一些“噪音”.由于相似度匹配考虑到了语
                 义相似度,而不仅仅是进行关键词匹配,故提高了信息检索的精确度.这里的阈值设置为θ,具体的值在后面的实
                 验中通过实验得到.
                    为了易于理解,我们对整个过程举例描述.为了方便表示,这里指定推荐代码行数目为 2,如下所示.
                    在实际开发过程中,用户在类 Tools 中编写 getFileContent 方法块时,对方法的功能描述为:Gets the file
                 contents for the specified file path,并且已经键入:
                    String string=“stringValue”
                    for (String string: list〈String〉)
                    基于注意力的循环神经网络编码-解码模型以此为输入得到的推荐结果为:
                    1.    continue
                    2. string=string+string.trim(⋅)+“stringValue”
                    二次排序时,实时捕获用户当前的软件任务数据,获取开发人员当前可能的开发意图.具体即为用户当前开
                 发对应的类名#方法名#代码行上下文#注释信息,分别对应上述具体信息.将其和已有的代码段数据集中每个
                 方法段的类名#方法名#代码行上下文#注释信息进行相似度比较时,存在相似度高于阈值的代码段 readFile,并
                 且该代码段中含有优先级为 2 的推荐项 continue,则将该推荐结果重新排序,进行优先级上调.如下:
                    1. string=string+string.trim(⋅)+“stringValue”
                    2.    continue
                    重排后,推荐结果作为最终结果被推荐给用户.

                 4    方法模型评估

                 4.1   实验设计
                    本文主要实验所推荐代码行的准确率、MRR 来评估本文的编程现场上下文深度感知的代码行推荐方法是
                 否有效.为了更好地进行实例验证,我们特别设计了 4 个问题,从不同方面对方法进行评估.为了使实验更具有针
                 对性并简化实验过程,问题 1 和问题 3 的实验中没有对推荐结果进行二次排序,而在问题 2 和问题 4 的实验中
                 通过二次排序对推荐结果的顺序进行调整,着重关注二次排序对推荐结果的影响.
                    本文主要研究如下的一些问题,并在后续的章节,通过一些实验来对其进行回答.
                    •   问题 1:方法的性能是否会被代码行数据集预处理的程度所影响?
                    在之前的数据处理部分,我们详细描述了如何对收集到的项目源代码进行预处理.但是,对数据集的处理程
                 度越高,统一化程度越高,也意味着开发人员即使得到推荐结果时,为了使代码行变得真正可用,他所需要修改
                 的地方也很多.因此,我们设计问题 1 来探究数据预处理程度对方法准确率的影响,并希望能通过这个问题的研
                 究得到最好的数据集
                    •   问题 2:本文提出的方法与类似的代码推荐方法以及类似相关工作相比准确率如何?
                    已有的一些源代码相关的工作主要的关注点是代码补全、代码纠错和源码查询等.从粒度上来看,大部分
                 工作关注的是更加细粒度的 API 或 API 序列的获取和推荐.也有一部分研究聚焦于方法粒度级别的工作.为了
                 进一步验证本文方法的有效性,我们选择两个相似的代码行补全的代表性方法与本方法进行对比.
                    •   问题 3:本方法推荐的代码行准确率是否受到一些参数设置的影响?
                    在我们的方法中,要检测的参数主要是上下文代码行数 n 和推荐结果数 k.基于实用性考虑和已有的经验来
                 看,n 的可能取值为 1~5.而更加准确的取值则需要通过实验来得到.对于 k,本文设置为 1,5 和 10 分别进行测试,
   29   30   31   32   33   34   35   36   37   38   39