APP下载

基于模板和规则的声明式代码生成

2022-03-21北方工业大学冯俊辉刘晨郭浩然

数字技术与应用 2022年2期
关键词:代码生成语句代码

北方工业大学 冯俊辉 刘晨 郭浩然

Drools是开源业务规则引擎,规范的Drools规则代码具备简短、声明式、可读性强等特性。目前,Drools规则代码需人工编写,缺少一套机制自动生成代码。本文中,提出一套基于模板和规则的机制以生成声明式Drools规则代码,并针对物联网环境,构建了7500条Drools规则。基于构建的规则集,对本文提出的系统架构进行了验证,并取得了一定成果。

高级编程语言依据编程规范,分为命令式语言、声明式语言。官方规范的Drools规则语言是声明式的,包含命令式、条件式代码的复杂规则可转换为多条声明式规则。Drools作为推理引擎,可用于物联网环境,依据规则以及规则间的推理关系实现物联网设备的自动控制。

但是,非技术人员无法编写Drools规则代码。为解决该问题,本文提出基于模板和规则的方法帮助用户从受限自然语言生成Drools规则。基于模板的代码生成(TBCG)是从高级规范生成代码的合成技术,可根据模板计算动态部分,是模型驱动工程(MDE)中的流行技术。基于规则的代码生成是开发人员依据经验或者先验知识、事实等制定的一种策略,为自然语言到自然语言、代码之间的转换提供了依据。

目前,自然语言到代码生成的研究主要聚焦于TEXT2SQL任务,忽略了其他领域基于自然语言生成代码的需求,本文正好弥补了这一缺陷。

1 Drools规则模板

Drools规则作为Drools引擎推理依据,由规则名、属性、条件部分(LHS)、动作部分(RHS)组成。结合物联网环境、Drools规则代码特点,制定如图1所示模板。

图1 Drools规则模板Fig.1 Drools rule template

模板中:ruleName为规则名、ClassName为系统类名、instanceName为类实例对象名、Field为类属性、Operator为操作符、Value为属性值、AND|OR为逻辑符合、Method为方法名。

本文提出的架构结合Drools规则模板,可解析用户输入的受限自然语言以替换上述模板内容,自动生成Drools规则。

2 系统架构

本文基于模板和规则的方法提出如图2所示框架。

图2 Drools规则代码自动生成框架Fig.2 Drools rule code automatic generation framework

框架以自然语句作为输入,将复杂自然语句切为多条简单自然语句。采用Semantic Analysis、Template Analysis,对简单自然语句进行语法、模板分析,解析结果与Java类文件、类文件描述、Drools规则模板输入Drools规则生成器。最终,由Drools规则生成器输出自然语句对应的Drools规则。其中,Java文件则为系统类文件,Java描述文件则是对类、类方法、成员属性进行功能描述的文件。

2.1 Split Statement

Split Statement负责切分复杂自然语句,将包含多个and、or复合逻辑的自然语句分割为仅包含单个and或or的简单自然语句,也即Simple Nature Language。语句切分必要性包含两点:简化解析难度、符合Drools官方规范。

2.2 Semantic Analysis

Semantic Analysis模块,采用NLP技术对自然语句进行解析。本文使用斯坦福大学提供的StanfordCoreNLP,通过Lemma化、依存分析、命名实体识别、part-of-speech信息和语法规则对简单自然语句进行解析。如,针对自然语句“When the air-conditioning is turned on, then close the window.”,StanfordCoreNLP解析得到的Lemma化结果、依存树结构分别如图3、图4所示。

图3 语句Lemma化结果Fig.3 Lemma result of statement

图4 依存树示例Fig.4 Example of dependency tree

通过Lemma化结果,如“turned on”归一为“turn on”,Lemma化的优势在于可去除时态、三单等语法形式引入的复杂性。

通过依存树的结构信息,可以分析各设备及其动作。自然语句中存在作为属性值的数字等实体时,可结合实体分析和依存树结构,判断出属性值的从属关系。

针对Drools规则在物联网环境下的特点,涉及的语法主要包括主系表、主谓宾、There be三种结构。

2.3 Template Analysis

Template Analysis通过解析模板对自然语句进行处理,以获取简单自然语句中的设备名、属性、参数值。本文系统中,解析模板包含两类:自动模板、人工模板。自动模板从小规模训练集中提取,提取步骤如下:

(1)通过StanfordCoreNLP获取简单自然语句PosTags信息,将PosTags词元形式作为模板,以提升其泛化能力;

(2)观察简单自然语句与对应的Drools规则,依据规则擦除PosTags中对应位置的信息,设备名、属性、参数值分别采用正则表达式标识;

(3)模板入库,人工模板由系统人员编写,与自动模板相比,人工模板更具针对性、可靠性。本系统中,人工模板的解析优先级高于自动模板。

Semantic Analysis、Template Analysis解析结果格式如下:

when部分:{ 设备名, 属性, 操作符, 参数值,逻辑符号 }

then部分:{ 设备名, 属性, 动作, 参数值 }

