天天看點

【轉載】基于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訓練資料的格式,供學習使用。

資料格式如下:

{
  "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(<span class="hljs-string">"data/mobile_nlu_data.json"</span>)
trainer = Trainer(RasaNLUConfig(<span class="hljs-string">"mobile_nlu_model_config.json"</span>))
trainer.train(training_data)
model_directory = trainer.persist(<span class="hljs-string">"models/"</span>, project_name=<span class="hljs-string">"ivr"</span>, fixed_model_name=<span class="hljs-string">"demo"</span>)

<span class="hljs-keyword">return</span> 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 (或強化學習)方式進行對話管理模型的訓練和測試。

原創文章,轉載注明出處。

更多關注公衆号:

wechat

</div>
    </div>           

時間會記錄下一切。

繼續閱讀