【轉載】基於rasa的對話系統搭建(上)
文章介紹使用rasa nlu和 rasa core 實現一個電信領域對話系統demo,實現簡單的業務查詢辦理功能,更完善的實現需要進一步數據的收集。demo基於玩具數據集,可以達到下面的效果:
Bot loaded. Type a message and press enter :
YOU:你是誰
BOT:您好!,我是機器人小熱,很高興為您服務。
YOU:我想看一下消費情況
BOT:您想查詢哪個月的消費?
YOU:十月份的
BOT:好,請稍等
BOT:您好,您十月份共消費二十八元。
YOU:好謝謝
BOT:您開心我就開心
BOT:您還想幹什麽
YOU:沒什麽了
BOT:Bye, 下次再見
用Rasa_NLU構建自己的中文NLU系統
系統demo 的數據和代碼路徑:
https://github.com/zqhZY/_rasa_chatbot
項目依賴安裝(包括rasa nlu 和 rasa core)參考相應路徑:
https://github.com/zqhZY/_rasa_chatbot/blob/master/INSTALL.md
關於rasa nlu的使用方法,可以參考:
https://github.com/RasaHQ/rasa_nlu
http://www.crownpku.com/2017/07/27/用Rasa_NLU構建自己的中文NLU系統.html
確定意圖和實體類別
根據業務查詢和辦理的場景,首先需要確定意圖和實體的類別,這裏系統包含如下意圖和實體類型:
intents:
- greet
- confirm # 確認
- goodbye
- thanks
- inform_item # 告知業務類型
- inform_package # 告知套餐類型
- inform_time # 告知時間
- request_management # 辦理請求
- request_search # 查詢請求
- deny # 否定
- inform_current_phone # 告知本機號碼
- inform_other_phone # 告知其他號碼
entities:
- item # 業務類型
- time # 時間
- phone_number # 電話號碼
- price # 價格
數據準備
通常項目剛開始,往往伴隨著冷啟動的問題。沒有數據的情況下可以根據實際業務場景自行標註數據並結合規則方式先實現第一版本,線上收集真實數據(如果有機會上線的話-
數據格式如下:
{
"rasa_nlu_data": {
"common_examples": [
{
"text": "幫我查一下我的流量這裏還有多少",
"intent": "request_search",
"entities": [
{
"start": 7,
"end": 9,
"value": "流量",
"entity": "item"
}
]
},
...
...
{
"text": "給我辦一個三十的新流量業務",
"intent": "request_management",
"entities": [
{
"start": 10,
"end": 12,
"value": "流量",
"entity": "item"
},
{
"start": 5,
"end": 7,
"value": "三十",
"entity": "price"
}
]
},
...
...
],
"regex_features": [],
"entity_synonyms": [{
"value": "消費",
"synonyms": ["話費"]
}]
}
}
訓練自然語言理解模型
這裏使用rasa nlu 的pipeline 為 MITIE+Jieba+sklearn, rasa nlu 的配置文件為:
{
"name": "rasa_nlu",
"project": "ivr",
"fixed_model_name": "demo",
"pipeline": ["nlp_mitie",
"tokenizer_jieba",
"ner_mitie",
"ner_synonyms",
"intent_entity_featurizer_regex",
"intent_featurizer_mitie",
"intent_classifier_sklearn"],
"language": "zh",
"mitie_file": "data/total_word_feature_extractor.dat",
"path" : "models",
"data" : "data/mobile_nlu_data.json"
}
MITIE模型訓練
由於使用了mitie 所以需要事先準備相應的詞特征向量(total_word_feature_extractor.dat),類似訓練word2vec,
方法如下:
把所有分好詞的語料文件放在同一個文件路徑下。接下來我們要訓練MITIE模型。
首先將MITIE clone下來:
$ git clone https://github.com/mit-nlp/MITIE.git
我們要使用的只是MITIE其中wordrep這一個工具。我們先build它。
$ cd MITIE/tools/wordrep
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
然後訓練模型,得到total_word_feature_extractor.dat。註意這一步訓練會耗費幾十GB的內存,大概需要兩到三天的時間。
$ ./wordrep -e /path/to/your/folder_of_cutted_text_files
項目鏈接裏包含了用真實電信業務數據訓練的total_word_feature_extractor.dat,也可以使用wiki百科訓練的相應模型。
鏈接:http://pan.baidu.com/s/1micEF0G 密碼:opli
訓練rasa nlu 模型
使用rasa nlu 的終端接口訓練模型:
python -m rasa_nlu.train -c mobile_nlu_model_config.json
也可以使用bot.py 裏的Python 接口:
def train_nlu():
from rasa_nlu.converters import load_data
from rasa_nlu.config import RasaNLUConfig
from rasa_nlu.model import Trainer
training_data = load_data("data/mobile_nlu_data.json")
trainer = Trainer(RasaNLUConfig("mobile_nlu_model_config.json"))
trainer.train(training_data)
model_directory = trainer.persist("models/", project_name="ivr", fixed_model_name="demo")
return model_directory
運行相應命令:
python bot.py train-nlu
兩種方式都會在項目根目錄models下生成模型:
models/
└── ivr
├── demo
├── entity_extractor.dat
├── entity_synonyms.json
├── intent_classifier.pkl
├── metadata.json
└── training_data.json
rasa nlu 測試
訓練好模型後可以使用http接口進行測試,啟動項目的httpserver,服務會load模型,並接受http請求,對新文本進行預測:
$ python httpserver.py
2018-01-12 11:48:23+0800 [-] Log opened.
2018-01-12 11:48:23+0800 [-] Site starting on 1235
2018-01-12 11:48:23+0800 [-] Starting factory <twisted.web.server.Site object at 0x7f090a9d49b0>
向服務發送http請求測試結果:
$ curl -XPOST 127.0.0.1:1235/parse -d ‘{"text":"給我查一下我上個月的流量"}‘
{"text": "給我查一下我上個月的流量", "intent": "request_search", "entities": {"time": "上個月", "item": "流量"}}
同時httpserver 後臺打印完整log,包括每個intent的預測confidence。
小結
篇幅原因,這裏只介紹訓練rasa nlu的流程,更多rasa nlu的用法可以到官方文檔了解。下篇文章介紹利用這裏訓練的nlu模型,使用rasa core 的online learning (或強化學習)方式進行對話管理模型的訓練和測試。
原創文章,轉載註明出處。
更多關註公眾號:
【轉載】基於rasa的對話系統搭建(上)