CN114489669A - 一种基于图学习的Python语言代码片段生成方法 - Google Patents

一种基于图学习的Python语言代码片段生成方法 Download PDF

Info

Publication number
CN114489669A
CN114489669A CN202210034177.8A CN202210034177A CN114489669A CN 114489669 A CN114489669 A CN 114489669A CN 202210034177 A CN202210034177 A CN 202210034177A CN 114489669 A CN114489669 A CN 114489669A
Authority
CN
China
Prior art keywords
code
neural network
node
coding
tree
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202210034177.8A
Other languages
English (en)
Inventor
许蕾
刘笑今
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN202210034177.8A priority Critical patent/CN114489669A/zh
Publication of CN114489669A publication Critical patent/CN114489669A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Machine Translation (AREA)

Abstract

本发明的主要工作是提出一种基于图学习的Python语言代码片段生成方法,主要包括代码片段语法分析模块、数据流分析模块、代码片段编码神经网络模块、自然语言编码神经网络模块以及语法导向解码模块,其中,代码片段语法分析模块用于将Python语言代码片段转换为结构化中间表示,通过词法、语法分析得到代码片段的抽象语法树;数据流分析模块用于对Python语言代码片段进行数据流依赖分析,得到代码片段实体间的数据流依赖关系,作为边加入抽象语法树结构从而构成程序图;代码片段编码神经网络模块用于将代码片段对应的程序图编码为向量中间表示,通过数值向量描述代码片段程序图的特征;自然语言编码神经网络模块用于将代码片段对应的自然语言功能描述编码为向量中间表示,通过数值向量描述自然语言的特征;语法导向解码模块用于融合自然语言与代码片段程序图两方面的中间表示,通过多层分类神经网络逐个生成代码片段语法单元,得到完整的代码片段生成结果。

Description

