A Toolkit for Generating Code Knowledge Graphs生成代码知识图谱的工具

事实证明,知识图谱在多种支持语义搜索和自然语言理解的应用程序方面非常有用。本文提出GraphGen4Code,一种工具集构建代码的知识图谱,支持程序搜索,代码理解,bug检测和代码自动化等。GraphGen4Code获取图中代表类、函数和方法的关键节点的代码语义,边表示function使用情况(function调用数据流)和关于函数的文档(代码文档,使用文档或StackFlow之类的论坛的讨论)。我们的工具包使用RDF中的命名图为每个程序构建模型,或者可以将图作为JSON格式输出。

Introduction

DBpedia,Wikidata,Freebase,YAGO和NELL,这是近些年已经创建的一些知识图谱。这些知识图谱在语义解析,推荐系统,信息检索,问题回复等领域起到了重要作用。

目前已经有很多针对设计代码的问题的机器学习,包括跨自然语言问题。然而,代码表示时还有两个问题,(a)它们依赖于代码的局部表示,比如语法树或源文本行。很少有研究使用基于数据和控制流的代码表示作为输入来驱动各种应用程序。(b)它们很少包括与代码关联的任何自然语言,除非是代码搜索这种具体的任务。

我们的目标是构建一个工具集,这个工具集可以构造代表真实程序的含有API调用的自然语言描述(增强代码表示)的代码表示。

我们部署了跨编程的先进程序分析技术用于构建过程间数据和控制流的语言。将这些技术大规模应用于数百万的API库很困难,因为要对单个API库进行语义建模。在本文中,我们构建了一个API上的抽象集合,允许我们将此类分析扩展到数以百万计的程序中。我们将Python作为目标,尽管我们的技术可以易于扩展到Javascript和Java,但Python作为一种动态语言面临着特别困难的挑战。为了展示GraphGen4Code的可扩展性,我们为Github上130万个Python程序(程序代表一个独立的Python脚本)构建图,每一个都被分析为独立的图。我们还使用该工具包将库调用链接到文档和论坛讨论,通过确定代码中最常用的模块,并试图将其类、方法或函数连接到相关文档或帖子。对于论坛帖子,我们使用信息检索技术将其连接到方法或者类。

总之,我们的贡献如下:

1,为代码建立知识图谱的可扩展工具集

2,一种表示代码及其自然语言的模型

3,它已经应用到130万个Python程序和4700万篇帖子,生成超过20亿的代码知识图

Modeling

把每个程序建模为单独的图,确保每次调用或读取任何数据结构(如列表,字典,对象字段)时,图中都对应一个唯一的节点,每个节点都通过一条带label的边连接到真实的方法名或函数名。两种相同函数的不同调用只有通过把它们的label互相连接。

论坛帖子也有自己的节点。帖子中描述了问题,解答,帖子中提到的任意代码(如Figure 3)。对于文档,一旦数据结构形成,一个代表着函数文档的节点将包含该函数的参数和返回值的类型(如Figure 4)。程序图中的松耦合通过label实现。在论坛中帖子中提及的特定的Python类、模块和函数和调用方式连接到标签节点完全相同,连接到类或函数的label上。相似地,文档连接到它的类或函数的label上。任意新的模块文档,新的程序图或新的帖子都可以被添加到已有的图上,抽取过程确保指向标签的链接是新的信息的连接。结果图允许直接使用它们的全名查询python类,函数的模式使用和自然语言描述。 

GraphGen4Code以RDF或JSON的形式输出。对于RDF版本,为了促进与其他本体的集成,我们重复使用相关现有属性,如Semanticscience Integrated Ontology (SIO)(语义科学集成本体(SIO)提供了一个简单、集成的上层本体(类型、关系),用于物理、过程和信息实体之间的一致知识表示)和Schema.org,然而,我们需要添加许多自己的属性和类,因为我们没有发现涵盖建模程序所需概念的单一本体。虽然我们发现这种表示法很有用,但如果当前建模为与特定应用程序的需求不兼容,我们提供了可以适应任何本体的JSON表示。

Mining Code Patterns

3.1 代码分析

虽然WALA是一个关于java、Javascript和Python的过程间数据流和控制流分析的知名的库,我们需要去扩展WALA框架使其适用于使用了许多流行的API的数以百万计的Python程序。核心问题是如何对API函数的语义建模。有两种选择:1)使用分析框架来跟踪 数据和控制流 到API函数的代码中。2)使用手动定义的模板对其进行抽象,这使得调用的语义变得明确。第一种方法对于Python来说是不可行的,因为Python代码中有很大一部分是用完全不同的语言编写的。此外,考虑到API调用背后的库中有数百万行代码,分析不可能以足够的精确度扩展。第二种方法只能用于非常少的API调用。在分析大量的具有数千个程序的程序中,此方法不成规模。

