這個玩意是本科時候一門考查課的大作業,基本全是瞎寫的,那時啥都不知道,API各種不會用,所以很多地方的實現都是十分不恰當的。而且模型也圖省事選了最簡單的模型,不論是代碼層面還是學術層面都沒有太大參考價值。
另外,由於沒有數據的使用授權,我不能將數據集公開,請諒解
基於LSTM的中文問答系統
本項目通過建立雙向長短期記憶網絡模型,實現了在多個句子中找到給定問題的答案所在的句子這一功能。在使用了互聯網第三方資源的前提下,用training.data中的數據訓練得到的模型對develop.data進行驗證,MRR可達0.75以上
如何運行
環境依賴
程式 版本 python 3.5.2 TensorFlow 1.2.1 jieba 0.38 CUDA 8.0(8.0.61.2) cuDNN 5.1 CUDA和cuDNN都是TensorFlow的依賴項,請查看TensorFlow官方文檔獲取安裝方法。其餘幾項都可以使用
pip install命令安裝第三方資源使用說明
- 在對中文文本進行分詞時,使用了jieba分詞
- 在對分好的詞語進行編碼時,為了避免One-hot編碼帶來的性能損失,使用了word embedding編碼。其詞向量使用了通過中文維基百科離線資料訓練得到的50維詞向量文件
運行程序
裝好了依賴庫之後,直接執行main.py即可。如果有已經訓練好的模型,程序會提示您是直接加載這個模型,還是重新開始訓練。
main.py不接收參數,如果需要修改配置,請直接修改代碼。文件中有詳細中文註釋,據此修改即可
taevaluation.py是一個評估腳本,可以提供MRR,MAP,ACC@1的評估,由助教學姐編寫。我在輸入輸出的格式上進行了一些修改
關於訓練
當你選擇了不使用已經訓練的模型,或者沒有已經訓練的模型,程序會利用training.data和develop.data中的數據對模型進行訓練。當使用默認參數時,訓練最多會消耗大約8G內存+2G顯存,請事先保證計算機有充足的硬件資源,防止報錯。在我的GTX 850M+i5 4210H條件下,完整的訓練過程需要大約12小時。
另外,我在調參時發現,即使使用相同的參數,每次訓練的結果使用MRR度量仍可能有最大0.03的波動,原因尚不明確。由於個人硬件和時間所限,只是進行了很粗糙的調參,絕大多數參數仍有進一步優化的空間,有意的話不妨嘗試優化一下。