首页> 中国专利> 一种将自然语言转化为程序代码的方法及系统

一种将自然语言转化为程序代码的方法及系统

摘要

本发明提出了一种将自然语言转化为程序代码的方法及系统,涉及深度学习领域。一种将自然语言转化为程序代码的方法包括:对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息;根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树;在预构资源库中为源语言检索出可能匹配的若干个资源;对检索到的中间表示作出可能的转换变为相互关联的模板。其创新性地视自然语言转化为程序代码的过程为机器学习与信息检索的不确定性问题。此外本发明还提出一种将自然语言转化为程序代码系统,包括:预处理模块、分析模块、检索模块、转换模块、连接模块以及转化模块。

著录项

  • 公开/公告号CN112306497A

    专利类型发明专利

  • 公开/公告日2021-02-02

    原文格式PDF

  • 申请/专利权人 高炼;

    申请/专利号CN202011212608.2

  • 发明设计人 高炼;

    申请日2020-11-03

  • 分类号G06F8/41(20180101);G06N3/08(20060101);

  • 代理机构51308 成都鱼爪智云知识产权代理有限公司;

  • 代理人王珍

  • 地址 431700 湖北省天门市竟陵街道阳渡小区春风河巷46号

  • 入库时间 2023-06-19 09:46:20

说明书

技术领域

本发明涉及深度学习领域,具体而言,涉及一种将自然语言转化为程序代码的方法及系统。

背景技术

计算机语言在计算机领域内应用范围广泛,但是,随着计算机语言的高速发展,其种类越来越多,并且计算机语言的复杂度也较高,掌握并达到精通的程度比较困难。

在越来越多的计算机应用中要求相关产品的产出既要高效又要周期短。对这些应用的实现,要求应用设计者和实施者具有较高的计算机语言水平。而在现实环境中这往往意味着需要付出更多的成本用于编码和设计培训的投入,并且导致规模性的实施相对困难。

计算机语言的使用风格与自然语言差别巨大,计算机语言表述信息比自然语言更加精确,但是复杂度也相对更高。对计算机语言从掌握到精通往往需要较高的成本投入,并且实现周期过长。

发明内容

本发明的目的在于提供一种将自然语言转化为程序代码的方法,其能够创新性地视自然语言转化为程序代码的过程为机器学习与信息检索的不确定性问题,定义了这一问题中的评价标准,以使得其能够采用其他问题中常见的衡量指标进行评估。

本发明的另一目的在于提供一种将自然语言转化为程序代码系统,其能够运行一种将自然语言转化为程序代码的方法。

本发明的实施例是这样实现的:

第一方面,本申请实施例提供一种将自然语言转化为程序代码的方法,其包括对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息;根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树;在预构资源库中为源语言检索出可能匹配的若干个资源;对检索到的中间表示作出可能的转换变为相互关联的模板;将正确的一套模板的空槽填入对应的代码块与变量,得到当前句子对应的一套相关联的代码块,并与其他句子的代码块以同样方式连接,形成目标代码的整体的图状数据结构;将图状数据结构转化为最终的目标代码。

在本发明的一些实施例中,在上述对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息之后包括:将源语言进行分割后,依次处理每个单元,并将源语言处理成适合深度学习模型处理的标准形式。

在本发明的一些实施例中,上述根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树包括:使用训练好的深度学习模型处理源语言,根据源语言语法上的构成关系将其分解并组织成更易于处理的树状结构,并提取句子、子句、词组、单词的语义特征向量。

在本发明的一些实施例中,上述在预构资源库中为源语言检索出可能匹配的若干个资源包括:迭代处理语法树,并在预构资源库中检索可能与当前树节点对应的源语言成分匹配的源语言模式;源语言模式被映射成代码模板或变量模板与目标语言有关的表示。

在本发明的一些实施例中,上述还包括源语言模式被映射成一阶谓词逻辑表示、lambda表达式表示或程序代码数据结构的表示独立于源语言与目标语言的中间表示。

在本发明的一些实施例中,上述对检索到的中间表示作出可能的转换变为相互关联的模板包括:对检索到的中间表示作出可能的转换变为相互关联的模板,模板中选择能够相互关联并且能够覆盖原源语言的一组可能性。

在本发明的一些实施例中,上述还包括判断是否有多种可能性;若是,则由用户交互式选择正确的一套模板;若不是,则提示用户修改输入或者重新输入。

在本发明的一些实施例中,在上述若是,则由用户交互式选择正确的一套模板之后还包括:将该资源组合对应的变量和代码块进行关联,并与之前输入的其他源语言的变量和代码块相关联,组织成程序代码整体的逻辑拓扑图;根据拓扑图生成程序代码,并对生成的程序代码进行优化、整理代码文件。

