基本認(rèn)知
曾經(jīng)我認(rèn)為Rasa_NLU是一個(gè)意圖識(shí)別工具株憾,如今我意識(shí)到并不是操漠,Rasa_NLU只是一個(gè)自然語(yǔ)言理解(NLU:Natural Language Understanding的一個(gè)框架干发,它本身并不做任何識(shí)別的工作,真正的訓(xùn)練與識(shí)別工作是交由框架管理的各個(gè)組件來(lái)完成的殃姓。
Rasa_NLU框架的主要工作是:
- 組件管理
- 訓(xùn)練數(shù)據(jù)管理
- 模型管理
- 提供Http服務(wù)
大體結(jié)構(gòu)圖如下:
組件管理
前面說(shuō)過(guò)翔冀,Rasa NLU框架是通過(guò)管理的組件完成意圖識(shí)別的导街。而這個(gè)識(shí)別的過(guò)程并不是一步到位的披泪,需要多個(gè)組件的分工合作來(lái)完成纤子。組件之間就如同流水線作業(yè)一樣,每個(gè)組件處理加工輸入數(shù)據(jù)并輸出處理結(jié)果供其它組件使用或者是作為最終輸出款票。這樣控硼,可以為每個(gè)步驟提供不同的處理方式。
在介紹組件的管理之前艾少,先大概了解一下組件的類型及各個(gè)類型的工作職責(zé)卡乾,以便大致了解意圖識(shí)別的工作流程。組件的類型分為五類:
- 初始化組件:作用是初始化其它組件工作所需的內(nèi)容缚够。代碼放在utils目錄下幔妨。目前包含了mitie_util與spacy_util兩個(gè)。
- 分詞組件(tokenizer):作用是將輸入的句子切分成一個(gè)個(gè)單獨(dú)的詞谍椅。
- 實(shí)體提取組件(extractor):作用是根據(jù)切分好的詞提取設(shè)定的關(guān)鍵詞误堡。
- 特征提取組件(featurizer):作用是根據(jù)切分好的詞提取句子的特征。
- 意圖識(shí)別組件(classifier):作用是根據(jù)提取出來(lái)的特征識(shí)別意圖雏吭。
框架將組件的配置存放在一個(gè)yml文件中锁施,示例:
pipeline:
- name: "nlp_mitie"
model: "data/total_word_feature_extractor_zh.dat"
- name: "tokenizer_jieba"
- name: "ner_mitie"
- name: "ner_synonyms"
- name: "intent_entity_featurizer_regex"
- name: "intent_featurizer_mitie"
- name: "intent_classifier_sklearn"
首先通過(guò)config加載配置文件,然后通過(guò)registry查找配置文件中組件名對(duì)應(yīng)的組件杖们,然后根據(jù)配置文件中每個(gè)組件指定的參數(shù)悉抵,初始化各個(gè)組件。
訓(xùn)練數(shù)據(jù)管理
訓(xùn)練數(shù)據(jù)的組織形式有兩種:?jiǎn)蝹€(gè)文件或者是一個(gè)目錄摘完。
如果是一個(gè)目錄時(shí)姥饰,該框架會(huì)自動(dòng)加載這個(gè)目錄下的全部文件數(shù)據(jù),并進(jìn)行合并孝治。在訓(xùn)練數(shù)據(jù)比較多時(shí)媳否,非常有利于訓(xùn)練數(shù)據(jù)的管理。
訓(xùn)練數(shù)據(jù)的格式也有兩種:JSON格式或者是Markdown格式荆秦。
JSON格式需要標(biāo)記實(shí)體在句子中的位置篱竭,而且比較繁瑣。因此個(gè)人比較喜歡使用Markdown格式步绸。
/*** JSON 格式 ***/
{
"text": "show me chinese restaurants",
"intent": "restaurant_search",
"entities": [
{
"start": 8,
"end": 15,
"value": "chinese",
"entity": "cuisine"
}
]
}
/*** Markdown 格式 ***/
## intent:restaurant_search
- show me [chinese](cuisine) restaurant
顯然掺逼,Markdown格式比JSON格式要更清晰明了,也更容易標(biāo)記瓤介。如果已經(jīng)有了很多的JSON數(shù)據(jù)或者是只想保存JSON數(shù)據(jù)也沒(méi)有關(guān)系吕喘,框架還提供了convert可以輕松將JSON格式與Markdown格式互相轉(zhuǎn)換赘那。
訓(xùn)練數(shù)據(jù)的類型有四種:
- 意圖(intent): 意圖就是普通的訓(xùn)練數(shù)據(jù),用于標(biāo)記句子意圖與句子中包含的實(shí)體氯质。
- 同義詞(synonym): 同義詞的作用是在實(shí)體被提取出來(lái)后募舟,轉(zhuǎn)化為統(tǒng)一的詞敌土,以便于后續(xù)的處理锉试。
- 正則表達(dá)式(regex): 正則表達(dá)式的作用是對(duì)于句子的,而不是實(shí)體绎秒,用于提供句子特征辕漂,以便于意圖的識(shí)別呢灶。
- 查找表(lookup): 在框架的處理中會(huì)被理成一個(gè)大的正則表達(dá)式。
/*** JSON 格式 ***/
{
"rasa_nlu_data": {
"common_examples": [
{
"text": "hey",
"intent": "greet"
},
{
"text": "hello",
"intent": "greet"
}
],
"entity_synonyms": [
{
"value": "savings",
"synonyms": ["pink pig"]
}
],
"regex_features" : [
{
"name": "zipcode",
"pattern": "[0-9]{5}"
}
],
"lookup_tables" : [
{
"name": "currencies",
"elements": ["Yen", "USD", "Euro"]
},
{
"name": "additional_currencies",
"elements": "path/to/currencies.txt"
}
]
}
}
/*** Markdown 格式 ***/
## intent:greet
- hey
- hello
## synonym:savings
- pink pig
## regex:zipcode
- [0-9]{5}
## lookup:currencies
- Yen
- USD
- Euro
## lookup:additional_currencies
path/to/currencies.txt
訓(xùn)練數(shù)據(jù)的加載
在框架源代碼中钉嘹,所有訓(xùn)練數(shù)據(jù)的處理代碼放在training_data包中鸯乃。通過(guò)包中的longing模塊加載目錄或文件中的各種格式的訓(xùn)練數(shù)據(jù)。然后實(shí)例化各訓(xùn)練數(shù)據(jù)結(jié)構(gòu)跋涣,以待各組件訓(xùn)練模型時(shí)使用缨睡。
模型管理
模型的結(jié)構(gòu)
在Rasa_NLU中有工程和模型的概念,換個(gè)說(shuō)法就是Rasa_NLU框架可以同時(shí)管理多個(gè)工程與模型陈辱。其結(jié)構(gòu)是模型的存儲(chǔ)目錄下可以有多個(gè)工程奖年,每個(gè)工程下又可以有多個(gè)模型。
模型的訓(xùn)練與存儲(chǔ)
在訓(xùn)練時(shí)性置,model模塊中的Trainer使用Pipeline中指定并通過(guò)config模塊加載完成的組件訓(xùn)練轉(zhuǎn)換完成的訓(xùn)練的數(shù)據(jù)拾并,然后通過(guò)persistor模塊將模型持久化。
persistor模塊中默認(rèn)存儲(chǔ)器可以將模型持久化到本地目錄鹏浅,同時(shí)還提供了一些可將模型持久化到云服務(wù)中的存儲(chǔ)器嗅义。
持久化的過(guò)程是初始化存儲(chǔ)器及模型路徑。如果沒(méi)有指定工程及模型隐砸,模型將會(huì)被存儲(chǔ)在default工程下的一個(gè)由框架生成的模型中之碗,模型名為當(dāng)前時(shí)間。然后季希,再依次調(diào)用各個(gè)組件褪那,將各個(gè)組件中的模型數(shù)據(jù)持久化。最后將Pipeline持久化到指定模型的Metadata.json中式塌。
模型的加載與使用
在訓(xùn)練完成并持久化存儲(chǔ)后博敬,可以通過(guò)加載這個(gè)模型用來(lái)提取句子的意圖及包含的實(shí)體。前面有說(shuō)到該框架有工程與模型的概念峰尝,對(duì)應(yīng)的偏窝,在代碼中也有相關(guān)的管理代碼。通過(guò)project來(lái)加載工程,model來(lái)加載模型祭往。主要邏輯包含了默認(rèn)模型的加載伦意,default工程下最新訓(xùn)練的模型,指定工程與模型的加載硼补、以及加載遠(yuǎn)程云服務(wù)中存儲(chǔ)的模型等驮肉。
提供Http服務(wù)
Rasa_NLU框架還可以直接啟動(dòng)一個(gè)Web Service服務(wù),以便于遠(yuǎn)程訪問(wèn)已骇。服務(wù)提供了模型的訓(xùn)練离钝、句子意圖的分析、模型的評(píng)估等基本功能疾捍,還提供了模型的加載奈辰、卸載栏妖、服務(wù)狀態(tài)等功能乱豆。
框架通過(guò)server模塊啟動(dòng)服務(wù)并接收http請(qǐng)求,然后再使用data_router模塊分發(fā)使用各個(gè)功能模塊吊趾,執(zhí)行請(qǐng)求的操作宛裕。
框架還通過(guò)在data_router中組合emulator,通過(guò)各emulator的實(shí)現(xiàn)格式化服務(wù)輸出結(jié)過(guò)的格式论泛。