视频教程 > osl语法描述语言

语法描述规则

olami     2017-08-14 10:14



以下是视频内容文字版:

大家好,欢迎观看欧拉蜜开放平台系列教程视频。今天这节课将为大家介绍 OSL 语法描述语言的语法描述规则。

我们主要将通过这些规则在 rule、grammar 等语法元素中的运用来为大家进行讲解。一共涉及7条规则。


一、 sequence规则(写作顺序)

Sequence规则规定了OSL语法描述语言中的描述句是从左到右的顺序关系。例如,“pattern”代表任何符合OSL语法描述语言规则的语法描述句,那我们的写作方法也是从左到右依次写上“pattern1pattern2pattern3……”

正如给出的两个示例:

Grammar:

<我喜欢欧拉蜜>:我喜欢欧拉蜜


Rule:

<olami>:olami|欧拉蜜|你

Grammar:

<我爱欧拉蜜>:我爱<olami>

按照从左到右的写作顺序撰写即可。


二、 literal规则(文字描述)

OSL 语法描述语言中的 literal 规则是一种文本描述规则,表示直接写下您要匹配的字符。 

它具有以下三种特性:

1、 一般字符串:

属于最常见的规则,直接写出字符串,允许的字符有:中文字、全形(全角)标点符号、数字、英文字母。(不允许半形(半角)标点符号和空格,所有语法中直接书写的空格会被语法系统自动忽略。)

例,我们写一条grammar:

北京的天气怎么样

OLAMI 语义解析时能够自动忽略语料中的一些标点符号(标点符号的省略第七点会讲到),因此,上述示例可以同时支持 “北京的天气怎么样”、“北京的天气怎么样。”以及“北京的天气怎么样?” 这几个文本的匹配。

如果grammar写成:

北京的天气怎么样?

那么这条grammar必须与句末带有全角标点 “?”的语料相匹配,如 “北京的天气怎么样?”。因为该语法描述句中的 问号, 被视为要求的中文字定义之一。

因此,除非您对前端的文本输入格式有特定的要求,否则在一般情况下,我们建议不需要在语法描述句中加上标点符号或空格。 

2、 双引号字符串

用双引号 ”” 将文本字符串包覆起来,例如:”,”,其内容允许包含全形、半形标点符号在内的任意字符,某些特殊字符属于转义字符,必须用双引号括起来,例如:”\r”、”\n”、”\t”。 

例如grammar:

我想去北京“\t”那里的天气怎么样 

匹配语料:

我想去北京 那里的天气怎么样

3、 单引号字符串:

用两个单引号 ' 将文本字符串包覆起来,例如:',',其内容允许除了单引号以及转义字符之外的包含全形、半形标点符号在内的任意字符。

例如grammar:

我想去北京’,’那里的天气怎么样 

匹配语料:

我想去北京,那里的天气怎么样

注意:一般情况下,推荐语法里不写标点。一定要写建议写成可选,即用“[]”括起来(可选规则将在第四点具体讲到)。如: 

<grammar>:打开[,]电视[。] 

那么,什么情况下需要用到标点呢?

比如说,如下示例:

<singer>:ext.(1|5)

<song>:ext.(1|10)

<singersong1>:<singer><song>

当输入语料“刘德华,忘情水”时,slot提取值很可能是:

slot: singer=刘德华,忘

slot: song=情水

这时候我们就可以对grammar进行一下修改,加上标点:

<singersong2>:<singer>’,’<song>

当语料输入的时候,能够正确提取值:

slot: singer=刘德华

slot: song=忘情水


三、 Choice(OR 逻辑描述)

choice 规则操作符为“|”,它是一个表示选择关系的语法运算符。choice 规则的撰写方式如下示例:

pattern1|pattern2|pattern3…… 

| 符号代表 OR 运算符,即 “或是” 之意,表示 | 左右两边的语法描述句是一种选择关系,例如 “A|B” 的逻辑概念可被解读为 “A 或是 B”。

因此,在rule以及grammar中我们可以这样使用:

Rule: 

<零食>:薯条|薯片|辣条 

<烧烤>:烤串|炸鸡|烤生蚝


Grammar: 

你想吃(<零食>|<烧烤>)吗

在一般情况下,OSL 语法描述句中的 ( ) 代表一个群组(group)具有较高的优先级,而 choice操作符“|”具有最低的优先级。 

Grammar:

你是谁|你叫什么名字

Grammar:

你喜欢吃(苹果|桃子|梨)吗

第一条grammar中,“你是谁”和“你叫什么名字”是并列选择的关系,而第二条grammar中优先将“苹果|桃子|梨”分成群组,所以并列的内容为“苹果”、“桃子”、“梨”。


四、 Optional(可选描述)

Optional规则主要是运用“[]”符号表示内容是可选的,“[]”里的内容可以是任何符合语法规则的语法。 

optional 规则的撰写方式如下示例:

[pattern]

 [ ] 符号代表其所包覆的内容是可选的,表示任何被 [ ] 符号所包覆的描述句在语法匹配规则中是可被忽略的描述。

我们来看两个例句:

示例一:

Grammar:

今天非常[得]热 


匹配语料:

今天非常热 

今天非常得热 

示例二:

Rule:

<woyao>:我要|我想要 

Grammar: 

<woyaoxieyufa>:[<woyao>]写语法


匹配语料:

我要写语法 

我想要写语法 

写语法 


五、 Repeater(循环描述)

Repeater即循环规则,类似于正则表达式中的*和+操作符。其撰写方法如下:

Pattern*

Pattern+

* 或 + 符号代表 repeater 操作字符,其中:

使用 * 符号,例如 pattern* ,表示自动延伸匹配 0 次到任意次。

使用 + 符号,例如 pattern+ ,表示自动延伸匹配任意次,但至少要能匹配到 1 次。

我们通过如下示例可以更加清晰地了解这俩个符号的区别:

示例一:

语料:

今天天气真好 

今天天气真好啊 

今天天气真好啊啊 

……


Grammar:

今天天气真好啊* 

示例二:

语料:

今天天气真好啊 

今天天气真好啊啊 

今天天气真好啊啊啊 

……


Grammar:

今天天气真好啊+ 

示例三:

语料:

今天天气真好 

今天天气真好呀 

今天天气真好啊啊 

今天天气真好哈哈哈 

……


Rule: 

<语气词>:呀|啊|哈 

Grammar:

今天天气真好<语气词>*


六、 任意匹配规则

若希望匹配任意字符串但不作为语义输出时,OSL 语法描述语言提供了 “任意匹配规则”。 

任意匹配规则有两种表达形式:指定类型任意匹配、不指定类型任意匹配。

1、指定类型任意匹配

类型与描述式  说明 
<!datetime>  匹配任意时间
<!number>  匹配任意整数数值 
<!float>  匹配任意浮点数值 

示例一:

<买n个苹果>: 

买了<!number>个苹果<{@=buy_apple}> 

那么无论语料是“买了1个苹果”或者“买了5个苹果”,我们的grammar都能匹配上。

2、不指定类型任意匹配

OSL 语法描述语言提供一个 <any> 标示,用于匹配不指定的任意字符串。并且可以对它进行字符的限制。

 <any>

<any:min-length|max-length>

例如您希望匹配 “我想听XXX歌曲” 的说法,其中 “XXX” 要能匹配任意词汇,例如:“我想听流行歌曲”、“我想听王菲的歌曲”,示例如下: 

我想听<any>歌曲 

当我们给<any>加上字符限定:

我想听<any:1|5>歌曲

该描述句可以匹配 “我想听王菲的音乐”,但无法匹配 “我想听王菲刚出道时的音乐”,因为超过指定的字数限制。

any 标示仅用于匹配,但不能提取匹配后的信息,主要应用于匹配语料但不在意其所对应的内容究竟为何的情况下。若您希望在匹配结果中获取这些任意字符时,则可以使用 ext 类型的 slot 来实现。


七、 特殊字符的使用方式

特殊字符分为三类:英文字符、空格与标点符号、skipper 

1、 英文字符

  • 攥写语法描述句时不必区分大写、小写、全形(全角)、半形(半角),任何大写、小写、全形(全角)、半形(半角)所组合的前端输入文本都能被自动匹配。

  • slot 赋值的描述式除外,必须区分大写、小写、全形(全角)、半形(半角)。

  • 语义输出结果、slot 取值结果,都会与前端输入文本的大写、小写、全形(全角)、半形(半角)组合保持一致。

示例1:

Hi 欧拉蜜

这个语法描述句可以匹配包括 “hi 欧拉蜜”、“hI 欧拉蜜”、“Hi 欧拉蜜”、“HI 欧拉蜜”、“hi 欧拉蜜”、“Hi 欧拉蜜”、“hi 欧拉蜜”、“HI 欧拉蜜” 在内等大写、小写、全形(全角)、半形(半角)文本组合。

示例2:

Slot:

<olami_slot>,类型internal 

Grammar:

我喜欢<olami_slot> 

在这个示例中,当输入的语料为“我喜欢olAmI”,我们slot的赋值是区分大小写的,即为“olAmI”。

2、 空格与标点符号

要匹配的目标例句语料中的空格与标点符号(如 ,、? 等等…),在与语法描述句匹配时并不会区分大写、小写、全形(全角)、半形(半角)。

若要在语法描述句中使用标点符号或空格,会建议您使用以下三种撰写模式:

直接使用全形符号:

• 匹配单个,例如:,

• 匹配多个,例如: ,|?|。


以两个单引号包覆:

• 匹配单个,例如:','

• 匹配多个,例如:','|'?'|'?'


以两个双引号包覆:

• 匹配单个,例如:","

• 匹配多个: ","|","|"?"|"?"

您可以依据您的习惯或需求来撰写带有标点符号的语法描述句,除非您对前端的文本输入格式有特定的要求,否则在一般情况下,会建议您采用以下方案:

  • 不需要在语法描述句中加上标点符号或空格。

  • 直接使用全形符号。

详情也可以参考 Literal 的说明章节。

3、 skipper

skipper 是 OSL 语法描述语言中的内置规则,您无需特别在语法描述句中引用,skipper 目的在于忽略前端输入的文本语料中的标点符号,因此,在一般情况下您也不需要在语法描述句中加入标点符号。

示例:

打开电视

当若前端输入的例句语料为 “打开电视。”或者“!!!打开电视”或者“打开电视!!!”时,句头及句尾的符号会自动被忽略,能被匹配。

但是,位于语料中间的标点符号,只有在语法的规则与规则之间才能被忽略。

我们来看如下示例1:

<woyaoqubeijing>:我要去北京

此时,语料“我要,去北京”不能与之匹配。

示例2:

Rule:<woyao>:我要|我想要

Grammar:<woyaoxieyufa>:[<woyao>]写语法

此时,语料“我要,写语法”能够与之匹配,而“我,要写语法”不能匹配上。

目前 skipper 规则支持大多数常用符号,具体的标点符号列表可在“欧拉蜜开放平台官网文档中心—osl语法描述语言—语法描述规则”栏查阅。


那么本节课的内容就全部介绍完毕了,感谢您的观看!

Copyright © 2017 威盛电子股份有限公司. All rights reserved   |   意见反馈