第二方面,本申请实施例提供一种将自然语言转化为程序代码系统,其包括预处理模块,用于对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息;分析模块,用于根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树;检索模块,用于在预构资源库中为源语言检索出可能匹配的若干个资源;转换模块,用于对检索到的中间表示作出可能的转换变为相互关联的模板;连接模块,用于将正确的一套模板的空槽填入对应的代码块与变量,得到当前句子对应的一套相关联的代码块,并与其他句子的代码块以同样方式连接,形成目标代码的整体的图状数据结构;转化模块,用于将图状数据结构转化为最终的目标代码。

在本发明的一些实施例中,上述包括用于存储计算机指令的至少一个存储器;与上述存储器通讯的至少一个处理器,其中当上述至少一个处理器执行上述计算机指令时,上述至少一个处理器使上述系统执行:预处理模块、分析模块、检索模块、转换模块、连接模块以及转化模块。

相对于现有技术,本发明的实施例至少具有如下优点或有益效果:

通过计算机对自然语言,例如:中文、英文,简称“源语言”,进行自动处理和分析,将其转化为高级程序设计语言,例如:C++、Python、Java,称为“目标语言”的目标代码,其能够创新性地视自然语言转化为程序代码的过程为机器学习与信息检索的不确定性问题,定义了这一问题中的评价标准,以使得其能够采用其他问题中常见的衡量指标进行评估。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本发明实施例提供的一种将自然语言转化为程序代码的方法步骤示意图;

图2为本发明实施例提供的一种将自然语言转化为程序代码的方法详细步骤示意图;

图3为本发明实施例提供的一种将自然语言转化为程序代码系统模块示意图。

图标:10-预处理模块;20-分析模块;30-检索模块;40-转换模块;50-连接模块;60-转化模块。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

需要说明的是,术语“包括”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

下面结合附图,对本申请的一些实施方式作详细说明。在不冲突的情况下,下述的各个实施例及实施例中的各个特征可以相互组合。

实施例1

请参阅图1,图1为本发明实施例提供的一种将自然语言转化为程序代码的方法步骤示意图,其如下所示:

步骤S100,对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息;

在一些实施方式中,利用规则来依次处理源语言句子中的每个“单元”(单词、词组或标点符号),并解析出有特殊含义或者需要特殊处理的“单元”中的信息。通过这种方式,一方面用户可以用直接、可靠的方式来向编译程序传递与目标代码有关的”关键信息“,例如可以声明字面值“1.25”或标识符“A”;另一方面,编译程序可以通过对句子中与自然语义无关的“单元”进行替换,来使输入后续步骤的句子变得标准化,避免影响深度学习模型的解析成功率、准确率,例如同为标识符“A”和“Airplane”都将被替换为“SYMBOL”或者“x”。

一种预处理的简化的实施方法:

I.将句子按照空格分割成单元(单词)。

II.依次处理每个单词:

1、根据当前单词开头的若干字符来判断其是否含有特定的“关键信息”,并调用不同的解析子程序来解析出“关键信息”。例如:

1.1、若单词以“-”或者数字开头且包含“.”,如“1.25”,调用浮点数处理子程序得到浮点数1.25,并对应这个的单词上。

1.2若单词以大写字母开头,如“N”,调用标识符处理子程序,得到标识符“N”,并对应在这个的单词上。

1.3、如果没有识别出“关键信息”,则跳过这个单词。默认情况下,单词是没有特殊含义的。

2、将解析出“关键信息”的单词替换为对应的符号。

3、识别出非标准表达,并转化为标准的形式。

“关键信息”:有些单元在程序代码中有特殊的含义、在编译成目标代码的流程中起到关键的作用,称为关键信息。例如:

基于规则“以大写字母开头的单词都是用来标记一个程序代码对象的标识符”,可以从句子#1(“there is a airplane named A“)中识别出标识符“A”。基于规则“能和正则表达式相匹配的字符串都是浮点数字面值”,可以从句子#3(”the speed of the airplaneis N times of 1.25km/h“)中识别出浮点数字面值“1.25”。基于规则“包含?的句子都是输出语句,会通过输出给用户以反馈”,可以在后续的匹配步骤中将句子#6与“输出语句”这一语句类型对应起来。注意:本文中的“标识符”即编程语言中的标识符。

“输入标准化”。通过转换与替换,标准化处理后的句子将更适宜作为深度学习自然语言处理模型的输入,这是因为:自然语言处理模型无法处理不在预定义词汇表中的(非标准的)表达,这里可以预先检测并将其转换为标准形式;若模型无法处理“km/h”,则将“km/h”转换为“kilometres per hour”若模型无法处理“it's”,则将“it‘s”转换为“it is”若模型无法处理“...”,则将“...”转换为“etc.”

解析出来的“关键信息”与目标程序有关,但可能与自然语言句子本身的语义并没有关系,通过将同一类别的“关键信息”替换为相同值,可以避免其对自然语言处理模型的结果产生影响。例如:

将“1.25”或“-0.33”都替换为“NUMBER”或者“1”。标识符“A”和“Airplane”都将被替换为“SYMBOL”或者“x”。针对不同的源语言,这一步骤中可需要做对应的“语言处理”,例如:针对中文可能需要进行“分词”,针对多语言可能需要解析非主语言的“单元”并转化为主语言的“单元”。

步骤S110,根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树;

具体的,根据深度学习模型提取源语言的特征向量,可以通过语法/语义分析得到解析树/图。

在一些实施方式中,这一步骤中使用预先训练好的深度学习模型(以下简称“模型”)处理源语言句子,并根据源语言句子语法上的构成关系将其分解并组织成更易于处理的树状结构,同时提取出句子、子句、词组、单词的语义特征向量用于后续的检索过程。

“特征向量”:经过训练的深度学习模型可以提取句子、子句、词组、单词的语义特征向量,例如提取句子的特征向量时,使用某一特征空间(例如:L2空间、Cosine空间)中特定长度的向量来表示输入的句子。这种向量表示具有以下特征:若两个句子的意思越接近,则用来表示它们的两个向量之间的距离越近/相似度越高,反之则距离越远/相似度越低。例如:

“number N is set to 2”和“we assign 2to N”是意思接近的两个句子,经过训练,模型将两个句子分别表示为L2空间下的向量(0.5,1.1,1.4)和(0.6,1.0,1.5),这两个向量距离很近。

“number N is set to 2”和“we increase N by 2”是意思很不一样的两个句子,经过训练,模型将两个句子分别表示为L2空间下的向量(0.5,1.1,1.4)和(1.8,0.2,0.6),这两个向量的距离相对上面的例子更远一些。

与句子的特征向量类似,同义词/近义词的特征向量距离较近,无关词的特征向量距离较远。

依存文法解析的意义在于:使句子具备局部性。将句子分解成更小的单元(单词),这些单元之间通过预先定义的标准的依赖关系进行关联,因此局部的变化对于句子内没有关联的其他部分没有任何影响,例如上面两个解析结果中“,we reset it.”部分是完全相同的。这种局部性使得抽象出某些共有的“句子模式”成为可能,由于现代程序设计语言均遵循结构化的范式,后文将显示,经过“依存文法解析”的句子能很好地映射到程序代码结构。“依存句法分析dependency parse”和“成分句法分析constituency parse”是两个不同的任务,但是它们结果是能够相互转换的,为了最大化“局部性”优先选择依存句法分析。

提取了句子的语义标签。经过这一分析过程,每个单词都被标记了相应的“语义角色标签”,例如:“we reset it”中“we”被标记为“PRP”(人称代词)而“reset”被标记为“VBD”(及物动词);同时,每个句子单元间的关联关系都被标记了相应的“依赖关系标签”,例如:“if N became positive”子句是“we reset it”主句的条件状语从句,因此从中心词“reset”到中心词“became”间有一条标记为“advcl:if”的边。这些语义标签在后续步骤中可以被用来检索、匹配句子的局部模式(模板)。

源语言句子特征向量提取、依存句法解析都是深度学习自然语言处理领域中常见的任务,可以基于目前学术界流行的BERT、XLNet等模型采用标注后的语料数据训练得到本步骤所需要的模型,也可以采用封装了这些功能的现有的程序库,例如:SpaCy Python库、Standford CoreNLP库。

步骤S120,在预构资源库中为源语言检索出可能匹配的若干个资源;

在一些实施方式中,需要构建大规模资源库:

编译过程所面临的重要挑战是:一方面,自然语言具有丰富的表达形式;另一方面,程序代码具有不同的实现方式。为了方便灵活地应对这种多样性,需要针对源语言建立包含各种“句子模式”的“语言库”以匹配自然语言不同的表达形式,并针对目标语言建立包含各种“模板”的“模板库”来处理目标代码的各种实现方式,这里将这些库统称为“资源库”,库中的成员称为“资源”。这些“资源”是“源语言”到“目标代码”的转换过程中最基础的组件,相当于构建房屋的砖瓦,“语言库”、“模板库”则相当于用来采购砖瓦的砖店、瓦店。

“语言库”将其包含的丰富的“句子模式”组织起来,以使其便于被检索到,检索的具体细节见下一章。通过在线或者离线的方式向”资源库“中添加新的“资源”或新建“资源”分组,可以方便、灵活地进行拓展,以使编译过程能支持新的编程语言、编程语言类库、自然语言、自然语言语法等等。“句子模式”和“模板”存在多对多的映射关系,这意味着一段目标代码存在多种源语言表达,同时一种源语言表达有多种可能涵义、或者在目标代码中有多种实现方式。

句子模式:句子中特定局部模式的抽象,因为其具有抽象性、通用性因而能和很多可能的“句子成分”相匹配。在实践中,可以在上述“依存句法树”的特定子结构的基础上抽象出来。下面的例子展示了可以和两个“句子成分”匹配的“句子模式”,这个“句子模式”可以匹配这两个“依存句法树”中的子结构。

