《Suggesting Natural Method Names to Check Name Consistencies》论文阅读总结

Suggesting Natural Method Names to Check Name Consistencies》论文阅读总结

”Stay Hungry Stay young“

@lizzy_0323

一、方法的提出

1.1 背景

方法的误导性名称在项目或者软件库的构建中常常会使开发者不能准确理解程序的功能和API的用法,因此导致API的误用。

因此本文介绍了MNIRE–一种机器学习的方法来检查给定的方法名称及其实现的一致性,它首先生成一个候选名称来与当前名称进行对比,如果这两个名称足够相似,就认为该方法是一致的,生成方法名称的这一过程中发现,方法名称的标记比例很高,可以在给定方法的三个上下文(主体,接口,封闭类的名称)中找到,即使这些标识符不存在,也可以通过上下文来预测标识符,本文的独特想法就是将名称生成视为从上述三个上下文中的程序实体名称上收集的标识符上的抽象摘要

1.2 方法的检验

通过对14M个方法的数据集上进行检验,在检测不一致方法时,MNIRE在召回率和精度、上分别提高了10.4%和11%,在方法名称的推荐上,MNIRE在召回率和精度上分别提升了18.2%和11.1%。

二、方法的介绍

2.1 方法的重要性

命名约定和编码标准是非常重要的,API的误导性名称会混淆软件开发者。研究人员引入了自动工具来验证方法的名称和本体的一致性,关键思想是:具有相似主体的方法应该具有相似的名称,但在研究中发现,由于两种本名称相似的方法被用于不同的任务,他们本体往往不相似,在信息检索(IR)方向上,工具搜索只能搜索具有相似主体的方法的名称来推荐不同的方法,但却不能提出一个新的名称。

2.2 该方法优于其他的点

code2vec方法的关键思想是:具有相似的AST结构(抽象语法树)实现的两种方法(例如for和while)可以执行相同的任务,因此可以给出相同的名称,重要的是code2vec不能为方法形成新的名称。

Allamanis等人采用神经网络模型将方法主体中的所有名称和方法名称中的标识符全部投射进同一个向量空间,他们的模型选择向量空间中最近的单词来组织生成一个新名称,程序实体的名称和方法名称本质上不同,实体的名称具有完全的含义,方法名称的单个标识符都各自具有不同的含义,所以并不应该映射在同一空间

通过一系列实验,可以发现62.9%的方法名都是唯一的,且78.1%的单词可以在可以在前面看到的方法名中找到,因此方法名称预测模型应该在方法名称的各个单词的层面使用,而不是在方法名这个主题上使用,另外,方法的主题,接口和方法的外围类中可以找到方法的名称,当遇到方法的名称的所有单词的时候,在35.9%的情况下,我们能在方法的名称中找到一个单词,尽管找不到,也可以使用上下文来预测方法名称中的单词,因为这些单词共同出现的概率很高。接口反映了输入输出,包装类反映了实现该方法的任务的一般上下文,通过这些自然性原理,证明在大量语料库上训练统计模型是合理的。

2.3 方法的简介

基于以上研究,将方法名称的生成问题作为抽象文本的摘要问题,每个单独的句子都是都是文章中的顺序表示,方法的名称被分解为一个标记序列,该标记作为输入句子的摘要生成,该方法可以创建一个抽象的摘要。

模型的结构上,本文的模型选择了Encoder-Decoder模型,该模型通过对输入统计地进行编码,来总结出句子的含义,这个模型被用来捕捉句子使用的语境,并且用不同的单词在一个简短的序列中重新表述他们,这就是预测的方法名

三、用例

3.1 方法名不一致

针对方法不一致问题,提出了两种典型场景:

1.当一个方法被给予一个混淆的名称时,不一致问题发生;

2.方法名称和方法功能之间的不一致问题发生在软件的不断更新中。

3.2 根据方法来生成一个较好的名称

根据方法可以派生出一个较为准确的名称,这个名称可以用来检测当前的名称是否是一致,也可以在名称的命名阶段提供一个较好的名称,生成一个好名称,往往依赖于以下因素:

1.抽象方法的目的的方法名称和用于实现该方法的程序实体的名称和方法功能的描述有关。这种关系来源于两个层面,第一个是方法的名称和主体中的变量、字段以及方法的调用与方法的功能有一定的联系。第二个层面是良好的方法的名称的单词和主题中程序实体的单词常常同时出现(前文已经提到)。

2.参数的类型,方法的返回值也是方法声明的一部分,他们描述了方法的输入和输出,并对于其他调用该方法的使用产生了巨大影响

3.在面向对象编程中,方法m定义了属于C类的对象的一种表现,C类的对象o在执行m时,可以被认为是描述这个行动的主体,因此类名也拥有推断方法名称的作用

四、实例研究

4.1方法的唯一性和大小特点

在数据集中,有3402,550个唯一的方法名称和120,303个方法名称中的唯一单词,平均每个方法名称有2.64个单词,中位数有3个单词,最长的方法名称为83个标识符,同时,方法主体中的标识符数量是方法名称的17.3倍,大多数方法名称比主体短的多。
大多数方法名其实是惟一的,不唯一的情况是因为出现了大量的公共名称。相反的,组成方法名称的标识符往往由以前看到的单词组成。

4.2 方法名称和上下文的联系
  1. 方法名称和上下文共享的通用标识符:在三个上下文中,平均有两个可以找到方法名称的3个标记中的大约2个,而方法名称大概率在正文中找到(62.%)接下来是接口(14.9%),外围类(6.1%)

  2. 方法名称和上下文共享单词的普遍性:

    84.6%的方法具有33.3%的单词可以在上下文之间找到的方法名称,79.8%的方法中的标识符至少有一半能被找到,36.7%的方法由全部在上下文之中的标识符组成,因此,名称与实体名称相同的方法所占百分比很高。

    3.方法中的标识符出现在上下文之中的条件:

​ 对于一种方法,将发生的条件计算为条件概率,计算公式为:

在这里插入图片描述
分子为含有t的方法的数目,分母是上下文和C一致的方法数目,这个概率越高,上下文预测单词t的能力就越强

五、模型的特点

5.1模型关键理念
1.标识符名称的自然性
2.摘要总结
5.2 文本提取

首先提取实现、接口、封闭类的文本, 分别记为IMP,INF,ENC文本,然后将所有上下文句子链接起来,形成三个上下文的顺序表示,他们被"."分割,INF中,输入和输出被“,”分割,对于IMP和INF,标识符的名字和类型被按照代码中原本的顺序排列,随机顺序的实验发现名称/类型的顺序并不影响结果。

5.3抽象概括模型

MNIRE中使用了基于Seq2Seq的体系结构,该模型基于注意力机制,模型结构如下在这里插入图片描述

在这个模型中,编码器的输入为嵌入的向量x=(x1,x2,…,x m)的文本句子,并将句子编码为隐藏表示h=(h1,h2,…,hm),解码器负责通过基于h向量的y = (y1,y2, …,yk )预测方法名称的概率,每个y的概率是基于循环神经网络(RNN)的解码向量s,前一阶段预测的y,以及上下文向量c,计算公式如下:
在这里插入图片描述
c向量称之为注意力向量,它是基于s和隐藏层h计算的,计算公式如下:,在这里插入图片描述

其中,在这里插入图片描述
是起一个注意力功能,它用于计算未归一化的解码器和编码器对齐分数,总的来说,上下文向量c帮助解码器决定了哪些句子的哪些部分要集中在哪些步骤上生成y。

5.4 方法名称一致性检查

为了检查一致性,我们计算了p和c之间的相似性Sim(p,c),p来自于MNIRE,c为当前阶段的方法名称,这个相似性的值在0到1区间,定义为p和c之间共享的单词的部分,计算公式如下:
在这里插入图片描述
方法m的一致性是用一个不同的阈值T来决定的,如果这个值小于T,MNIRE就可以把c分类为不一致,否则分类为一致的方法实现。

六、 评估设置,程序和度量