2.4 Drools Rule Generator

Drools Rule Generator由5部分构成:

Class Component:将解析的设备名转化为系统类名。类名解析首先判断是否具备类名同设备名相同,不同时则计算类名与设备名相似度,超过相似度阈值时则解析结束。否则,将通过类描述文件判定包含关系以及相似度。经实验表明,类描述文件是解析系统的有力补充模块;

Method Component:将动作转化类方法。通过StanfordCoreNLP获取动作字段词元,字段原形态、词元形态分别记为a1、a2。遍历方法注册表,若a1、a2与方法描述语句存在匹配关系,则将方法纳入候选集。遍历结束,通过类名、属性值对候选集进行二次过滤以获取最终结果;

Field Component:将属性转化为类属性。若属性字段为空,则以设备名作为属性。遍历属性描述文件,若与描述存在匹配关系或相似度超过阈值,则将属性纳入候选集。候选集中存在多个可能属性时,通过设备名、设备名对应的类名对结果二次过滤,以获取最终属性;

Value Component:为类成员属性赋值。在赋值操作中,主要将对参数值的类型以及成员属性类型进行一致性校验,校验成功后进行赋值;

Validate Component:验证生成的Drools规则语法是否正确。

基于模板和规则的方法,结合以上架构,可自动将用户输入的受限自然语句转化为Drools规则代码。

3 实验

3.1 数据集

人工编写7500条物联网环境下的标准Drools规则,每条规则由自然语句、Drools规则构成,数据集结构如下:

(1)2500条每个规则仅包含与逻辑的数据集;

(2)2500条每个规则仅包含或逻辑的数据集;

(3)2500条每个规则同时包含与或逻辑的数据集;

(4)7500条混合数据集,由以上3部分数据集构成。

3.2 评价指标

自然语句到Drools规则自动生成采用BLEU(Bilingual Evaluation Understudy)、ROUGE(Recall-Oriented Understudy for Gisting Evaluation)作为评价标准。BLEU、ROUGE指标分别计算1-gram至4-gram评分,以评估生成代码的准确度、流畅度。

BLEU评分范围为0~1,分数越接近1,翻译质量越高,计算公式如下:

其中,lc为机器译文长度,lr为最短参考翻译句子长度。BLEU需计算译文1-gram--N-gram精确率,通常N取4。Pn为N-gram精确率,Wn为N-gram权重,BP为惩罚因子。算法中,1-gram表示译文符合原文的程度,N-gram表示翻译结果流畅度。

ROUGE主要基于召回率,是常用的机器翻译和文章摘要评价指标,由Chin-Yew Lin提出,计算公式如下:

公式中,分母为参考译文中N-gram个数,分子为参考译文与机器译文共有N-gram个数。

3.3 实验结果

针对3.1部分提出的数据集,自然语句生成声明式Drools规则代码实验结果如表1所示。

表1 Drools规则代码生成实验结果Tab.1 Experimental results of Drools rule code generation

根据实验结果,7500条自然语句BLEU-1翻译得分为0.9925、ROUGE-1为0.9870,表明生成的Drools规则与标准规则匹配度很高。2-gram至4-gram表示翻译流畅度,其中4-gram含义最强。对于7500条自然语句翻译结果,BLEU-4为0.9642,ROUGE-4为0.8888,表明生成的Drools规则与标准规则在流畅度方面表现较好。生成的Drools规则与标准规则之间的差异归结为以下两点:

(1)属性值、方法值不同。自然语言解析阶段无法获得属性值或方法值,是造成差异的原因之一。如针对“when the light is turned on”条件,规则代码生成时可推理出该条件对应的类为Light、属性为State,但无法得知State值为0或1。方法值不同亦是如此。

(2)属性顺序不同。自然语言翻译领域,如汉英互译时,主谓宾等语法顺序的正确性决定了翻译结果的准确性。但是,Drools规则代码的条件属性顺序却有所不同。如“AirConditionor(state==1,isOn==true)”和“AirConditionor(isOn==true,state==1)”,二者条件属性顺序不同,但条件含义、语法、执行结果均一致。由此,BLEU、ROUGE在计算N-gram时,无法准确体现结构不同的代码在功能上是否一致。

4 结语

Drools作为成熟的商业引擎,同IFTTT一样可用于物联网环境。通过制定Drools规则,可依据环境状态自动控制物联网设备。本文提出的基于模板和规则的方法和系统架构,可依据受限自然语句自动生成声明式Drools规则代码。实验结果表明,基于模板和规则的方法在实际应用过程中具备可实施性、高精准性。但是,本文架构中的语义解析、模板解析模块还不够完善,有些自然语言形式化表达字段还无法解析,未来工作将提出更完善的形式化表达字段解析方法。

猜你喜欢

代码生成语句代码
重点:语句衔接
Lustre语言可信代码生成器研究进展
创世代码
创世代码
创世代码
创世代码
代码生成技术在软件开发中的应用
基于XML的代码自动生成工具
如何搞定语句衔接题
基于关系数据模型代码生成器的设计与实现