模板:模板是一个转换单元,将“句子模式”转化为程序代码单元。根据其所转化成的程序代码单元种类的不同,“模板”又分为“代码模板”和“类型模板”。下面分别介绍这些概念:

“代码模板”:是将特定的“句子模式”转换为对应的目标代码片段(称为“代码块”)的最小不可分单元,其包含一个在特定位置留有待填充“空槽”的“代码块”,这种代码块称为“代码块原型”。“代码块原型”表示程序中的执行逻辑,其将会对填充其中的“变量”进行一些“处理”。

空槽:“代码块原型”中留有待填充的空槽,需要往这些空槽中填入“数值”或者另一个“代码块”,分别称为“数值空槽”和“代码块空槽”。当“代码模板”对应的“句子模式”成功匹配“句子成分”之后,编译程序会将当前句子或者之前其他句子中的“数值”和“代码块”填入“代码块原型”对应的空槽中,得到完整的代码块。

代码块:指一行或者多行程序代码。操作块:是一种特殊的“代码块”,表示被当作一个“数值”嵌入到其他代码块的“数值空槽”中的代码,但它不能单独构成目标代码中的一个代码行。处理:“代码块”对“数值空槽”中的标识符的“处理”是读取、新建、修改、删除中的一种。数值类型:编程语言使用类型来标记变量值在内存中的存储形式(后文简称为“数据类型”),这里的“数值类型”和编程语言中的类型、变量类型、类型系统中的概念一致。

现有编程语言中,以python为例,包括基本数据类型,如:int、float、bool、str;以及由基本的数据类型组成的复杂数据类型,例如:list、dict、tuple以及object。复杂数据类型不仅可以表示编程语言中的类,也可以通过接受可变类型参数来表示一些编程语言(如C++)中的模板类。例如:list(type_e)表明list类型接受一个类型参数type_x,表明list(type_e)类型是元素类型均为type_e的列表类型(与Python中的允许元素类型不同的list不太一样),同理还可以有字典类型dict(type_k,type_v)、自定义模板类型class_t(type_1,type_2,...)。

语义类型:与编程语言中只关注表示形式的类型系统略有不同的是,这里在此基础上再使用一种“语义类型”系统来着重考虑变量的语义上的特点。语义类型是在数据类型基础上考虑问题域中实体的语义属性来界定的类别,并进一步对数据类型进一步加以限制的产物。现在,在实际使用中,使用者需要挑选合适的数据类型来表示表示其具体的语义概念,举例来说:为了表示汽车行驶的速度,可能会使用float数据类型,但是这一类型的含义可能是“m/s”或者“km/h”,如果不加区分可能会在后续使用中带来潜在的出错风险,所以同样基于“float”这一数据类型需要有“m/s”和“km/h”两种语义类型。

为了表示IPv4地址“192.168.0.1”与端口号“80”的组合,使用者可以选择用str数据类型“192.168.0.1:80”,或是tuple类型(“192.168.0.1”,“80”),抑或是第二项为int类型的tuple类型(“192.168.0.1”,80),甚至自定义IPAddress类。所以说,同一语义类型可能对应了不同的基本数据类型。

实体知识图谱:采用大规模“知识图谱”(或称语义网络)来组织不同的实体类型、实体实例之间的关系。“知识图谱”的概念中包括“模式层”和“数据层”,作以下解释:

“模式层”用来记录客观世界中不变的知识,包括实体可能具有的属性或者关系,在我们这里用来保存语义类型之间的关系,相当于高级编程语言中的类型系统。例如:语义类型“UNIX文件路径”(字符串数值类型)具有属性“路径类型”(枚举数值类型,可以是“目录”或“文件”),并且两个“UNIX文件路径”之间可以有父路径/子路径这样的单向关系,或者“等价路径”这样的双向关系。

“数据层”用来存储具体的信息,在我们这里用来保存变量之间固化的语义联系,相当于高级编程语言中的“符号表”。例如:如果“数据层”中存储着之前句子中蕴含的信息:“Person对象小王的身高是90cm,Person对象老王是Person对象小王的父亲。”,对于当前输入句子“小张的身高是老王的儿子的身高的两倍”,通过数据层检索得到“老王的儿子的身高”是变量xiaowang_h或者常量90。

类型模板:将“句子模式”转化为“语义类型”或者“数值类型”。类型模板库:类型模板库是包含了所有“语义类型”和“数据类型”的集合,将他们关联起来以便于类型间的相互转换。语义类型系统构建于数据类型系统之上,是一个图状的数据结构,图中的每个节点代表一个语义类型,有些语义类型节点可以“语义转换”为其他的语义类型节点,这样的节点间以单向边连接。同时,每个节点对应了若干个数据类型,表示这一语义类型可以由这些数据类型来表示,其中每个节点有且仅有一个对应的数据类型作为最适合表示该语义类型的“首选数据类型”,除了“首选数据类型”之外的其他数据类型可以提供“代码块”或者“操作块”,用来和“首选数据类型”进行相互的数值转换。在类型模板库中,语义类型存在以下几种转换形式:

隐式转换:类似于数据类型中类的继承关系,在语义层面也存在着“任何类型为A的对象也一定是类型为B的对象”这样的蕴含情况,例如:语义类型A表示linux操作系统中的文件路径,语义类型B和C分别表示绝对路径和相对路径,众所周知,A相比于B和C其包含的范围更广且完全涵盖了B和C的范围,因此B或者C能够隐式转化为A。对程序代码来说,这意味表示B的float类型的绝对路径“/home/xxx/t.txt”或表示C的float相对路径“./t.txt”均可被视为“路径”。

显式转换:某些语义类型之间具有经过某些处理步骤之后的潜在的可等价关系,例如:语义类型A代表以“m/s”为单位的速度,B代表以“km/h”为单位的速度,则在采用“首选数据类型”float表示的时候两者能分别通过一个“操作块”或者“代码块”转化为对方。

新建语义类型:用户所描述或者命名的语义类型也很可能是库中没有的,当检索不到现有可用的语义类型的时候,输入句子中的语义类型视为需要被新建,除非用户显式指定一个数据类型,这时其“首选数据类型”将是“class”类型。用户新建语义类型的时候,语义类型实际上退化成了数据类型,因此对于语义类型库并不包含用户想要的类型的时候,情况也不会比目前的编程语言中这样直接使用数据类型更糟糕。另外,若用户新建的语义类型具有通用性,则该语义类型也可以上传到共用的模板库中供所有用户使用。

模板库的更新:模板库是编译过程的关键,由于能不断进行更新,因而可以不断地适应用户的使用习惯、逐步支持更多的自然语言表达和程序功能、提高编译的正确率。模板库可以由用户在线更新,或者由十分熟悉编译过程的专业人士(称为“专家”)进行离线更新。“语义类型”和“模板”既包含用于匹配自然语言的句子模式(称为“自然语言层面”),也包含希望转换为的代码原型(称为“代码层面”),这两个层面可以单独更新也可以同时更新。下面分别介绍各种情形:

“在线更新”就是在编译用户输入的句子的过程中更新模板库。例如,用户可以通过类似句子#5(“when we reset a airplane,it's speed and height are set toreciprocal.“)的方式来定义方法或者函数,而这可以被转化为模板,所以用户可以决定是否将这一模板上传到某个模板库中,以供自己或别人下次使用,这里同时更新了两个层面。同样,用户也可以将新建的语义类型加入“语义类型库”。

“离线更新”就是“专家”通过直接编辑资源文件或者直接操作来更新模板库,一般是批量的。例如,“专家”可以将python中的pandas数据分析库中的若干API转化为包含“语义类型库”和“模板库”的模板库,从而使用户也能通过自然语言转化来调用它们,以完成数据分析的工作,这里同时更新了两个层面。

“更新自然语言层面”就是修改“模板库”或者“语义类型库”中用于匹配的句子模式。例如,初始时模板的句子模式是“is set to”,输入句子“A is initialized to B”,由于“initialized”和“set”是近义词,因此通过特征向量检索句子仍然可能能和模板匹配,而匹配之后句子模式将被更新为“is set/initialized to”,这样扩大了句子模式匹配的范围,并且更适应用户的语言习惯。

“更新代码层面”同一个“模板”或者“语义类型”也对应着不同的代码实现。熟悉程序语言的“专家”可以针对现有的“模板”增加新的“代码块原型”,这样针对用户输入的同一自然语言句子,有多种备选的代码实现方式,用户可以根据实际需求选择最合适的一种。

由于构建的模板库可能规模巨大,需要在有限的运算时间内,从模板库中为句子匹配一套正确的语义类型、模板,并将它们组织成互相关联的变量、代码块。这个过程分为如下步骤:

首先进行迭代式检索。基于句子的依存句法树,从根节点开始遍历句子每个节点,用每个节点对应的“句子成分”在模板库中“检索”对应的“句子模式”,得到若干可能和该自然语言成分匹配的资源(“语义类型”或者“模板”)。对于每个节点都检索出可能匹配的若干资源。

然后进行约束匹配。有些节点对应了一个或者多个可能匹配的资源,通过校验这些资源组合能否满足特定的“约束条件”,来判断其是否可以作为整个句子的匹配结果,这样可以筛选出若干套(可以为零)资源组合。

接着进行用户交互。用户需要从筛选出的资源组合中选择一套作为正确匹配的结果。分情况讨论:

选择失败:如果上述步骤未筛选出任何可以匹配的资源组合、或者用户无法从中选择出正确的一套结果,则用户需要选择修改句子的部分成分或者重新输入整个句子。

修改句子部分成分:无法形成完整的匹配结果的原因可能只是句子的个别成分成分无法检索到对应的资源,或者不符合和其他句子成分的约束,则只需要修改这些句子成分,而不需要更新整个句子。然后将为修改过的句子成分重新检索资源,并再次尝试匹配和用户交互。

重新输入整个句子:根据语义向量可以匹配到和用户意图接近的资源,并据此来提示用户应该以何种形式来输入,用户可以根据提示重新输入整个句子。

选择成功:被用户成功选择的一套“资源组合”已经经过了“约束条件”的校验,其对应的“变量”和“代码块”可以相互“关联”在一起(“关联”意味着能将部分“变量”和“代码块”填入其他“代码块”的空槽,使得所有的“变量”和“代码块”都能相互建立起联系),同时由于当前句子也可能引用了之间的其他句子中的“变量”或“代码块”,因此所有句子的“变量”和“代码块”实际上是形成了一个全局的图状结构,关于这一结构的介绍具体见后面的章节。

下面是由一个句子转换成的相互关联的“变量”和“代码块”的例子。输入的是句子#5(“if the speed of the airplane exceed 2meter per second,we set it to itsreciprocal.”)这里的“符号表”表示引用了来自于其他句子中的标识符。

“句子成分”:以依存句法树中的某一个节点为根节点,可以得到树的一系列“子结构”,每个“子结构”对应了原句子的一个部分,并被称为该节点的一个“句子成分”。

“有效句子成分”:以当前节点为根的子树对应的“句子成分”可能对应着一份有意义的程序信息(如“变量”或“代码块”),称这样的“句子成分”为“有效句子成分”,识别出并只检索“有效句子成分”能大大减少检索运算量。

以speed为根节点,子树是“the speed of the airplane”,子结构(即“句子成分”)可能是“speed”、“the speed”、“the speed of”、“the speed of airplane”、“thespeed of the airplane”、“speed of”、“speed of airplane”等等。

经过某种规则的判断,“the speed”和“the speed of the airplane”可能对应着有意义的程序信息,而“the speed of”则不会对应,因此前者是“有效句子成分”而后者仅仅是“句子成分”,因此只需要拿这两个“有效句子成分”去“模板库”中检索。

“检索”:根据”句子成分“从”语义类型库“/”模板库“的海量的资源中快速地筛选出若干个(例如10个)“句子模式”,并得到“句子模式”相对应的“语义类型”/“代码模板”,这一过程称为“检索”。包括如下几种检索方法:

针对特征向量的向量近似最近邻检索(ANN)算法。这类方法中,给定一个向量,需要从海量的向量库中找到最相似的前若干个向量。包括HNSW、RNSG等一系列算法,具体实现中可以使用Milvus库。举例来说:

当前输入句子是“A is set to 0”,有效句子成分“is set to”的语义特征向量(0.5,0.6,0.7)作为检索请求query,而模板库中只有三个模板:

模板a:其句子模式“is initialized to”的语义特征向量为(0.51,0.61,0.71)

模板b:其句子模式“is equal to”的语义特征向量为(0.52,0.62,0.72),

模板c:其句子模式“is greater than”的语义特征向量为(0.1,0.2,0.3)

如果规定每次检索返回前2个结果,则模板a和模板b的特征向量与的query特征向量举例是最近的,因此这两个模板被认为与query在语义上最为接近,并被作为检索结果返回。

针对倒排索引的全文检索算法。具体实现中可以使用ElasticSearch库。

“约束条件”:检索出来的可能与各个句子成分的匹配的“资源”,这些资源存在很多种组合的可能性(称为“资源组合”),需要经过一些条件的校验才能确定某一“资源组合”是自洽的并且可以和整个句子匹配。例如可以使用以下“约束条件”:

连通约束:每个模板都可能含有若干空槽,用于填入变量或者代码块,连通约束要求每个空槽都必须被填充,这保证了每套模板都能成为一个相互关联、自洽的整体。

类型约束:模板每个的数值空槽都标明了语义类型,只有该语义类型的或者其语义类型能被转化为该语义类型的值才能被填入这个空槽,称为类型约束。

覆盖约束:句子的某些句子成分能检索到对应的资源,而有些则不行。不能检索到资源的句子成分有些是没有实际意义的(如助动词shall),另一些有实际意义但因为模板库中没有对应的资源或者算法不够可靠才检索不到。覆盖约束要求句子中绝大部分词都能覆盖,且被默认具有重要意义的词(例如每个动词)必须覆盖。而且未“成功检索”的词将被告知用户。

覆盖:如果“句子成分”检索到的“句子模式”中包括了“句子成分“中的某一单词,则称该单词被覆盖。

