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

2023-11-01

事实证明,知识图谱在多种支持语义搜索和自然语言理解的应用程序方面非常有用。本文提出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的方法,重点是建模控制代码和数据流,然后将类和方法链接到它们的文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • Qt 之 QVideoFrame转换为QImage

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 方法一 最简单 方法二 依赖opencv 方法三 qt5 15版本 前言 在qt框架下 实现相机预览的几种方式在qt相机预览已经描述过了 在该文章的几种方式中
  • 二叉搜索树(数组实现)

    内容 建立二叉搜索树 bool buildtree int k tree k value a index int cur 0 if index a size return true while 1 if a index lt tree cu
  • 正整数序列的数

    正整数序列的数 正整数序列的数量 问题描述 小明想知道 满足以下条件的正整数序列的数量 1 第一项为 n 2 第二项不超过 n 3 从第三项开始 每一项小于前两项的差的绝对值 请计算 对于给定的 n 有多少种满足条件的序列 输入格式 输入一
  • Qt使用gSoap实现webservice服务端和客户端

    文章目录 gSoap工具介绍 1 下载 2 Hello world 开始使用SOAP api 2 1 新建文件夹 2 2 新建服务接口头文件 hello h 2 3 使用 soapcpp2 exe 2 4 拷贝源代码库文件 2 5 Qt 服
  • 第二次作业:微信案例分析

    2 1 介绍产品相关信息 你选择的产品是 微信 为什么选择该产品作为分析 微信是一款全方位的手机通讯应用 帮助我们轻松连接全球好友 微信可以通过SMS MMS网络发送短信 进行视频聊天 与好友一起玩游戏 以及分享自己的生活到朋友圈 让我们感
  • Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集(不断更新中)

    本文主要是把平时使用的模型及其参数进行推荐和整理 相关 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题 Windows使用Stable Diffusion时遇到的各种问题整
  • Stack,ArrayDeque,LinkedList的区别

    这段时间把疯狂JAVA再看了一遍 发现Stack ArrayDeque LinkedList都可以作为栈使用 所以就稍微从性能以及实现的细节对比这三者的区别 类继承树 由继承树看出 三者都是Collection的间接实现类 ArrayDeq
  • js中数组删除对象的几种方式总结

    1 关键字删除 2 splice删除 3 特殊位置删除 一 关键字删除 关键字删除是通过js提供的关键字 delete手动删除数组的某一项 使用delete删除掉数组中的元素后 会把该下标出的值置为undefined 数组的长度不会变 ar
  • 一个案例说明高层属性形式化验证

    1 验证软件功能介绍 Beosin VaaS的业务逻辑验证软件 是一款用来检测智能合约上层业务逻辑漏洞的软件 基于合约的白皮书 软件利用形式化方法 首先对单个函数进行属性的描述 在对单个函数进行属性的验证并通过后 基于这些已验证属性 抽取出
  • 号传到服务器为空,URL 传+号到后台变空格问题解决方案

    今天在调试客户端向服务器传递参数时 参数中的 全部变成了空格 原因是URL中默认的将 号转义了 解决方法如下 方法一 修改客户端 将客户端带 的参数中的 全部替换为 2B 这样参数传到服务器端时就能得到 了 方法二 修改服务器端 将空格替换
  • 第六天作业

    include
  • VC++操作SQLserver动态库【含源码】,及动态库使用教程。

    VC 操作SQLserver动态库 含源码 动态库使用Demo程序演示 include
  • Unity Window触摸屏电脑和移动端Input触控,控制相机旋转缩放

    Unity Window触摸屏电脑和移动端Input触控 控制相机旋转缩放 原理就是获取手指滑动的偏移量 来计算 代码帖出来 using UnityEngine using System using System Collections p
  • Codeforces 670C Cinema

    题目链接 https codeforces com problemset problem 670 C include
  • numpy.array多维数组的切片操作总结

    numpy array多维数组的切片操作总结 一 常规介绍 1 一维数组切片 2 二维数组的切片 3 维数超过 3 的多维数组 可通过 来简化操作 4 numpy中对切片元素的操作会影响原数组本身 5 array和list的对比 6 boo
  • 100天精通Python(数据分析篇)——第61天:Pandas.to_datetime函数基础+代码实战(处理时间)

    文章目录 一 to datetime参数说明 代码实战 1 arg 2 errors 3 dayfirst 4 yearfirst 5 utc 6 format 7 exact 8 unit 9 infer datetime format
  • qt designer文本输入框_Qt为输入框提供提示信息

    当我们在使用一个陌生的软件时常常会感觉不知所措 因此在写软件的时候都要考虑增加一些信息来帮助使用者 比如说提供文字标签来告诉使用者某一块区域的作用是什么 又或者干脆用一块区域滚动显示一些提示 但这里要说的是一种很常见又有用的提示方式 在输入
  • 股指期货首次和二次开户条件

    不少投资者都问到 股指期货开户可以网上开通吗 还是要去柜台办理 由于股指期货具有双向交易以及T 0的特点 在大盘下跌的时候也可以对冲或者赚取盈利 深受投资者关注 今天期货开户网为您详细讲解自然人申请开通股指期货的详细流程 需提供的材料 准入
  • 网络编程(32)—— linux中销毁僵尸进程的四种方法

    一 wait函数 函数原型 pid t wait int status 描述 wait可以回收任意一个僵尸进程 只要系统中存在僵尸进程 调用一次wait 就会回收一个僵尸进程 参数说明 status 当子进程结束之后 其进入僵尸进程状态 其
  • A Toolkit for Generating Code Knowledge Graphs生成代码知识图谱的工具

    事实证明 知识图谱在多种支持语义搜索和自然语言理解的应用程序方面非常有用 本文提出GraphGen4Code 一种工具集构建代码的知识图谱 支持程序搜索 代码理解 bug检测和代码自动化等 GraphGen4Code获取图中代表类 函数和方