1. 程式人生 > >【聊天機器人】1:DeepQA使用自己的資料集做chatbot

【聊天機器人】1:DeepQA使用自己的資料集做chatbot

前言:這篇部落格主要是依賴網上開源的DeepQA專案,詳細介紹其使用的方法,以及需要注意的地方,並沒有做較多的改進。這個專案實現簡單,操作方便,對於想了解如何實現聊天機器人的夥伴們,是個不錯的入門之選,其後也附有我的效果展示和原始碼。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
環境配置:筆者是使用python3.5,IDE是pycharm的windows環境,ubuntu的Linux環境還未親測,還望海涵。
—-

—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

一、DeepQA專案簡單介紹

話不多說,先附上——DeepQA原始碼GitHub地址。下載原始碼、解壓、並在pycharm下建立工程。
這篇部落格只講解DeepQA專案的demo,不涉及website版,有興趣的夥伴可以自己研究chatbot_website下的檔案——記得也教一下大家。
建立工程後可得到如下圖示:下左圖裡紅色標註的是我們主要用到的幾個檔案或資料夾,詳細說明如下:

  1. data資料夾:是用來儲存語料資料的,在DeepQA原始碼GitHub地址中對這個資料夾有詳細說明。簡單介紹如下:開啟data資料夾,是右上圖所示:①、紅框cornell下是康奈爾電影對話語料庫,也是預設的語料資料,.txt格式;②、而如果你自己想使用自己的語料庫,則需要將自己準備的語料存入lightweight資料夾中(下面針對自己的語料庫會有更詳細的操作介紹);③、samples資料夾儲存由語料庫.txt格式轉化而來的.pkl檔案,.pkl檔案才是程式讀取的語料格式;④、test資料夾下有一個同名不同格式的samples.txt檔案,用來儲存測試語料;
  2. save資料夾:是用來儲存由訓練得到的model
    模型引數,主要是裡面的.ckpt檔案儲存模型引數;model_predictions.txt儲存內測輸出(下有詳細介紹);
  3. main.py是主函式:是訓練train、測試test的入口;
  4. chatbot.py是主要引數程式:裡面包括各種引數調整的介面(下有詳細介紹);

這裡寫圖片描述
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

二、使用預設康奈爾(cornell)電影對話語料庫做chatbot

2.1、模型訓練

1、下載解壓DeepQA原始碼,新建pycharm工程後,直接執行main.py,即可開始訓練。執行視窗如下所示:
這裡寫圖片描述
2、請注意chatbot.py程式130行–135行的模型引數調整,分別是訓練批次numEpochs、儲存引數的步長saveEvery、批量batchsize、學習率lrdropout引數:(這裡根據大家需求,自行調參)
這裡寫圖片描述
3、語料讀取完畢後,就可以在data/samples資料夾下檢視由語料庫中的.txt檔案生成的.pkl檔案:
這裡寫圖片描述
4、最後就是開始漫長的訓練,筆者的配置既沒有GPU也沒有伺服器,真的訓練了好久,哭——訓練完成後,可以在save/model資料夾下檢視生成的model引數檔案:(此時應該是沒有model_predictions.txt檔案,內測測試後才會生成model_predictions.txt檔案,下有介紹)
這裡寫圖片描述

2.2、模型測試

2.2.1:內測——生成model_predictions.txt檔案
先開啟data/cornell資料夾,檢視到其下有兩個.txt檔案,這就是康奈爾訓練語料集,再開啟data/test資料夾,檢視到其下samples.txt檔案就是測試語料集,最後開啟main.py檔案,依次點選:runEdit Configuration,得到如下視窗:
這裡寫圖片描述

Parameters中填入下面的內容:

--test

確定後再點選執行main.py檔案,在對話視窗得到成功資訊後,就可以在save/model資料夾下看到生成的model_predictions.txt檔案;

開啟model_predictions.txt檔案——這個檔案是由訓練語料集得到的model來預測data/test/samples.txt檔案得到的預測回答內容,如下所示:
這裡寫圖片描述