步骤S130,对检索到的中间表示作出可能的转换变为相互关联的模板;

在一些实施方式中,在上述的检索与匹配过程,句子中的“句子成分”在“语言库”中匹配到对应的“句子模式”,这些“句子模式”随后被映射成“代码块”或者“语义类型”。事实上,这中间可以再添加一种表示形式和转换步骤,称为“中间表示”。这种表示形式同时独立于“源语言”与“目标语言”,因此可以采用更灵活、通用的意义表示形式,基于逻辑的形式(例如“一阶谓词逻辑”和“lambda表达式”)是最佳选择。使用“中间表示”的作用在于:

实现异构转换:“源语言”与“目标语言”可能有某些在结构形式上差异很大的同义表达,称为“异构”,相互“异构”的“源语言”与“目标语言”之间的转换需要借助“中间表示”来完成,例如:

1.输入句子“both of tom and jerry got a milk“

2.匹配到两个句子模式“both of X and Y”、“X got a milk”,程序代码中没有“both of X and Y”对应的逻辑,这是“异构”的地方

3.将句子模式转化为“中间表示”,这里以一阶谓词逻辑为例子:

3.1both(tom,jerry,comb)表示将tom和jerry的整体极为comb

3.2got(comb,milk)表示comb的“got a milk”行为

3.3假设我们有规则“all x.all y.all z.all w.(both(x,y,z)&got(z,w))->(got(x,w)&got(y,w))”,表示每当整体有“got a milk”行为的时候则其部分也均具有该行为

3.4利用上述规则得到“got(tom,milk)&got(jerry,milk)”的中间表示

3.5将中间表示转化为代码。

实现领域拓展性。作为一个通用的意义表示框架,“中间表示”同时也能接入除了编程以外的更多其他领域的系统,例如:文件系统、web通信等等,使得编译过程与目标程序能与更广泛的上下文交互。

基于中间表示的转换的目的可以是处理相同意义的自然语言表达在结构上的多变性,例如:“a is set to 1”和“set a to 1”可以藉此转换成统一的形式。

步骤S140,将正确的一套模板的空槽填入对应的代码块与变量,得到当前句子对应的一套相关联的代码块,并与其他句子的代码块以同样方式连接,形成目标代码的整体的图状数据结构;

具体的,将目前为止的所有输入句子(所得到的相互联系的代码块)转化为一个有向异构无环图,称为“代码逻辑拓扑图”(以下简称“拓扑图”)。“拓扑图”中包含了完整的程序代码的执行逻辑,并且清晰准确、易于拓展或调整,能够方便地转化为目标代码。

拓扑图由相互交错的“作用域节点”和“代码块节点”组成。

在一些实施方式中,作用域节点:用来记录到目标代码中的某一个位置为止,下文的程序可以使用的所有上文中声明的标识符的集合;除了“根节点”外,每个“作用域节点”都有一个“源代码块节点”或者一个“父代码块节点”,“源代码块节点”是指生成了这一“作用域节点”的那个“代码块节点”。

在没有任何句子的时候,拓扑图中仅有一个没有“源代码块节点”或者“父代码块节点”的“作用域节点”,称为“根节点”。

代码块节点:即上文中所说的代码块,一个“代码块”在“拓扑图”中构成一个代码块节点。由于代码块中可能存在“数值空槽”或者“代码块空槽”。

若代码块具有“数值空槽”,那么需要从某一“作用域节点”中取某一标识符来填入这一空槽,这个“作用域节点”也叫做当前“代码块节点”的“源作用域节点”。如果代码块具有多个“数值空槽”,那么将有多个“源作用域节点“

若代码块具有“代码块空槽”,那么这一代码块空槽可以表示为当前节点的“子作用域节点”,当前“代码块节点”称为“子作用域节点”的“父代码块节点”。

对于”代码块节点“,需要注意:每个代码块节点都有且仅有一个“根作用域节点”。表示在当前父子作用域节点层级中最初的那个“作用域节点”,一般是“拓扑图”的“根节点”或者某一“代码块节点”的“子作用域节点”。

“操作块“在这里也视为一种特殊的”代码块“,它的特殊之处在于整个“代码块”对应着一个未命名的值,可以用来填入其他“操作块”的“数值空槽”中。

步骤S150,将图状数据结构转化为最终的目标代码。

在一些实施方式中,将拓扑图转化为最终的程序代码,需要将有宽度的拓扑图“序列化”为固定宽度(其“宽度”为一个“代码块”)的目标代码,其间采用一些策略需要对代码进行“优化”,然后需要根据用户的习惯来“格式化”目标代码,最后将代码“固化”成源代码文件和目录。

实施例2

请参阅图2,图2为本发明实施例提供的一种将自然语言转化为程序代码的方法详细步骤示意图,其如下所示:

步骤S200,对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息;

步骤S210,将源语言进行分割后,依次处理每个单元,并将源语言处理成适合深度学习模型处理的标准形式;

