文章目錄
1. 數據格式
NLU模塊的訓練可以使用 Markdown 或 JSON格式的數據。可以是單個文件也可以是某個目錄下的多個文件。推薦使用Markdown格式~用起來簡單。
1.1 Markdown格式
作爲Rasa NLU的一種格式,Markdown最易於閱讀和書寫。NLU中的examples以無序列表語法的形式給出,如-,*,+
。examples 通過 intent 進行組合,實體和實體的名字通過 markdown 的鏈接形式給出,如[entity](entity name)。下面給出一個NLU數據集的Markdown實例:
- what is my balance <!-- no entity -->
- how much do I have on my [savings](source_account) <!-- entity "source_account" has value "savings" -->
- how much do I have on my [savings account](source_account:savings) <!-- synonyms, method 1-->
- Could I pay in [yen](currency)? <!-- entity matched by lookup table -->
## intent:greet
- hey
- hello
## synonym:savings <!-- synonyms, method 2 -->
- pink pig
## regex:zipcode
- [0-9]{5}
## lookup:additional_currencies <!-- specify lookup tables in an external file -->
path/to/currencies.txt
Rasa NLU 數據集可以結構化爲4個部分:
- 常見示例(common example)
- 同義詞(synonyms)
- 正則化特徵(regex features)
- 查找表(lookup tables)
雖然常見示例是唯一必填部分,但是其他部分有助於減少訓練NLU模型所需要的例子,並提升NLU模型預測的置信度。
同義詞可以將提取出來的實體映射到同一個名字,如例子中將"savings account" 映射爲"savings"。但是,這個僅僅發生在實體被提取出來之後,因此需要提供含有同義詞表述的實例,使得Rasa能夠通過學習將實體提取出來。
查找表Lookup tables 可以以純文本txt文件的形式提供,並以newline分隔words或者phrases。當加載訓練數據的時,這些文件生成大小寫不敏感的正則化模式,並添加到正則化特徵。
注意:
常見示例、正則表達式特性和查找表僅僅爲最終NLU模型提供線索,並通過在訓練期間爲機器學習算法提供額外的特性。因此,不能假設只有一個單一的例子就足以讓模型足夠魯棒性地識別例子所有變體中的意圖和/或實體。
另外,需要注意的是/
符號是被保留的分隔符,將檢索意圖與響應文本標識符分隔開。確保不要在意圖名中使用該符號。
1.2 Json 格式
Json格式由top level對象rasa_nlu_data
所包含,對應的keys有:common_examples
(最爲重要), entity_synonyms
和regex_features
。具體示例如下:
{
"rasa_nlu_data": {
"common_examples": [],
"regex_features" : [],
"lookup_tables" : [],
"entity_synonyms": []
}
}
common_examples
中的數據用以訓練NLU模型。與Markdown格式一樣Regex features
用以輔助意圖和實體分類。
2. 改善意圖分類和實體識別
2.1 常見示例(Common Examples)
常見示例common examples主要由三個部分組成:text,intent,entities。前兩個是字符串,最後一個是數組。
- text是用戶消息,必填
- intent是text對應的意圖,選填
- entities是text中需要被標識出來的部分,選填
Entities帶有start
開始和end
結束值,組成python格式的範圍選擇,比如text=“show me chinese restaurants”,那麼text[8:15]==‘chinese’。實體可以跨多個單詞,實際上,value
屬性不必與example中的子串準確對應。如此可以映射同義詞,或誤拼寫的詞,到相同的一個value
。
## intent:restaurant_search
- show me [chinese](cuisine) restaurants
2.2 正則特徵(Regular Expression Features)
正則表達式有助於意圖分類和實體提取。舉個例子,如果你的實體具有固定的結構(如郵編,或email地址),那麼可以使用正則表達式提取這些實體。如郵編可以用下面的表達式:
## regex:zipcode
- [0-9]{5}
## regex:greet
- hey[^\\s]*
這個名字並沒有定義實體或意圖,這個僅僅是用戶可讀的描述,僅僅用以區分對應的正則表達式。正如上面的例子中,可以使用正則化特徵提高意圖分類的性能。
儘量的使用更加緊縮的匹配形式,如使用hey[^\s]*
替換hey.*
。由於後一個表達式會匹配到更多無效的信息。正則特徵目前僅支持CRFEntityExtractor
組件。其他的實體提取器,類似MitieEntityExtractor
或SpacyEntityExtractor
當前並不能使用正則特徵。當前,所有的意圖分類器可以使用所有的正則特徵。
注意:
正則特徵並沒有定義實體或意圖。他們僅僅提供了模式用來幫助分類器識別實體和相關的意圖。因此,還是需要提供意圖和實體的例子。
2.3 查找表(lookup tables)
查找表可以包括在訓練數據中。外部提供的數據必須要以newline進行分隔。比如data/test/lookup_tables/plates.txt
可以包含:
tacos
beef
mapo tofu
burrito
lettuce wrap
對該查找表的加載如下:
## lookup:plates
data/test/lookup_tables/plates.txt
當在訓練數據中提供查找表時,內容被組合成一個大型、不區分大小寫的regex模式,該模式在訓練示例中查找精確匹配。這些正則表達式匹配多個token,所以如lettuce wrap
在句子get me a lettuce wrap ASAP
中將會匹配出[0 0 0 1 1 0]
。這些正則表達式的處理與訓練數據中直接指定的正則表達式模式相同。
利用list的實現是:
## lookup:plates
- tacos
- beef
- mapo tofu
- burrito
- lettuce wrap
注意:
爲了查找表能夠有效的被使用,訓練數據中必須要有一些示例被匹配上。否則,模型不會使用查找表特徵。
警告:
往查找表中添加數據時候要謹慎。如果查找表中存在錯的正例或其他噪聲,會損害性能。因此,確保查找表中的數據都是乾淨的。
3. 標準化數據
3.1 實體同義詞
如果定義的實體具有相同的名字,那麼他們會被解析成同義詞。如下:
## intent:search
- in the center of [NYC](city:New York City)
- in the center of [New York City](city)
正如上面所述,在兩個例子中,city
的值是New York City
。 儘管第一個例子中的text的值是NYC。將value
屬性定義爲實體的start和end索引之間的文本,從而實現同義詞定義。無論相同的text被找到,這個值還是會使用同義詞替代消息中確切的文本。
爲了在訓練數據中使用同義詞,需要pipeline中包含EntitySynonmMapper
組件。見Components。
另一種的同義詞的定義方式如下:
## synonym:New York City
- NYC
- nyc
- the big apple
注意:
同義詞的添加,並不會提高模型對實體的識別能力。實體必須在使用同義詞替換之前識別出來。
4. 生成更多實體例子
有一些工具可以輔助生成大量的實體示例。如,Chatito。但是,人造示例,可能會出導致過擬合,更好的方式是使用查找表,而不是大量的實體值。