一种基于图学习的Python语言代码片段生成方法
技术领域
本发明属于计算机技术领域,尤其是软件技术领域。本发明提出一种基于图学习的Python语言代码片段生成方法,根据用户输入的自然语言功能描述文本,为其自动推荐具有对应功能的,符合Python语法规则的代码片段,从而提高开发效率,并可以为初学者提供帮助。
背景技术
Python语言由于其语法接近自然语言且功能强大,近年来受到各行各业的青睐。对于Python语言初学者,或者需要使用不熟悉的Python库的开发人员来说,写出可以符合需求的代码通常需要较大的搜索和学习成本。最常见的学习Python语言相关用法的方式是借助搜索引擎,搜索相关的需求问题,如“Python的open函数如何使用”,通常搜索引擎会返回一系列链接,指向对应的官方文档,或是一些技术社区的问答帖,从而得到功开发人员参考的示例代码。这些示例代码由于很多原因不能为开发人员直接使用,比如变量名不符合要求,上下文不同等等,因此通常的做法是对示例代码做一定的调整后再予以使用。以上过程在软件开发领域被称为“搜索循环”,目的是指出开发人员在搜索Python语言相关用法时的大量时间消耗。因此,能够根据用户提供的自然语言功能描述为其自动生成Python代码片段,可以降低这部分时间开销,提高开发效率,并帮助开发人员学习不熟悉的语言用法。
在Python代码片段生成领域,国内外学界的研究主要聚焦在使用自然语言处理领域的机器翻译相关的方法。ACL’19的会议论文《A Syntactic Neural Model for General-Purpose Code Generation》提出了将代码片段的抽象语法树序列化,应用自然语言处理领域的机器翻译模型“seq2seq”训练得到自然语言文本与抽象语法树节点序列间的对应关系;EMNLP’20的会议论文《Incorporate External Knowledge through Pre-training forNatural Language to Code Generation》对互联网上的技术社区(如StackOverflow等)做了Python语言相关问答帖的爬取和处理,从而构建了大规模的语料库供预训练使用,在预训练的基础上结合机器翻译模型,得到了更好的代码片段生成效果,弥补了训练数据不足的问题;AAAI’20的会议论文《TreeGen:A Tree-Based Transformer Architecture forCode Generation》提出了使用树卷积网络对Python抽象语法树进行卷积操作,从而计算抽象语法树中每个节点与其附近节点间的局部特征,提高了代码片段生成的效果。
发明内容
本发明的主要工作是提出一种基于图学习的Python语言代码片段生成方法,主要包括代码片段语法分析模块、数据流分析模块、代码片段编码神经网络模块、自然语言编码神经网络模块以及语法导向解码模块,其中,代码片段语法分析模块用于将Python语言代码片段转换为结构化中间表示,通过词法、语法分析得到代码片段的抽象语法树;数据流分析模块用于对Python语言代码片段进行数据流依赖分析,得到代码片段实体间的数据流依赖关系,作为边加入抽象语法树结构从而构成程序图;代码片段编码神经网络模块用于将代码片段对应的程序图编码为向量中间表示,通过数值向量描述代码片段程序图的特征;自然语言编码神经网络模块用于将代码片段对应的自然语言功能描述编码为向量中间表示,通过数值向量描述自然语言的特征;语法导向解码模块用于融合自然语言与代码片段程序图两方面的中间表示,通过多层分类神经网络逐个生成代码片段语法单元,得到完整的代码片段生成结果。本发明的工作和贡献说明如下:
1.训练集代码片段语法分析的方法。代码片段语法分析过程将训练集中的Python语言代码片段样本,通过AST模块的语法分析得到其抽象语法树,接着对抽象语法树做先序遍历,每遍历一层,将当前已遍历过的部分子树和当前遍历点的下一个节点提取出来,作为后续训练模型做预测任务的一条训练数据,同时保留各节点中由语法分析获取的节点类型、节点值以及对应的词法单元等信息。
2.实现了数据流分析方法,得到代码实体间的数据流动关系。数据流分析方法针对代码片段中局部变量,通过多种规则抽取变量名、方法名和语法结构间的数据流关系,从而保留更多代码片段上下文信息,具体的规则包括:赋值规则提取程序中由于赋值语句所造成的数据流动;循环抽取规则提取列表与其迭代器之间的数据流动;方法调用规则提取被调用方法与调用者之间的数据流动;元素访问规则提取容器中元素访问时的数据流动;方法参数规则提取方法参数与调用者之间的数据流动;组合规则规定以上多种规则的复合规则;传播规则规定对以上多种规则序列的处理规则;保留规则规定特殊情况下的处理规则。
3.实现了包括位置编码、自注意力机制和门控神经网络的代码片段编码神经网络。代码片段编码神经网络用于程序图输入转换为向量中间表示,其结构包括子树位置编码层、自注意力机制层、门控图神经网络层,其中:子树位置编码层通过遍历树结构的不同位置,为树中每个节点生成一个独一无二的位置向量,用以描述该节点在树中的位置;自注意力机制层通过将增加了位置编码的树结构与数据流分析得到的数据流关系结合构成程序图,并对程序图中所有节点应用自注意力算法,将节点间的关联关系融入节点的向量表示中;门控图神经网络层将经过了子树位置编码层和自注意力机制层处理后的程序图作为输入,通过节点信息传播、节点关联运算和序列化输出表示等步骤,将程序图转化为向量中间表示。
4.实现了子树位置编码方法。子树位置编码的目的是为树结构中每个节点赋予一个位置向量,从而在图神经网络学习时保留顺序信息,并保证每个位置编码具有独特性,以及不同位置编码之间可以线性转换;子树位置编码方法首先定义根节点的位置编码为全零向量,通过对树结构做层次遍历,每向下遍历一层,则向在其父节点位置向量的基础上拼接一个长度为l的零一向量,其中1的位置表示节点在当前层中的位置,如此类推,得到树中每个节点的位置编码,其本质上是从根节点到每个节点路径的一种形式化表示;同时对生成的位置编码做截断操作和标准化操作,使其输入到图神经网络后缩小训练开销,并避免梯度爆炸的问题,截断操作规定的长度上限为300。
5.实现了语法导向的解码模块。语法导向解码模块是由多层线性感知机构成的分类器,根据自然语言中间表示和程序图中间表示两方面输入,并结合束搜索算法,同时预测多个抽象语法树节点,综合考虑多个抽象语法树节点的概率,提高模型预测的综合精度;与一般的分类器不同,在对通过分类逐个生成代码片段抽象语法树中的新节点时,根据Python的语法规则规定的产生式,只会在当前最末节点可以生成的节点中进行预测,从而保证代码片段生成的结果符合Python语法规则。
附图说明
图1基于图学习的Python语言代码片段生成方法模型结构图
具体实施方式
本发明具体包括以下步骤:
1)首先对原始数据集中的代码部分进行语法分析,得到对应的抽象语法树,然后通过先序遍历语法树,并在遍历的每一步截取已遍历的部分以及下一个要遍历的节点作为模型的直接训练数据。
2)在语法分析得到的抽象语法树的基础上,应用数据流分析方法,得到节点间的数据流关系,并作记录。
3)基于代码编码模块的结构定义,实现包括子树位置编码层、自注意力层和门控图神经网络层的网络结构,用来处理直接训练数据集中截取的部分抽象语法树数据,得到其对应的中间表示。
4)使用预训练的Transformer-XL模型,对训练数据中的自然语言部分进行分词、向量化以及编码,得到其对应的中间表示。
5)实现语法导向的解码模块。将步骤3)、和步骤4)中得到的自然语言中间表示和代码中间表示拼接,得到的融合中间表示输入到由多层感知机构成的分类器中预测下一个抽象语法树节点,如此循环往复直到生成完整的代码片段。
步骤1)中训练集数据由自然语言的功能描述和对应的代码片段构成。由于训练集的规模通常较小,因此需要对数据进行扩充。首先抽取训练集中的代码片段部分,通过Python标准库的AST模块进行语法分析,得到抽象语法树,如有语法分析失败的则丢弃该样本。之后通过先序遍历的方式遍历每个抽象语法树,并在遍历的过程中截取已遍历的部分抽象语法树,以及下一个即将遍历的节点,从而构成“部分抽象语法树-自然语言功能描述-目标节点”的三元组,供深度神经网络模型学习,从而可以根据自然语言功能描述和已生成的部分抽象语法树来预测下一个语法节点。在保存生成的训练数据同时保留各节点中由语法分析获取的节点类型、节点值以及对应的词法单元等信息。
步骤2)中数据流分析方法针对代码片段中局部变量,通过多种规则抽取变量名、方法名和语法结构间的数据流关系,从而保留更多代码片段上下文信息,具体的规则包括:赋值规则针对形如“v=e”的赋值语句,提取程序中由于赋值语句所造成的数据流动;循环抽取规则针对形如“for v in e”的循环初始化语句,提取列表与其迭代器之间的数据流动;方法调用规则针对形如“u.v”的方法调用和域访问语句,提取被调用方法与调用者之间的数据流动;元素访问规则针对形如“v[e]”的容器元素访问语句,提取容器中元素访问时的数据流动;方法参数规则针对形如“f(e1,...,en)”的方法调用语句中的参数部分,提取方法参数与调用者之间的数据流动;组合规则规定以上多种规则的复合规则;传播规则规定对以上多种规则序列的处理规则;保留规则规定特殊情况下的处理规则。
步骤3)中实现了包括位置编码、自注意力机制和门控神经网络的代码片段编码神经网络。代码片段编码神经网络用于程序图输入转换为向量中间表示,其结构包括子树位置编码层、自注意力机制层、门控图神经网络层,其中:子树位置编码层通过遍历树结构的不同位置,为树中每个节点生成一个独一无二的位置向量,用以描述该节点在树中的位置;自注意力机制层通过将增加了位置编码的树结构与数据流分析得到的数据流关系结合构成程序图,并对程序图中所有节点应用自注意力算法,将节点间的关联关系融入节点的向量表示中;门控图神经网络层将经过了子树位置编码层和自注意力机制层处理后的程序图作为输入,通过节点信息传播、节点关联运算和序列化输出表示等步骤,将程序图转化为向量中间表示。
步骤4)中实现子树位置编码的目的是为树结构中每个节点赋予一个位置向量,从而在图神经网络学习时保留顺序信息,并保证每个位置编码具有独特性,以及不同位置编码之间可以线性转换;子树位置编码方法首先定义根节点的位置编码为全零向量,通过对树结构做层次遍历,每向下遍历一层,则向在其父节点位置向量的基础上拼接一个长度为l的零一向量,其中1的位置表示节点在当前层中的位置,如此类推,得到树中每个节点的位置编码,其本质上是从根节点到每个节点路径的一种形式化表示;同时对生成的位置编码做截断操作和标准化操作,使其输入到图神经网络后缩小训练开销,并避免梯度爆炸的问题,截断操作规定的长度上限为300。
步骤5)中实现语法导向解码模块是由多层线性感知机构成的分类器,根据自然语言中间表示和程序图中间表示两方面输入,并结合束搜索算法,同时预测多个抽象语法树节点,综合考虑多个抽象语法树节点的概率,提高模型预测的综合精度;与一般的分类器不同,在对通过分类逐个生成代码片段抽象语法树中的新节点时,根据Python的语法规则规定的产生式,只会在当前最末节点可以生成的节点中进行预测,从而保证代码片段生成的结果符合Python语法规则。

