以下是视频内容文字版:
大家好,欢迎观看欧拉蜜开放平台系列教程视频。今天这节课将为大家介绍 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语法描述语言—语法描述规则”栏查阅。
那么本节课的内容就全部介绍完毕了,感谢您的观看!