影片教學 > OSL語法描述語言

語法描述規則

olami     2017-08-17 16:42

大家好,歡迎觀看OLAMI開放平台系列課程。

今天這節課將為大家介紹 OSL 語法描述語言的語法描述規則。


我們主要將通過這些規則在 Rule、Grammar 等語法元素中的運用來為大家講解。

一共有7條規則。


一、 Sequence 規則(寫作順序)

Sequence 規則規定了OSL語法描述語言中的描述句是從左到右的順序關係。

例如,「pattern」代表任何符合OSL語法描述語言規則的語法描述句,那我們的寫作方式也是從左到右依序寫上「pattern1pattern2pattern3……」。

正如這裡的兩個範例:

Grammar:
<我喜歡OLAMI>:我喜歡歐拉蜜

Rule:
<olami>:olami|歐拉蜜|你

Grammar:
<我愛OLAMI>:我愛<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:

<woyaoqugaoxiong>:我要去高雄


此時,語料「我要,去高雄」不能與之匹配。


範例2:

Rule:<woyao>:我要|我想要
Grammar:<woyaoxieyufa>:[<woyao>]寫語法


此時,語料「我要,寫語法」能夠與之匹配,而「我,要寫語法」不能匹配上。

目前 Skipper 規則支持大多數常用符號,詳細的標點符號列表可在OLAMI開放平台官網上的「線上說明文件 → OSL語法描述語言 → 語法描述規則」進行查閱。


那麼本節課的內容就全部介紹完畢了,感謝您的觀看!


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