Claims (6)

1.一种基于图学习的Python语言代码生成方法,其特征在于,所述系统包括:代码语法分析模块、数据流分析模块、代码编码神经网络模块、自然语言编码神经网络模块以及语法导向解码模块:所述代码语法分析模块用于将Python语言代码转换为结构化中间表示,通过词法、语法分析得到代码的抽象语法树;所述数据流分析模块用于对Python语言代码进行数据流依赖分析,得到代码实体间的数据流依赖关系,作为边加入抽象语法树结构从而构成程序图;所述代码编码神经网络模块用于将代码对应的程序图通过深度神经网络编码为向量中间表示,通过数值向量描述代码程序图的特征;所述自然语言编码神经网络模块用于将代码对应的自然语言功能描述通过深度神经网络编码为向量中间表示,通过数值向量描述自然语言的特征;所述语法导向解码模块用于融合自然语言与代码程序图两方面的中间表示,通过多层分类神经网络逐个生成代码语法单元得到完整的代码生成结果。
2.如权利要求1描述的基于图学习的Python语言代码生成方法,其特征在于,代码语法分析过程,具体如下:
代码语法分析过程将训练集中的Python语言代码样本,通过ast模块的语法分析得到其抽象语法树,接着对抽象语法树做先序遍历,每遍历一层,将当前已遍历过的部分子树和当前遍历点的下一个节点提取出来,作为后续训练模型做预测任务的一条训练数据,同时保留各节点中由语法分析获取的节点类型、节点值以及对应的词法单元等信息。
3.如权利要求1描述的基于图学习的Python语言代码生成方法,其特征在于,数据流分析方法,具体如下:
数据流分析方法针对代码中局部变量,通过多种规则抽取变量名、方法名和语法结构间的数据流关系,从而保留更多代码上下文信息,其中具体的规则包括赋值规则、循环抽取规则、方法调用规则、元素访问规则、方法参数规则、组合规则、传播规则以及保留规则:赋值规则提取程序中由于赋值语句所造成的数据流动,循环抽取规则提取列表与其迭代器之间的数据流动,方法调用规则提取被调用方法与调用者之间的数据流动,元素访问规则提取容器中元素访问时的数据流动,方法参数规则提取方法参数与调用者之间的数据流动,组合规则规定以上多种规则的复合规则,传播规则规定对以上多种规则序列的处理规则,保留规则规定特殊情况下的处理规则。
4.如权利要求1描述的基于图学习的Python语言代码生成方法,其特征在于,代码编码神经网络的结构,具体如下:
代码编码神经网络用于程序图输入转换为向量中间表示,其结构包括子树位置编码层、自注意力机制层、门控图神经网络层,其中子树位置编码层通过遍历树结构的不同位置,为树中每个节点生成一个独一无二的位置向量,用以描述该节点在树中的位置;自注意力机制层通过将增加了位置编码的树结构与数据流分析得到的数据流关系结合构成程序图,并对程序图中所有节点应用自注意力算法,将节点间的关联关系融入节点的向量表示中;门控图神经网络层将经过了子树位置编码层和自注意力机制层处理后的程序图作为输入,通过节点信息传播、节点关联运算和序列化输出表示等步骤,将程序图转化为向量中间表示。
5.如权利要求4描述的基于图学习的Python语言代码生成方法,其特征在于子树位置编码的方法,具体如下:
子树位置编码的主要目的是为树结构中每个节点赋予一个位置向量,从而在图神经网络学习时保留顺序信息,并保证每个位置编码具有独特性,以及不同位置编码之间可以线性转换;
子树位置编码方法首先定义根节点的位置编码为全零向量,通过对树结构做层次遍历,每向下遍历一层,则向在其父节点位置向量的基础上拼接一个长度为1的零一向量,其中1的位置表示节点在当前层中的位置,如此类推,得到树中每个节点的位置编码,其本质上是从根节点到每个节点路径的一种形式化表示;同时对生成的位置编码做截断操作和标准化操作,使其输入到图神经网络后缩小训练开销,并避免梯度爆炸的问题,这里截断操作规定的长度上限为300。
6.如权利要求1描述的基于图学习的Python语言代码生成方法,其特征在于,语法导向解码模块,是由多层线性感知机构成的分类器,根据自然语言中间表示和程序图中间表示两方面输入,并结合束搜索算法,同时预测多个抽象语法树节点,综合考虑多个抽象语法树节点的概率,提高模型预测的综合精度;与一般的分类器不同,在对在通过分类逐个生成代码抽象语法树中的新节点时,根据Python的语法规则规定的产生式,只会在当前最末节点可以生成的节点中进行预测,从而保证代码生成的结果符合Python语法规则。
CN202210034177.8A 2022-01-12 2022-01-12 一种基于图学习的Python语言代码片段生成方法 Pending CN114489669A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210034177.8A CN114489669A (zh) 2022-01-12 2022-01-12 一种基于图学习的Python语言代码片段生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210034177.8A CN114489669A (zh) 2022-01-12 2022-01-12 一种基于图学习的Python语言代码片段生成方法

