引用

Desai A, Gulwani S, Hingorani V, et al. Program synthesis using natural language[C]//Proceedings of the 38th International Conference on Software Engineering. 2016: 345-356.

摘要

随着计算机进入千家万户,人机交互变成了一项极其普遍的活动。一些重复性或专业性任务通常需要创建小型的、一次性的程序。为了实现这些一次性程序,终端用户(End-User)可能需要花费大量时间和精力去学习各种领域特定语言(Domain Specific Language,DSL),这为用户带来了极大的不便。

在本文中,作者提出了一个通用框架。该框架可以构建一种能够利用自然语言(Nature Language,NL)合成目标 DSL 的程序合成器(Synthesizer)。该框架以 DSL 定义和训练数据(NL/DSL 对)为输入,通过训练使用最优权重和自然语言处理(Nature Language Processing,NLP)的若干特征的、基于关键词编程翻译的分类器,实现了目标程序合成器的构建。该框架可以应用于重复文本编辑、智能教学系统和航班信息查询三个领域。通过本文提供的框架,作者利用 1200 余个英语描述分别构建出三个针对不同领域的程序合成器。预期程序(Desired Program)在程序合成器输出的合成程序列表中排在 Top-1 和 Top-3 的概率分别为 80%和 90%。

关键词:自然语言;领域特定语言;程序合成

1 引言

程序合成(Program Synthesis)是一个根据给定的规格(Specification)、以某种基础领域特定语言(DSL)为原料自动合成程序的过程。传统的程序合成依赖完全规格(Complete Specification)。由于编写完全规格存在困难,同时结果验证(即验证合成得出的程序是否满足规格)也十分不易,因此传统程序合成并没有得到广泛的应用。

最近,相关研究尝试在程序合成过程中使用样例(Examples)作为指导合成的规格。该类研究已经得到了广泛应用,其原因在于:相比于完全规格,样例规格往往更容易获得。比较典型的例子有实例编程(Programing by Example,PBE)系统。由于样例需要与准确的程序意图相结合才能形成样例规格,因此,当样例的需求量过大时,规格的构建将变得十分困难。如 L算法——一种用于描述常规语言的 PBE 系统——它的一大缺点就是系统构建需要依赖大量的样例;再如像航空旅行查询系统(Air Travel Information System,ATIS)这类的专业领域,要求终端用户(即普通乘客)构造成充斥着专业名词输出/输出样例是一件几乎不可能的事情。但与 L算法所处的场景不同,ATIS 领域的合成问题存在改进的可能,因为“航线查询”这类领域任务通常可以利用自然语言描述。由此,作者认为自然语言的描述也许能够指导程序合成可靠地进行。

在本文中,作者解决了利用自然语言(NL)合成基础底层特定语言(DSL)的程序的问题。从本质上来说,NL 是不精确的,因此可能无法保证合成程序的正确性。为了保证结果程序的准确性,作者将程序合成器的输出定义为一组排序后的结果程序(而不是单个结果程序),并允许用户通过检查源代码和观察程序输出的方式来检查程序、挑选程序。本文提出的合成算法能够在基准数据上提供稳定的合成结果:在 80%的序列结果序列中,预期程序排在 Top-1 的位置;在 90%的结果中,预期程序排在前三。此外,为了帮助用户更好地选择程序,作者还将代码翻译成无歧义的英语表达,以供用户预览。

本文提出的方法可以应用于多种 DSL。在使用框架时,程序合成器的设计人员需要提供两个输入:① DSL 定义,一组从 DSL 操作到对应 NL 描述/概念的映射;② 训练数据,一组样例对(Example Pair),每个样例对包含一组英语描述和一个符合这组描述的预期程序。在训练阶段,本文的方法会:① 以半自动方式推断英语单词和 DSL 终结符之间的字典关系;② 通过一个通用合成算法,以完全自动化的方式推断英语单词的最优权重/分类符(Optimal Weight/Classifier)。综上,本文提出的方法可以看作一个能够构建 NL-to-DSL 程序合成器的通用框架。

2 研究动机

作者在研究过程中发现了三种可以应用 NL-to-DSL 合成器的场景,分别是:高阶文本编辑操作(2.1 节)、智能教学系统中的自动机构造问题(2.2 节)以及航空旅游信息系统的查询问题(2.3 节)。

2.1 文本编辑(终端用户编程)

在浏览 Office 程序(如 Microsoft Excel 和 Word)的帮助论坛时,作者发现了许多关于“如何进行重复文本编辑操作”的求助。例如:在 Word 文档中执行特定条件下的插入、删除、替换或提取操作,如表 1(b)所示。这些操作比单纯的文本搜索或字符串替换要复杂的多,属于高阶文本编辑操作。高阶操作通常具有两类特征:① 字符串的搜寻条件不是常量,而是正则表达式;② 文本的编辑和目标文本的上下文有关。高阶文本编辑往往需要用户了解正则表达式、条件语句和循环语句的语法和语义,而这大大超出了绝大部分终端用户的能力。

表 1 文本编辑领域相关的语法和基准样本

上述需求启发作者设计一种用于实现高阶文本边界操作的命令语言,该语言的部分语法如表 1(a)所示。语法中包含了一些文本编辑的关键命令,如插入 Insert、删除 Remove、打印 Print 和替换 Replace,这些命令都依赖于一个指明了编辑操作作用范围(比如一组行、一组单词或整个 Word 文档)的 IterScope 表达式。SelectStr 产生式(Production)内含一个允许有限通配符匹配的令牌 Token、一个用于过滤匹配值的布尔条件 BCond 以及一个基于下标的结果选择记号——出现值 Occurrence。例如:我们可以使用 AtomicOccurrence 中的 FirstFew(N)项来删除符合匹配条件的前 N 的结果;特别地,当 Occurrence 的值为 ALL 时,所有满足匹配条件的结果都将被删除。布尔条件 BCond 囊括了一些标准的字符串匹配谓词(如 Contains、StartsWith 等),由原子条件 AtomicCond 组成,支持 And、Not 在内的条件组合。CommonCond 产生式标定了相对于某个字符组合的位置,如在某个字符组合之后 After(Token)、在某个组合之前 Before(Token)和某两个组合之间等 Between(Token, Token)。样例 1 和样例 2 分别给出了针对表 1(b)中所示的编辑任务 1 和 2 的命令语言描述。

样例 1 表 1(b)中文本编辑任务 1 的 DSL 描述

样例 2 表 1(b)中文本编辑任务 2 的 DSL 描述

此外,表 1(c)描述了该语言系统可以处理的其他变式。这些自然语言任务都可以用表 1(a)所示 DSL 语法来描述。作者认为表 1(a)给出的语法足够支持高阶文本编辑操作:一旦用户习惯使用 DSL 语言完成简单的条件性文本操作,那么通过将复杂问题分解为简单问题,更加复杂的文本操作也不成问题。

2.2 自动机理论(智能教学)

形式化方法的研究成果已经在智能教学系统的多个部分中得到了应用,包括问题生成(Problem Generation)、题解生成(Solution Generation)和一些关于几何、自动机理论在内的各种学科领域的反馈生成(Feedback Generation)等多个领域。这些领域中的每一个都涉及一种专用的 DSL,用于生成题目、产生题解以及生成针对学生提交题解的反馈意见。

以自动机的构造为例:假设学生需要构造这样一个自动机,该自动机需要能够接受一段描述了某种语言的英文段落(有关示例见表 2)。根据 Alur 等人提供的、关于构造此类语言的一些要素,作者设计了一种 DSL,可以通过两种方式为学生提供指导:① 作为题解生成工具的输入以生成一个正确的题解,并以这个正确题解为基准为学生提交的题解打分;② 用于提供反馈并根据学生的提交生成问题变式。该反馈生成工具已经部署在部分教室中。实践证明,该工具能够以比人类更快、更合理方式分配成绩和生成反馈。

表 2 有关自动机领域的基准样本

样例 3 和样例 4 分别展示了表 2 中规格 1 和规格 2 的 DSL 翻译结果。

样例 3 表 2 中规格 1 的 DSL 翻译结果

样例 4 表 2 中规格 2 的 DSL 翻译结果

2.3 航空旅游信息系统(ATIS)

ATIS 是用于查询航空旅行信息的标准基准,包括英语查询和包含航班信息的数据库。长期以来,ATIS 一直被自然语言处理和语音处理社区广泛用作通用基准。表 3 展示了一些来自 ATIS 的查询样本。

表 3 ATIS 领域的基准样本

针对 ATIS,作者设计了一种基于 SQL 行列操作的 DSL,能支持谓词和表达式运算。这些谓词和表达式与航空旅行查询领域的出发地/目的地、日期、价格等重要概念相对应。表 3 中的第一个查询语句可以翻译成如样例 5 所示的形式。

样例 5 表 3 中第一个查询语句的 DSL 表示

3 问题定义

本文主要研究如何使用给定的 DSL 定义和训练数据合成目标 NL-to-DSL 合成器。现给出如下定义:

(1)领域特定语言:一个领域特定语言 L = (G, TC)由一组上下文无关文法 G(其中 GT 表示终结符集、GR 表示产生式规则集)和一个可以检查给定程序类型正确性的类型/语义检查器 TC 构成;

(2)训练数据:训练数据由一组形如(S, P)的对组成,其中:S 是一个英语句子,P 是用领域特定语言 L 写成的预期程序。一个英语句子 S 可以简单表示为一个单词序列[w1, w2, … , wn];

(3)NL-to-DSL的功能目标:生成的 NL-to-DSL 生成器应该能够将一个英语句子翻译成一个由排序后程序组成集合[P1, P2, …, Pk]。其中所有的程序都由 L 编写。

4 语言转换算法

本文提出的合成算法(算法 1)从用户处获取自然语言命令作为输入,并创建候选 DSL 排名列表作为输出。算法的第一步(第 2 行的循环)是利用定义了 NL 到终结符映射的字典结构 NLDict 将用户输入中的而每个单词转换为一个或多个终结符。该循环遍历输入语句的每个字符。针对每一个索引,算法将利用 NLDict 挑选出相关单词,并查找 DSL 中与这些单词相关终结符集。从本质上来说,NLDict 为每个终结符进行了编码,并根据输入的英语单词决定在最终生成的预期程序中选用哪些终结符。

字典 NLDict 会分别将每个自然语言单词与一组终结符关联起来。终结符可能是常量值,也有可能是参数空缺的的函数(留白参数用“□”表示)。因此,当在算法 1 的第三行上应用 NLDict 时,生成程序中某些函数的参数可能会发生缺失,进而输出不完整的程序。以语句“Print all lines that do not contain 834(打印除 834 以外的所有行)”为例:由于语法中包含产生式规则 PrintCmd := Print(SelectStr,IterScope),且字典将单词“print”与函数 Print 关联在了一起,那么这样就会生成不完整的程序 Print(□, □)。这些空缺将在后续被一些能够匹配参数 SelectStr 和 IterScope 的程序所替换。

算法 1 NL-to-DSL 合成算法

在完成了基本终结符集合的构建之后,算法 1 将采用 Bag 算法(算法 2)来生成一个包含所有候选程序的集合 ResT,对应算法 1 的第 5 行。算法 1 的最后一步是结合得分和权重,对集合中所有的候选程序进行排序,对应算法 1 第 8 行。

算法 2 Bag 子合成算法

5 训练阶段

本节主要介绍分类器、权重和单词到终结符映射的学习过程。训练阶段的关键在于 ① 确定使用哪种机器学习算法;② 利用 DSL 设计者提供的高阶训练数据生成为机器悬系算法服务的低阶训练数据。

5.1 映射得分分类器(Cmap)

Cmap 的功能是利用单词 w 的 POS 标签预测 w 映射到某个终结符 t ∈ GT 的可能性。本文使用了一种朴素贝叶斯分类器的现有实现来训练分类器 Cmap,用于训练 Cmap 的算法如算法 3 所示。

算法 3 训练映射得分分类器 Cmap

相似性元组主要为两个目标服务:第一,通过 UsedWords,引导系统侧重那些“使用了输入语句中所有部分”的映射;第二,通过 Disjointness,引导系统侧重那些惩罚了“使用输入语句中单个部分来构建多个不同子程序”的映射。

5.2 结构得分分类器(Cstr)

本部分将介绍为结构得分服务的分类器 Cstr 的训练过程。对于每一个连接 Conn,都有一个分类器 Cstr [Conn]与之对应。分类器 Cstr [Conn]的主要功能是预测一个组合 c 是连接 Conn 的一个实例的概率。本文使用了朴素贝叶斯分类器的现有实现来生成训练数据,训练过程如算法 4 所示。

算法 4 训练结构得分分类器 Cstr

算法 4 的关键思路是在不记录单个步骤得分的情况下(SynthNoScore)运行合成算法,目的是利用一个英语句子 S 构造包含所有可能程序结果的集合 AllOpts。P’是 AllOpts 中的一个程序。任何出现在 P’但没有出现在 P 中的组合都将被用作负样例(Negative Example);相反的,如果该组合同时出现在 P’和 P 中,那么它将被用作正样例(Positive Example)。

5.3 字典构建

利用 DSL 中终结符的名字(表示函数和参数),本文提出的方法将通过一种半自动化的方式构建字典 NLDict。对于名字恰好对应英文单词(例如 Insert)的操作,作者直接利用 WordNet 同义词列表来收集所有和该操作(插入操作)相关的所有常用同义词;对于终结符的名字不是一个英文单词、而是采用某种命名方式产生的单词的链接(例如 StartsWith)的操作,作者首先利用命名规则分解操作名称,紧接着再解析出每个子名称对应的同义词。

值得注意的是:WordNet 提供的同义词集合中可能会包含一些对目标特定领域没有意义的英文单词。这个问题由 5.1 节介绍的算法 3 解决:根据映射得分训练算法,这类单词的得分将会比较低。并且,本文的方法还会在得分分配完成后,舍弃掉得分低于某个阈值的所有映射;同理,WordNet 也有可能无法提供对于某个特定领域极其重要的英语单词、或者 DSL 中终结符的名称不能有效地匹配到英语单词。由于在这种情况下,算法 4 将无法生成见证者映射,因此系统将能够自动检测到这种情况,并告知用户他/她的输入中有哪些无法和终结符正确对应的单词。这些不能正确对应到终结符的单词将被用作种子单词(Seed Word)输入到 WordNet,以进一步生成更加全面的同义词集。

致谢

本文由南京软件学院 2020 级硕士钱瑞祥翻译转述。

利用insert、update和delete命令可以同时对多个表进行操作_使用自然语言进行程序合成...相关推荐

  1. 利用insert、update和delete命令可以同时对多个表进行操作_学习笔记-操作系统(1)...

    概念 负责管理协调硬件.软件等计算机资源的工作 为上层用户.应用程序提供简单易用的服务 是一种系统软件 功能和目标 资源的管理者 处理机管理:进程管理(进程控制.进程同步.进程通信.死锁处理.处理机调 ...

  2. [转]Insert, Update, and Delete Destination table with SSIS

    本文转自:http://www.rad.pasfu.com/index.php?/archives/150-Insert,-Update,-and-Delete-Destination-table-w ...

  3. mysql新增后默认返回值_mybatis insert、update 、delete默认返回值解释与如何设置返回表主键...

    在使用mybatis做持久层时,insert.update.delete,sql语句默认是不返回被操作记录主键的,而是返回被操作记录条数: 那么如果想要得到被操作记录的主键,可以通过下面的配置方式获取 ...

  4. Mybatis insert、update 、delete返回值

    在使用mybatis做持久层时,insert.update.delete,sql语句默认是不返回被操作记录主键的,而是返回被操作记录条数: 那么如果想要得到被操作记录的主键,可以通过下面的配置方式获取 ...

  5. mybatis(三) XML映射器之select、update、delete、insert标签

    目录 文章目录 3.XML映射器 3.1.select 3.1.1.单表查询 3.1.2.select标签属性列表 3.1.3.parameterType属性 3.1.4.resultType 3.1 ...

  6. TRUNCATE vs DELETE命令

    TRUNCATE vs DELETE命令 作用:用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ; 语法: TRUNCATE [TABLE] table_name;-- 清空年级表 TRU ...

  7. mysql 注入 update_利用insert,update和delete注入获取数据_MySQL

    0x00 简介 利用SQL注入获取数据库数据,利用的方法可以大致分为联合查询.报错.布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的.那么,当我们发现了一个基于i ...

  8. 5-8基于insert update delete的注入利用案

    目录 基于报错的信息获取-insert下基于updatexml()获取信息 基于报错的信息获取-delete,update下基于updatexml()获取信息 基于报错的信息获取-三个常用的用来报错的 ...

  9. linux mysql 事务_linux下mysql Insert update delete 事务 用户管理

    linux下mysql Insert update delete  事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES ...

最新文章

  1. JAVA中byte为负数处理
  2. 使用 Vue.js 和 Chart.js 制作绚丽多彩的图表
  3. 企业级WEB的负载均衡高可用之LVS+Keepalived(3)
  4. Codeforces Round #304 (Div. 2) D. Soldier and Number Game 数学 质因数个数
  5. BZOJ3421 : Poi2013 Walk
  6. 防止sql拼接的Java方法_JAVA程序防止SQL注入的方法
  7. python文字转语音
  8. PS案例提升 【第1节】抠图--薄、透、露的朦胧美 案例二:扣取婚纱新娘
  9. 怎样设计一个好的社交网站
  10. java计算两个月份差_Java编程实现计算两个日期的月份差实例代码
  11. 计算机组成原理第三章笔记---计算机功能与互联
  12. html存储数据的方法,数据存储方式有哪些
  13. Spring-Boot框架学习视频-百度云盘
  14. 理想低通滤波器、Butterworth滤波器和高斯滤波器
  15. 最后的彩虹蝶为生命而舞
  16. Grub2的一些典型菜单写法
  17. 这款pubMed文献爬虫下载器,妥妥的科研利器
  18. 估值“洼地” 煤炭板块再度崛起(附股)
  19. ​力扣解法汇总522-最长特殊序列 II
  20. 利用计算机阅读的文献是什么,文献检索作业

热门文章

  1. 论文解读二十七:文本行识别模型的再思考
  2. 618技术特辑(三)直播带货王,“OMG买它”的背后,为什么是一连串技术挑战?
  3. 学习索引结构的一些案例——Jeff Dean在SystemML会议上发布的论文(中)
  4. java awt文件上传_springMVC实现前台带进度条文件上传的示例代码
  5. mysql 数据目录更换_更改Mysql数据目录,这个坑你可能也趟过~
  6. m1芯片Mac安装jekyll+搭建GitHub pages个人博客站点
  7. python读取图片并储存为CSV文件
  8. db2 兼容 oracle 语法,db2 case when和oracle兼容有关问题
  9. 2020年日历电子版(打印版)_2020年日历电子版(打印版)79451
  10. matlab函数用法积累