在一些实施方式中,如果源语言是英文,则按照空格进行分割成单元。针对中文可能是中文分词、针对中英文混合可能是按照语言提取出英文单词。

步骤S220,根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树;

步骤S230,使用训练好的深度学习模型处理源语言,根据源语言语法上的构成关系将其分解并组织成更易于处理的树状结构,并提取句子、子句、词组、单词的语义特征向量;

步骤S240,在预构资源库中为源语言检索出可能匹配的若干个资源;

步骤S250,迭代处理语法树,并在预构资源库中检索可能与当前树节点对应的源语言成分匹配的源语言模式;

步骤S260,源语言模式被映射成代码模板或变量模板与目标语言有关的表示;

步骤S270,源语言模式被映射成一阶谓词逻辑表示、lambda表达式表示或程序代码数据结构的表示独立于源语言与目标语言的中间表示;

步骤S280,对检索到的中间表示作出可能的转换变为相互关联的模板;

步骤S290,对检索到的中间表示作出可能的转换变为相互关联的模板,模板中选择能够相互关联并且能够覆盖原源语言的一组可能性;

在一些实施方式中,覆盖为尽可能覆盖,不一定完全覆盖,可以遗漏某些不重要的助词、修饰词。

步骤S300,判断是否有多种可能性;

若是,则进入步骤S310,若不是则进入步骤S340;

步骤S310,由用户交互式选择正确的一套模板;

步骤S320,将资源库中的多个资源组合而成的资源组对应的变量和代码块进行关联,并与之前输入的其他源语言的变量和代码块相关联,组织成程序代码整体的逻辑拓扑图;

步骤S330,根据拓扑图生成程序代码,并对生成的程序代码进行优化、整理代码文件;

步骤S340,提示用户修改输入或者重新输入;

在一些实施方式中,首先获取用户输入的自然语言句子;然后对句子进行预处理;使用深度学习模型对句子进行句法解析;在构建好的大规模资源库中为每个句子成分检索出可能匹配的若干个资源;基于约束筛选出所有可以和整个句子匹配的资源组合;判断用户是否选出其中一套可以和句子匹配的资源组合;若一套都不存在、用户选择失败,且用户决定要修改句子成分;则用户根据提示修正个别句子成分,并重新回到“在构建好的大规模资源库中为每个句子成分检索出可能匹配的若干个资源”这一步;若一套都不存在、用户选择失败,且用户决定要重新输入;则用户根据提示重新输入整个句子;当存在至少一套,且用户成功选择时;将这套资源组合对应的变量和代码块关联起来,同时与之前输入的其他句子的变量和代码块相关联,组织成程序代码整体的逻辑拓扑图;根据拓扑图生成程序代码、优化代码,整理代码文件。

实施例3

请参阅图3,图3为本发明实施例提供的一种将自然语言转化为程序代码系统模块示意图,其如下所示:

预处理模块10,用于对输入的源语言进行预处理,提取源语言中与目标代码直接有关的关键信息;

分析模块20,用于根据深度学习模型提取源语言的特征向量,并将源语言解析成语法树;

检索模块30,用于在预构资源库中为源语言检索出可能匹配的若干个资源;

转换模块40,用于对检索到的中间表示作出可能的转换变为相互关联的模板;

连接模块50,用于将正确的一套模板的空槽填入对应的代码块与变量,得到当前句子对应的一套相关联的代码块,并与其他句子的代码块以同样方式连接,形成目标代码的整体的图状数据结构;

转化模块60,用于将图状数据结构转化为最终的目标代码。

还包括存储器、处理器和通信接口,该存储器、处理器和通信接口相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。存储器可用于存储软件程序及模块,处理器通过执行存储在存储器内的软件程序及模块,从而执行各种功能应用以及数据处理。该通信接口可用于与其他节点设备进行信令或数据的通信。

其中,存储器可以是但不限于,随机存取存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(Programmable Read-OnlyMemory,PROM),可擦除只读存储器(Erasable Programmable Read-Only Memory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-Only Memory,EEPROM)等。

处理器可以是一种集成电路芯片,具有信号处理能力。该处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital Signal Processing,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

可以理解,图3所示的结构仅为示意还可包括比图3中所示更多或者更少的组件,或者具有与图3所示不同的配置。图3中所示的各组件可以采用硬件、软件或其组合实现。

综上所述,本申请实施例提供的一种将自然语言转化为程序代码的方法及系统,通过计算机对自然语言,例如:中文、英文,简称“源语言”,进行自动处理和分析,将其转化为高级程序设计语言,例如:C++、Python、Java,称为“目标语言”的目标代码,其能够创新性地视自然语言转化为程序代码的过程为机器学习与信息检索的不确定性问题,定义了这一问题中的评价标准,以使得其能够采用其他问题中常见的衡量指标进行评估。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其它的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号