2.2.2:外測——進入人機對話模式
外測的操作步驟如內測一致,依次點選:runEdit Configuration,最後在Parameters中填入的內容改成如下:

--test interactive

就可以在對話視窗中進入人機互動模式,注意cornell語料庫是英文語料庫,不可能出現下圖中文形式的回答——因為cornell語料庫訓練時間太久了,我就用自己的語料庫做了外測。
這裡寫圖片描述
到這裡一個簡單的chatbot聊天機器人就完成了。訓練次數與語料庫質量直接影響模型效果,網上前輩都是訓練20W+次,我這電腦配置望塵莫及了,夥伴們得到的高訓練次數的模型也可以發出來與我們共享。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

三、使用自己的語料庫做chatbot

使用自己的語料庫做chatbot其實也很簡單——就是準備一些語料,修改一些引數。

3.1、如何製作自己的語料庫

需要在data/lightweight資料夾下製作自己的訓練語料庫,在data/test/samples.txt製作自己的測試語料庫

3.1.1:訓練語料製作:data/lightweight資料夾下新建<name>.txt文字檔案,注意<name>需要使用自己的檔名。在文字檔案中輸入自己的語料:不同語境間用===分割,上下即為問答對形式;
這裡寫圖片描述
3.1.2:測試語料:data/test資料夾下的samples.txt中重新輸入測試語料,測試語料只在內測時候生成model_predictions.txt檔案用到;也是上下問答對形式,但不必用===區分語境;

3.2、訓練自己的語料庫

重要提醒:每一次重新訓練之前,都要先檢視data/samples資料夾下之前生成的兩個.pkl檔案是否已經刪除——我並沒有對這一點進行過深究,只是發現程式具有檢查.pkl格式檔案的能力?如果不提早刪除,程式會先讀取已存在的.pkl檔案,如果這樣就意味著新語料並沒有參與新的訓練(可能這也是唯結果論的分析吧,我並沒有深究於此)

訓練自己的語料庫的步驟我們也已經做過多次輕車熟路了——先開啟main.py檔案,依次點選:runEdit Configuration,在Parameters中填入下面的內容,再點選執行main.py檔案;請注意<name>要與你的檔名一致;

--corpus lightweight --datasetTag <name>

成功讀取語料集後,就可以在data/samples檢視到新生成的.pkl檔案,同樣訓練結束後可以在save/model資料夾下檢視新生成的model引數檔案;

3.3、測試自己的語料庫結果

內測與外測的步驟都與上述內/外測的步驟一模一樣:
內測:依次點選:runEdit Configuration,在Parameters中填入下面的內容後,點選執行main.py檔案,就可以在得到成功資訊後,在save/model資料夾下看到生成的model_predictions.txt檔案

--test

外測:依次點選:runEdit Configuration,在Parameters中填入的內容改成如下,最後點選執行main.py檔案

--test interactive

就可以在對話視窗中進入人機互動模式。語料庫質量差、語料庫對話資料少、訓練次數過低都會導致互動預測結果差的狀況產生。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

問題求教:

我在使用自己的語料庫做外測時發現了一個問題:
訓練2W次的模型,外測進入互動視窗後,如果輸入的問題是data/lightweight資料夾下自己語料庫中的問題(問題+符號都需要一字不差,問題不區分語種),這時候百分百答出問題正確答案,但如果不是自己語料庫內的問題、或者不是百分百自己語料庫內的中文問題,總會重複出錯

對於這個問題,我的猜想是:
1、由於我的語料集包含的場景過少,問題覆蓋面小,訓練過擬合導致正確答案只能由完整問題才能答出;
2、因為DeepQA專案面對的語種是英語,對英語有模糊回答處理,所以回答英語問題置信度尚可,但如果我們將訓練集改成全中文形式,DeepQA並沒有像jieba分詞一樣類似的操作,所以得到的回答預測總是差強人意。

介於第2點猜想,我又參考做了新的小demo——【聊天機器人】2:使用自己的資料集,實現中文聊天機器人,這次加入中文jieba分詞得到的在特定語境下的預測結果還是可以的。