Publications (1)

Publication Number Publication Date
CN114489669A true CN114489669A (zh) 2022-05-13

Family

ID=81512273

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210034177.8A Pending CN114489669A (zh) 2022-01-12 2022-01-12 一种基于图学习的Python语言代码片段生成方法

Country Status (1)

Country Link
CN (1) CN114489669A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115221061A (zh) * 2022-07-22 2022-10-21 中国电信股份有限公司 测试代码生成方法、装置、存储介质及电子设备
CN116185373A (zh) * 2023-04-26 2023-05-30 上海金仕达软件科技股份有限公司 基于静态代码分析的微服务基础设施生成方法
CN117235108A (zh) * 2023-11-14 2023-12-15 云筑信息科技(成都)有限公司 一种基于图神经网络的nl2sql生成方法
WO2024027279A1 (zh) * 2022-07-30 2024-02-08 华为技术有限公司 代码补全方法、装置及设备
CN117573084A (zh) * 2023-08-02 2024-02-20 广东工业大学 一种基于逐层融合抽象语法树的代码补全方法

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115221061A (zh) * 2022-07-22 2022-10-21 中国电信股份有限公司 测试代码生成方法、装置、存储介质及电子设备
CN115221061B (zh) * 2022-07-22 2024-03-22 中国电信股份有限公司 测试代码生成方法、装置、存储介质及电子设备
WO2024027279A1 (zh) * 2022-07-30 2024-02-08 华为技术有限公司 代码补全方法、装置及设备
CN116185373A (zh) * 2023-04-26 2023-05-30 上海金仕达软件科技股份有限公司 基于静态代码分析的微服务基础设施生成方法
CN116185373B (zh) * 2023-04-26 2023-09-01 上海金仕达软件科技股份有限公司 基于静态代码分析的微服务基础设施生成方法
CN117573084A (zh) * 2023-08-02 2024-02-20 广东工业大学 一种基于逐层融合抽象语法树的代码补全方法
CN117573084B (zh) * 2023-08-02 2024-04-12 广东工业大学 一种基于逐层融合抽象语法树的代码补全方法
CN117235108A (zh) * 2023-11-14 2023-12-15 云筑信息科技(成都)有限公司 一种基于图神经网络的nl2sql生成方法

