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

OSL檔案的撰寫

olami     2017-08-31 10:00


大家好,這節課要介紹的內容是 OSL 文本文件的撰寫。

我會從以下這兩個部分來撰寫:

一、OSL 檔案宣告的撰寫規則

1、意圖宣告  

2、Slot 宣告  

3、Modifier 宣告  

4、Grammar 宣告

二、OSL 檔案定義的撰寫規則

1、定義 Rule

2、定義 Grammar

3、定義語料

4、定義 Template

5、定義答案

一、OSL 檔案宣告的撰寫規則

1、意圖宣告

意圖宣告是必要內容,它用來定義模組的名稱,以「 !intention」作為開頭,且必須宣告在 Modifier 宣告和 Grammar 宣告之前,寫作:

!intention intention-name;
注意:「intention-name」指的是模組的名稱。

可以看下面的例子:比如,我們這個模組的名稱是「weather」,那麼就這樣寫:

!intention <weather>;


2、Slot 宣告

Slot 宣告是非必要,也就是說如果模組中沒有使用 Slot 的話,可以不添加宣告。

 Slot 宣告以「!Slot」  作為開頭,而且必須指定數據類型,可以這樣寫:

!Slot <Slot-name:Slot-type>;

在這裡,「Slot-name」 指的是 Slot 的名稱,「Slot-type」就是 Slot 的類型,在宣告 Slot 的時候也可以同時指定長度限制,可以這樣寫:

!Slot <Slot-name:Slot-type(min-length|max-length)>;

在這裡「min-length」 和「 max-length」 限定了 Slot 可以匹配的字符串的長度範圍,它的值必須是正整數,而且 「max-length」 數值必須大於等於「min-length」 ,如果我們的宣告裡沒有指定具體的值的話,就默認值 「min-length=1」、「max-length=1024」。

例:

Slot 名稱:city    類型:ext
Slot的宣告為:!Slot <city:ext>;
如果需要指定最長最短字符數,比如2到12:!Slot <city:ext(2|12)>

因為 Slot 的類型有很多,在這裡列了一個表格,把不同類型的 Slot 宣告格式都寫了下來,我們一起來看一下。

Slot 類型

宣告格式示範

說明

internal

!slot <slot-name:internal>;

如果需要引用此 Slot,需定義一個同名的 Rule 來列舉  slot 的值

ext

!slot <slot-name:ext>;

匹配長度在 1 到 1024 字元的 ext Slot,但不建議使用

!slot <slot-name:ext(min-length|max-length)>; 匹配長度在 min-length 到 max-length 的 ext Slot

numbe

!slot <slot-name:number>;


float !slot <slot-name:float>;

datetime

!slot <slot-name:datetime>;

時間類型,匹配各種時間說法

!slot <slotname:datetime.timepoint>; 時間類型,匹配確切的時間點

!slot <slot-name:datetime.duration>;

時間類型,匹配確切的時段,包括重複的時間

3、Modifier 宣告

Modifier 宣告是非必要,以「 !Modifier」 作為開頭,撰寫格式如下:

!Modifier <intention-or-Slot-name>:Modifier1|Modifier2|Modifier3|...;

在這裡,「intention-or-Slot-name 」表示模組名稱或者 Slot 名稱。

當宣告中使用模組名稱時,表示這是一個 global Modifier

當宣告中使用 Slot 名稱時,表示這是一個 Slot Modifier

看下面的例子:

名稱為 「weather」 的模組,global Modifier 宣告的撰寫方式如下:
!Modifier <weather>:query|最高溫|最低溫;

名稱為 「city」 的 Slot,Slot Modifier 宣告的撰寫方式如下:

!Modifier <city>:Chinese;


4、Grammar 宣告

撰寫格式如下:

<intention-name>:<Grammar1>|<Grammar2>|<Grammar3>|...;

「intention-name」 表示模組名稱,Grammar1、Grammar2、Grammar3 是相應的 Grammar 名稱。

例如,在名稱為 「weather」 的模組裡,有兩個名稱分別為 「query1」、「query2」 的 Grammar,,那麼宣告的示範如下:

<weather>:<query1>|<query2>;