比较研究:对于MCC和MNR的每一个应用,用各自的训练数据集训练了正在研究的每个模型,然后用相应的测试数据集对其进行了测试。
背景分析:对于每个应用程序,为了研究不同上下文的影响,我们创建了具有不同上下文组合的MNIRE的不同变体,并测量了性能。
灵敏度分析:对于每个应用程序,研究了以下因素的影响:表示、相似阈值、上下文和数据大小。 改变它们并测量性能
计量:对于MCC,将预测的案例与作为MCC语料库一部分提供的一致和不一致的方法名称进行了比较,。对于MNR,我们将预测的名称与MNRoracle中的好方法名称进行了比较,该方法是在code2vec中构建的,为了测量MCC的表现, 使用精确率,召回率,f-score和准确率四种性能度量,对于不一致的方法而言:
准确度的计算公式为:在这里插入图片描述
召回率为:
在这里插入图片描述
对于一致的方法:
准确度:
在这里插入图片描述
召回率:在这里插入图片描述
F-score:
在这里插入图片描述
精确度:
在这里插入图片描述

关于这几个性能度量的具体解析可以去查阅相关资料和博客

对于原名e和预测之后的名字r
准确率的计算公式为:
在这里插入图片描述
召回率的计算公式为;
在这里插入图片描述
token(n)代表中语句n中的单词数目

七、 经验结果

7.1准确度比较

1.在方法名检查(MCC)上的准确度:
对于不一致的方法名:
MNIRE的召回率提高了10.4%,精确度提高了10.8%
MNIRE使用程序实体的名称,,这个方法的原则是,方法的实现和他们在本体中实现类似的方法时的名字应该类似,反之亦然。
对于一致的方法名:MNIRE探测到比原方法名更一致的方法名,提高了16.6%的召回率,提高了9%的准确度
2.在推荐方法名(MNR)上的准确度:MNIRE方法比code2vec提高了18。2%的召回率,和11.1%的准确度,基于更高的召回率,MNIRE可以有更多的单词被正确预测,基于更高的准确度,预测出的单词是正确的单词的比率更高,原因是因为MNIRE采用了更丰富的文本,例如封闭类的文本,它的名称和方法名称具有很强的相关性。
3.生成新方法名层面的准确度:探究MNIRE在推荐的方法名称上的表现,这些方法名称并不在训练数据中,仍然可以很好的预测未知的方法名称,这表明它学习推荐的方法名称而不是检索在语料库中训练的内容
4.在测试集方法大小上的准确度:MNIRE在具有规则尺寸的方法上很有效果,但随着方法的长度增加,有所下降。

7.2 文本分析结果

使用接口和实现的文本辅助之后,准确度在两者均有提升,对于MNR问题,精确度和召回显著提升,对于MCC问题,也有些许提高。
与IMP和INF相比,IMP+ENC的改善程度低于IMP,原因是INF与方法名称的有更多共同的标识符,并且INF和ENC中的单词数量比IMP小得多,因此对IMP的改进较小

7.3 敏感度分析结果

1.在使用seq2seq模型之前解析代码并构建不同的表示:

  1. lexeme:所有单词都被收集
  2. AST:seq2seq模型的输入时AST中令牌的序列,使用分隔符对树结构进行编码
  3. Graph:方法主体被构建为PDG,,使用grapg2vec工具将转化为向量,输入seq2seq
    如果两种方法具有相同的AST。他们可能不一定有相同的词汇标记,因此Lexeme模型有更严格的相似条件,因此精度较高,召回率较低,然而,Graph模型比Tree模型的相似性条件更低,Tree模型的F-score高于Graph模型
    2.上下文长度对准确度的影响;
    上下文越长,MNIRE模型效果越好
    3.上下文中每个单词的长度对于准确度的影响:
    有意义的单词越多,准确度越高
    4.数据集的大小对准确度的影响:
    数据集的大小增加,准确度增加
7.4 时间复杂度

MCC问题上:MNIRE训练时长远低于code2vec,这是由于MNIRE不需要构建抽象语法树节点 ,因此MNIRE效率更高

八、结论

本文介绍了一种机器学习方法-MNIRE,用于预测方法名称和检测方法名称一不一致,得出的结论是:为了预测一个好名字,需要依靠文本中程序实体的自然性,比AST或PDG结构要好,其次,方法名各自是相当独特的,但各个标识符却经常出现,因此,MNIRE利用程序实体中标识符的规律性来生成预测的方法名称,最后,生成的方法在预测新名称方面比基于IR的语料库搜索方法更有效

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值