英语原文共 12 页,剩余内容已隐藏,支付完成后下载完整资料
摘要:word2vec是一类从大量文本中训练出来的神经网络模型,它可以在一个连续的空间中为每个单词生成一个对应的向量,在这个空间中可以观察到单词的上下文。在这项工作中,我们研究了Word2Vec向量(称为API2VEC或API嵌入)在源代码中API序列中的API元素的特征。我们的实证研究表明,API元素的API2VEC向量非常接近,反映了包含这些API元素的周围API其相似的使用上下文。此外,API2VEC还可以通过向量偏移量来捕捉API用法中API元素之间的几个相似语义关系。我们在三个应用程序中演示了API2VEC向量对API元素的有用性。首先,我们构建了一个工具,挖掘在它们之间共享相同使用关系的API元素对。其他应用程序位于代码迁移域中。我们开发了API2API工具,利用两种语言中API元素的API2VEC向量特性,自动学习Java和C#之间的API映射:在两种语言的向量空间中观察到API元素之间的语义关系,就像它们的API2VEC向量之间的几何排列一样。我们的经验评估表明,与最先进的API映射挖掘方法相比,API2API相对提高了22.6%和40.1%的前1位和前5位精度。最后,作为代码迁移中的另一个应用程序,我们能够将等效的API用法从Java迁移到C#,召回率高达90.6%,准确率高达87.2%。
关键词:Word2Vec;API嵌入;API用法;迁移
- 介绍
软件库在现代软件开发中起着重要的作用。为了访问库的功能,开发人员使用应用程序编程接口(API元素,简称API),这些接口是库的设计人员提供的类、方法和字段。API元素的特定组合用于实现编程任务,称为API用法。使用Java开发工具包(JDK)从文件中读取数据的一个示例可能涉及文件和扫描程序的API序列,以及遍历文件内容时的控制单元。API元素的组合允许复杂的API用法,但在许多情况下,开发人员编写的API用法是重复的。作为证据,研究人员已经能够从大型代码库[1]、[2]中挖掘出经常出现的API使用模式。换言之,API使用中的API元素序列是自然的,即具有高度的规律性。
现有的工作已经通过使用自然语句的统计建模探索了API使用的规律,并将其应用于API序列,在程序编辑器中建议下一个API调用,从而构建API推荐引擎。用于API调用建议的典型自然语言处理(NLP)模型包括n-gram模型[3]、[4]、深层神经网络模型[5]和基于图的生成模型[6]。
在这项工作中,我们通过研究由Word2Vec[7]创建的连续向量空间中API元素的嵌入,重点从不同的角度探索API使用序列的自然性。我们称它们为API嵌入或API2VEC。Word2Vec已被证明能够捕捉句子中词对之间关系的相似性:共享特定关系的词对具有恒定/相似向量偏移的Word2Vec向量。通过可视化的主成分分析(PCA)[8]和向量运算,研究人员观察了句法关系,如(基,比较),(基,最高级),(单数,复数),(基,过去式)等。词汇间的语义关系也可以通过向量运算[7]来获取。例如对于(国家, 首都): V (法国)-V (巴黎)asymp;V (意大利)-V (罗马),其中V表示Word2Vec,负号表示向量减法。其他类型的语义关系也被观察到:(城市,州),(著名的名字,职业),(公司,著名的产品),(团队,运动)等等[10]。如果这些观察结果适用于API元素之间的关系,我们可以利用API2VEC来支持与API使用相关的任务,例如API代码完成、使用迁移、API模式检测等。
为此,我们在大量Java和C#项目上进行了实验,以回答以下研究问题:1)在API2VEC对API元素生成的向量空间中,附近的向量是否具有相似的应用上下文(定义为API的类似周围API元素)? 2)通过向量偏移量,API2VEC是否可以揭示API元素之间类似的使用关系(定义为API使用中API元素之间的共现关系)? 我们的实验结果证实了两个API元素的向量接近程度反映了它们相似的使用上下文。我们还证实了API2VEC可以通过向量偏移量来捕获API之间的相似使用关系。
通过API2VEC向量的特性,我们在三个应用程序中演示了API2VEC向量对于API的有用性。首先,我们构建了一个工具来挖掘共享相同的使用关系的API元素对。例如,我们可以挖掘出ListIterator.hasNext和ListIterator.next之间以及StringT okenizer.hasMoreT oken和StringT okenizer.nextT oken之间共享了“在检索之前检查当前元素是否存在”的关系,尽管它们相似的功能有不同的名字。 因此,给定对StringT okenizer.hasMoreT okens,我们的工具可以使用矢量偏移量建议StringT okenizer.nextT oken。
其他应用程序属于代码迁移领域。我们构建API2API来自动学习Java和C#(即两种语言中具有相同/相似功能的API元素)之间的API映射。它基于以下两种语言中的API嵌入特性。在这两种语言中,尽管各自的API可能有不同的名称,因为如果它们用于实现相同/相似的功能,那么每个API元素在其各自的API使用中都具有相同/相似的角色,两个API元素之间的关系与另一种语言中对应的API元素之间的关系具有相同/相似的含义。例如,Java中的ListIterator.hasNext和ListIterator.next之间以及C#中相应的API IEnumerator.MoveNext和IEnumerator.current之间存在“在检索之前检查当前元素的存在”关系。一个用法可以有多个API元素(例如,上面的API用法可以包括List.iterator(),因为我们首先需要获取列表的迭代器)。但是,在一个用法中,两个Java API元素之间的关系将存在,并被解释为与C#中两个不同API之间的关系具有相同的含义。
由于Java和C#向量空间的上述向量偏移特性,在我们的实验中, 我们能够观察到Java和C#中相应API用法中的API元素在Java和C#的两个向量空间中的向量具有相似的几何排列。例如,图4显示了在Java中使用FileReader和FileWriter以及在C#中使用StreamReader和StreamWriter时,API的向量的类似排列。这是合理的,因为每个元素及其对应的API元素在相应的使用中扮演相同/相似的角色。然后,由于相似的几何排列,如果我们知道训练数据中的一些API映射对,我们就可以学习向量空间之间的转换(例如,旋转和/或缩放)。为了找到给定Java API j及其向量Vj之间的映射C# API,我们使用学习函数来计算它在C#空间中的转换向量VC。C#API c的向量与转换后的向量VC被视为j的映射API。
为了评估API2API,我们进行了一项实证研究。我们的结果表明,对于给定的Java API,在53.1%的情况下,API2API结果列表的顶部列出了正确的C# API。与最先进的方法StaMiner[11]相比,它在前1位和前5位的准确度分别有22.6%和40.1%的相对改进。为了展示第三个应用程序,我们在基于短语的机器翻译工具Phrasal[12]中使用我们得到的API映射,将JDK使用序列转换为具有多个API元素的等效.NET使用。结果表明,通过映射,我们的工具在迁移API用法时达到了较高的精度(87.2%)和召回率(90.6%)。我们的主要贡献包括:
bull;对API序列中API元素的API2VEC嵌入/向量的特性的广泛研究;
bull;API2VEC在挖掘共享相同使用关系的API元素对中的应用;
bull;API2API:一种通过向量投影挖掘API映射的方法,无需各自代码的并行库;
bull;一项实证研究,展示了API2API在挖掘API映射和将API用法从Java迁移到C#方面的准确性。
- Word2Vec的背景
Word2Vec[7]是一类经过大量文本训练的神经网络模型,它能在连续的空间中为每个唯一的单词生成一个对应的向量,在这个空间中可以观察到单词的上下文。它通过将周围单词的上下文编码成向量来表示单词。Mikolov等人[7]介绍了两种Word2Vec模型,分别称为Continuous Bag-of-Words (CBOW)模型和Skipgram模型。我们使用的CBOW模型如图1所示。
让我们总结一下CBOW模型。基本上,CBOW有一个三层的神经网络结构:输入、隐藏和输出。输入层具有在当前单词之前的n个单词的窗口和在之后的n个单词的窗口。 整个(上下文)窗口的大小为2n。输出层用于。每个单词都作为其索引向量编码到模型中。一个单词的索引向量是1times;V向量,V是单词的大小,只有该单词的索引是1,索引向量的其他位置是0。每个单词的Word2Vec向量是N维度的隐藏层的输出,该维度是向量空间的维度数。为了计算的Word2Vec向量,CBOW首先取2n个输入上下文单词的向量的平均值,并计算平均向量与隐藏输入权重矩阵(所有单词共享):
是的Word2Vec向量。2n是窗口的尺寸。为隐藏输入权重矩阵。是上下文窗口中单词的向量。训练准则是导出隐藏输入权重矩阵和隐藏输出权重权矩阵,以使Word2Vec正确分类当前
单词的所有单词。详情见[7]。
- API2VEC:API用法的API嵌入
A.API用法的API2VEC
在API的使用中,需要按特定的顺序使用API元素。因此,API经常在相似的上下文中重复使用。在相似的API元素周围,每个元素都有其特定的角色。我们的目标是通过最大程度地观察给定API使用中其周围元素的API元素的可能性,来验证Word2Vec向量是否可以捕获API的规律性。我们称之为API2VEC向量。
具体来说,在Word2Vec中,单词的规则性表现为两个关键特征。首先,已经证明,在文本的Word2Vec向量空间中,附近的向量是在相似上下文中使用过的单词的投影位置,由周围相似的单词组成[13]。因此,我们的第一个研究问题是验证API2VEC向量空间中向量的近邻性是否代表具有相似使用上下文的API元素。如果两个API在其API用法中具有相似的周围API元素集,则它们具有相似的使用上下文。具有类似上下文的API的示例是同一类中的API或具有类似用途的类(例如,StringBuffer和StringBuilder)。在使用中,它们经常被一组类似的API集合包围。
其次,在自然语言处理中,词语的规律性表现为具有特定关系的词语对之间的相似向量偏移。对于API的使用,API以特定的方式使用,它们之间存在语义依赖关系。例如,ListIterator.hasNext和ListIterator.next之间以及XMLStreamReader.isEndElement和XMLStreamReader.next之间发生关系“在检索之前检查当前元素是否存在”。API之间的这种关系称为使用关系,是API用法的一部分,经常出现在源代码中。因此,我们的第二个研究问题是验证是否可以通过向量偏移来观察API之间的相似使用关系,为API的用法建立API序列。
B.为API用法构建API序列
为了训练,我们用一个大型的代码库来构建注释序列,以表示使用中的API元素。我们根据与API相关的语法单元遍历AST来构建注释序列,包括文本、标识符、API元素(方法/构造函数调用、字段访问)、变量声明、数组访问和控制语句(while、for、if等)。对于非控制单元,我们收集数据类型、方法/字段名、返回类型和角色(文本、变量、接收者/参数)。这样的注释有望增加API元素的规则性和特性。保留类型/类/方法/字段的名称,而丢弃变量/标识符,因为不同的用法可以使用不同的名称。
表1显示了在Java中构建注释序列的关键规则。C#也使用了类似的规则(未显示)。theta;用于表示构建注释序列的函数(简称API序列)。它最初应用于一个方法,然后递归地调用代码中的语法单元,直到我们有了所有的终端注释。终端注释可以是方法调用(例如Reader.read)、字段访问,也可以是带有/不带有后缀注释的类型(例如String、FileWrite#var、HashMap#rec、String#arg)。最后的序列只包含终端序列。
1)直译:我们只保留它的类型。
2)标识符:我们将其类型与注释#var连接起来。
3)方法调用:我们保留它的完整签名,包括返回类型、它的接收者和参数的类型(不是具体的名称)。例如,对于dict.get(vocab),我们有Integer#ret、HashMap#rec、HashMap.get和String#arg。此类类型信息有助于在给定返回类型及其参数类型的情况下预测当前API调用,或在给定API调用的名称、返回类型和其他参数的情况下预测当前参数。我们保留接收方的类型,因为我们希望捕获以下关系:一个对象“调用”一个API调用,而一个调用“返回”一个具有特定类型的对象。如果方法调用是另一个调用m(n())的一个参数,那么n()的序列将在m()的序列之前创建,因为n()是首先执行的。
4)构造函数调用或字段访问:类似于方法调用。对于构造函数调用,不需要返回类型和接收方类型。
5)变量声明:我们保留它的类型和注释#var,例如FileWriter#var。我们放弃它的名称以增加它的规律性。
6)数组访问:我们保存数组的类型、元素和索引,例如list[1]→String、String[]#access和Integer#arg。
7)语句:while、for、if和其他语句的规则相似,但是也保留这些关键字。
例如,在图2中,我们生成了API序列:
HashMap#var HashMap.new
String#ret HashMap#rec
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[238968],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。