在這裡要提醒大家幾點:

  1. 所有的 Grammar 都必須先宣告,如果定義 Grammar 之前沒有宣告就會被認為是 Rule;
  2. Grammar 宣告不需要以 ! 字符開頭,直接以模組名稱作宣告;
  3. 宣告多個 Grammar 用「| 」 隔開。


二、OSL 文件定義的撰寫規則

需要定義的基本對象是 Rule、Template、Grammar,主要內容是命名和語法描述句內容。

1、定義 Rule

在 OSL 文件裡定義 Rule 的規則是這樣的:

<Rule-name>:pattern;

「 Rule-name」表示 Rule 的名稱,「pattern」即是一般的 OSL 語法描述句,也就是 Rule 的內容。

例,在 OSL 文件中定義名稱為 「like」 的 Rule 就這麼寫:

<like >:喜歡|喜愛;


2、定義 Grammar

定義 Grammar 的規則也類似:

<Grammar-name>:pattern;

例:在 OSL 文件中定義名稱為 「tingge 」 的 Grammar :

< tingge >:我要聽<singer><{singer@=itissinger}>的歌<{@=music}>;


3、定義語料

  1. 方式:以 //*C: 作為開頭。
  2. 每一個 Grammar 必須定義至少一個例句語料,而且語料必須和 Grammar 匹配。
  3. 例句語料必須定義在相應的 Grammar 定義之前(即 Grammar 定義描述的上一行)。
  4. 可以定義多個例句語料,但每一行只能定義一個。

撰寫格式如下:

//*C:content1
//*C:content2
//*C:content3
<Grammar-name>:pattern;

例如,在 OSL 文件中,替名稱為 「tingge」 的 Grammar 定義一個例句語料的示範:

//*C:我要聽蔡依林的歌
//*C:我要聽周杰倫的歌
<tingge>:我要聽<singer><{singer@=itissinger}>的歌<{@=music}>

需要注意的是,我們定義的語料必須被某一個 Grammar 所匹配,而且 Grammar 的權重必須大於等於匹配整個 OSL 文件裡其他 Grammar 的權重。

也就是說這句語料只能被這一條 Grammar 匹配。

看下面的例子:

例:

//*C:吃蘋果
<Grammar_apple>:吃<ext_Slot_apple>;
//*C:吃香蕉
<Grammar_bannana>:吃(香蕉|蘋果);

由於 「吃蘋果」 這句語料也能被名稱為 「Grammar-bannana」 的 Grammar 所成功匹配,且匹配的權重比 「Grammar-apple 」更高,因此提交時系統便會提示發生錯誤。


4、定義 Template

在 OSL 文件中定義 Template 的規則如下示範:

<Template-name:Template>:content;

示範中 「Template-name」 表示 Template 的名稱,「:Template」是特殊保留字,用來表達這個定義的內容是一個 Template,「content」 即為 Template 的內容描述。

可以看下面的例子:

<動詞_重複:Template>:[=動詞=]$(動詞)[一]$(動詞)|$(動詞)[[一]下];
< _幫忙_動詞性短語:Template>: [=動詞性短語=][請][幫]我$(動詞性短語);

在這裡還要注意兩點:

  1. 定義 Template 的時候如果沒有寫特殊保留字「:Template」,直接寫:<動詞_重複>:[=動詞=]$(動詞)[一]$(動詞)|$(動詞)[[一]下];會提交失敗
  2. 句末的分號不能忘記


5、定義答案

規則:以 //*A: 作為開頭。答案必須定義在相應的 Grammar 定義之前(即 Grammar 定義描述的上一行)。可以定義多個答案,但每一行只能定義一個, Grammar 可以沒有答案。

撰寫格式如下:

//*A:answer1
//*A:answer2
//*A:answer3

<Grammar-name>:pattern;

例:

在 OSL 文件中,替名稱為 「query_time」 的 Grammar 定義一個答案的舉例:

//*C:現在幾點
//*A:現在是<time>
<query_time>:現在幾點;

定義多個答案的時候:

//*C:現在幾點
//*A:<time>
//*A:現在是<time>
<query_time>:現在幾點;


以上這些就是這節課的全部內容,感謝大家觀看,我們下節課再見。



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