为了将分析扩展到更大规模,我们采用:

(a)假设对导入函数的任何调用都只返回一个新对象,无副作用。这确实是一个简化假设,增加分析的不精确性,但目前还没有将分析扩展到数百万个程序的方法。

(b)假设对对象字段的任意读取都由一个返回自身的导入函数创建。对象字段和对象本身肯定是不同的,但它帮助我们将分析扩展到大型API类型数量,不必捕获字段的语义,这在Python之类的动态环境中可能不可行。

(c)模型返回的新对象可能有方法调用或字段读取,对这些对象的调用或读取的处理方式与对导入API本身相似。

WALA建模框架的这个扩展目前仅适用于Python,但也可以使用类似的机制应用于其他动态编程语言,如Javascript。Java不太需要这种扩展,因为它是强类型的语言。

使用Pandas库读取csv文件,调用pandas.read_csv,图中的1所示,调用返回的对象有一个未知类型,因为Python中的大多数代码都不是类型化的。针对对象的一些过滤,是通过使用一个中间调用where填充缺失的值。如调用2所示。由2返回的对象使用train_test_split调用被分为训练和测试数据,如调用3。两个训练子集在(4)被创建,然后作为参数在6中的fit调用。在5中创建完SVC对象后,测试数据被分为X,Y组件并被用做第7步的predict调用参数。

 扩展程序,进行图展示

 控制流为绿边,直的表示调用顺序,当数据流不清晰时控制流边很有用。数据流为蓝青色。图中展示了代码中的两种主要关系:flowsTo:表示从一个节点到另一个节点的数据流,抽象出参数名或数量之类的细节。immediatelyPrecedes:代码顺序。

节点1代表read_csv的执行,图中捕获了参数,filename和low_memory选项。

节点2代表where调用,有来自节点1的immediatelyPrecedes和flowsTo边,因为它的程序顺序在1之后并且要从1中获取数据,flowsTo边有一条注释为0的hasOrdinalPosition边,表示它是where调用的接收者。

节点3代表test_train_split,程序顺序在2之后,但是数据作为参数1传递,它实际上是test_train_split的第一个参数。test_train_split的调用返回一个元组,该元组被拆分为train和test。这将在标记为4a,b的第一个框中捕获,其标签指示其接收的值。

代码中每一个train和test被分为X,Y组件,图中展示为斜体4a,4b.train节点是4a,被用作fit的调用,test节点是4b,对DataSet的读取,4b节点流向predict调用。

Extracting Documentation into the Graph

为了生成所有function和class的文档,在分析步骤处理了所有的导入语句收集一些流行的库,对这些库,使用Python内省技术(内省,有时也叫类型内省,是在运行时进行的一种对象检测机制。我们可以通过内省来获取一个对象的所有信息,比如这个对象的类型,其中包含哪些属性等等),创建一个虚拟环境,安装库,使用inspect收集文档,很明显,这一步是特定于语言的,工具包目前只支持从Python代码中抽取,然而,我们注意到支持以多种语言抽取代码文档,因此,任何对新语言的扩展在这部分都需要特定语言代码。把每个function和class抽取的文档添加到知识图谱中,我们存储它的文档字符串、基类,参数名称和类型、返回类型等.如下图所示

大量的工作都使用tokens或抽象语法树来表示代码。这些代码表示被用到特定的应用中,它们的目标通常是代码的分布式表示,其中有一些从代码中构建各种类型概率的图模型。少数工作使用数据流和控制流表示代码。比如,在Javascript程序上使用程序依赖关系图检测代码重复,但是这种依赖是在程序内部进行。相似地,增强基于AST的代码的表示以及局部数据流和控制流边以预测变量名或查找代码中变量的误用。结合基于token的代码表示和基于边的对象使用,和AST节点预测方法文档。

我们的工作优势在于,a)针对程序间的数据和控制流,在第一类函数存在且无需输入的情况下,创建更全面的代码表示形式。b)使用这种表示创建一个多目标的代码知识图谱,连接到它的文本。

GraphGen4Code依赖一个用于代码理解的库静态分析库(WALA),然后对前面提出的本体进行建模。GraphGen4Code的方法,重点是建模控制代码和数据流,然后将类和方法链接到它们的文档。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值