Similar Documents

Publication Publication Date Title
CN114489669A (zh) 一种基于图学习的Python语言代码片段生成方法
CN108388425B (zh) 一种基于lstm自动补全代码的方法
JP5128629B2 (ja) 品詞タグ付けシステム、品詞タグ付けモデルのトレーニング装置および方法
CN109492113B (zh) 一种面向软件缺陷知识的实体、关系联合抽取方法
CN111382574B (zh) 一种虚拟现实与增强现实场景下结合句法的语义解析系统
CN111680494A (zh) 相似文本的生成方法及装置
CN110059324A (zh) 基于依存信息监督的神经网络机器翻译方法及装置
CN113190219A (zh) 一种基于递归神经网络模型的代码注释生成方法
CN116661805A (zh) 代码表示的生成方法和装置、存储介质及电子设备
CN114757184B (zh) 实现航空领域知识问答的方法和系统
CN115437626A (zh) 一种基于自然语言的ocl语句自动生成方法和装置
CN113010662B (zh) 一种层次化会话式机器阅读理解系统和方法
CN113986251A (zh) 基于卷积和循环神经网络的gui原型图转代码方法
CN113536741B (zh) 中文自然语言转数据库语言的方法及装置
Ochs et al. Evaluating and improving transformers pre-trained on ASTs for Code Completion
Su et al. Investigating linguistic pattern ordering in hierarchical natural language generation
CN114757181B (zh) 基于先验知识端到端的事件抽取模型的训练、事件抽取方法及装置
CN116483314A (zh) 一种自动化智能活动图生成方法
CN115115432B (zh) 基于人工智能的产品信息推荐方法及装置
CN111199152A (zh) 一种基于标签注意力机制的命名实体识别方法
CN115906818A (zh) 语法知识预测方法、装置、电子设备和存储介质
WO2023159759A1 (zh) 模型的训练方法、情感消息生成方法和装置、设备、介质
Tiwari et al. Machine learning for translating pseudocode to python: A comprehensive review
CN114860241B (zh) 一种基于生成对抗网络的代码抽象语法树生成方法
CN111368526B (zh) 一种序列标注方法和系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination