在rasa對(duì)話系統(tǒng)踩坑記(二)中我自定義過兩個(gè)component組件雀摘。也好久沒更新采坑系列了糊秆,隨著項(xiàng)目的進(jìn)展迭代最近又新增了兩個(gè)component組件舟奠,所以更新下系列文章输枯。
rasa_nlu_gao自定義component
entity_edit_intent
entity_edit_intent這個(gè)組件比較簡(jiǎn)單刮萌,寫它的目的是因?yàn)榕龅搅诉@樣一個(gè)問題嚼贡。就是在nlu過程中熏纯,slot filling倒是很準(zhǔn)確,但是intent一直識(shí)別不出來都是None.所以起初第一個(gè)想到的方案就是根據(jù)entity來修改intent粤策。代碼大概的思路就是在最后樟澜,在entity識(shí)別的情況下,如果intent沒有識(shí)別出來就強(qiáng)制修改意圖掐场。
defaults = {
"entity": ["nr"],
"intent": ["enter_data"],
"min_confidence": 0
}
def __init__(self, component_config=None):
super(EntityEditIntent, self).__init__(component_config)
def process(self, message, **kwargs):
# type: (Message, **Any) -> None
last_entities = message.get("entities", [])
last_intent = message.get("intent", {})
if last_intent["confidence"] <= self.component_config["min_confidence"]:
for item in last_entities:
if item["entity"] in self.component_config["entity"]:
entity_index = self.component_config["entity"].index(item["entity"])
intent_name = self.component_config["intent"][entity_index]
intent = {"name": intent_name, "confidence": 1.0}
message.set("intent", intent, add_to_output=True)
上面就是代碼實(shí)現(xiàn)往扔,很簡(jiǎn)單贩猎,主要配置文件就是entity、intent和min_confidence萍膛,如果confidence <= min_confidence
就會(huì)根據(jù)entity來修改intent吭服,一一對(duì)應(yīng)的關(guān)系,具體的yml配置示例如下:
- name: "entity_edit_intent"
entity: ["nr", "phone_number"]
intent: ["enter_data", "enter_data"]
min_confidence: 0
intent_featurizer_wordvector
正如上面說的蝗罗,entity_edit_intent這個(gè)組件是強(qiáng)制修改intent艇棕,所以慎用。后面我就在思考如何更好的改善intent的識(shí)別問題串塑。翻看rasa-nlu的源碼沼琉,從中找到了intent為什么不是很理想的原因。在官方的component和例子中桩匪,在做intent_classifier_tensorflow_embedding識(shí)別前的word featurizer的時(shí)候打瘪,官方用的是word-of-bag做的詞嵌入,只是單純的考慮了詞頻傻昙,沒有考慮到詞義而且還有one-hot的通病稀疏矩陣的問題闺骚。所以很快想到了詞向量來替換詞袋法做詞嵌入。
所以在intent_featurizer_wordvector這個(gè)組件中妆档,我嘗試并實(shí)現(xiàn)了2種詞向量的方法(準(zhǔn)確的說是兩類)僻爽,既可以做word2vec、glove贾惦、fasttext這一類pre-trained的詞向量胸梆,也可以實(shí)現(xiàn)現(xiàn)階段比較火的elmo詞向量,具體的區(qū)別這里不詳細(xì)講了须板,就是elmo會(huì)根據(jù)雙向神經(jīng)網(wǎng)絡(luò)模型動(dòng)態(tài)計(jì)算詞向量碰镜,而原始的是已經(jīng)訓(xùn)練好的詞向量直接lookup。然后這里我單純展示具體的配置和用法习瑰。word2vec的yml配置如下:
- name: "intent_featurizer_wordvector"
vector: "data/2000000-small.txt"
limit: 50000
需要有已經(jīng)訓(xùn)練好的word2vec或者glove格式的提前訓(xùn)練好的詞向量文本洋措,這里的limit是限制詞向量的大小的,詞向量是從高頻到低頻排序杰刽,如果詞向量太大比如騰訊開源的有14G菠发,我們就很難使用,所以這里會(huì)限制只取前面一定數(shù)量的高頻詞匯贺嫂。elmo的yml配置如下:
- name: "intent_featurizer_wordvector"
elmo: "data/xinhua_elmo_trained_model/"
elmo的配置需要pre_trained的網(wǎng)絡(luò)模型滓鸠,這里用的是哈工大預(yù)訓(xùn)練的ELMoForManyLangs模型,elmo的訓(xùn)練也是十分消耗硬件的第喳,我還沒有自己訓(xùn)練糜俗。
總結(jié)
隨著項(xiàng)目的不斷改善,需要不斷地自定義一些項(xiàng)目需要的rasa-nlu component組件。其實(shí)rasa-nlu更多地我看成是一個(gè)框架悠抹,至于里面的模型我們可以自己填充珠月。所以歡迎大家使用rasa-nlu-gao
,直接pip install rasa-nlu-gao
現(xiàn)在已經(jīng)更新到0.1.5版本楔敌,也希望大家能夠往里貢獻(xiàn)自定義組件啤挎。原創(chuàng)文章,轉(zhuǎn)載請(qǐng)說明出處