基於DrQA的中文問答系統構建(二):了解DrQA系統


   如果在上文成功運行 bash ./download.sh 后,我們就得到完整的DrQA項目,接下來我們將通過訓練一個實例去了解DrQA系統。我們的工程只用到了DrQA的閱讀理解部分,所以實際操作可能和DrQA官網上有些不一樣,但是流程是一致的,主要分為數據處理、訓練並生成模型、利用模型進行交互這三個部分。


 

 1.數據處理

   運行python  prepro.py.

   數據處理是我們需要了解最為詳細的部分(事實上我們在模型訓練的部分無需做太多的改動。)

  (1)flatten_json:

   flatten_json的作用是將實際數據進行解析,並將訓練集處理為row(id_, context, question, answer, answer_start, answer_end),驗證集處理為(id_, context, question, answer)。其中的answer_start, answer_end分別表示問題在文本中起始的位置與結束的位置。這部分的代碼需要根據實際需要去更改,原工程的訓練集與驗證集放在SQuAD下,可以在loadDataset下方的trn_file = 'SQuAD/xxxx';dev_file = 'SQuAD/xxxx'進行修改。

  (2)init:

  init是初始化的地方,spacy之類的tokenizer就在此處初始化;由於我們的工程借助到哈工大的pyltp,所以 Segmentor,Postagger,NamedEntityRecognizer的model的導入也在此處進行。

  (3)annotate:

  annotate是將導入的數據處理成基本特征的部分。返回的參數格式是(id_, context_tokens, context_features, context_tags, context_ents,question_tokens, context, context_token_span,id, context, question)。其中context_tags、context_ents分別是詞性標識和命名實體標識;context_features則由match_origin, match_lower, match_lemma, context_tf組成,其中match_lower, match_lemma在中文自然語言分析中是沒有的;而context_token_span則是標識每個詞在文段中的位置。

    (4)build_vocab和to_id

  這部分將會把每個詞語與詞向量文件相互對應,將每個詞轉換為詞向量中的ID。原系統的詞向量是在glove中的glove.840B.300d.txt,有5.6G那么大,每個詞的維度都為300,可以在如下代碼處自定義詞向量文件的位置和每個詞的維度。在轉換好后,原來的每個詞語都將被標記為一個ID,通過這個ID便可以檢索其對應的300維向量。

  parser.add_argument('--wv_file', default='glove/glove.840B.300d.small.txt',help='path to word vector file.')

  parser.add_argument('--wv_dim', type=int, default=300,help='word vector dimension.')

  接下來就是寫入文件的部分,在提示saved to disk后,文件將被存到SQuAD/sample.msgpack中,然后便可以用其進行訓練。在預處理過程中有可能會報缺少__init__.py,這時可以嘗試建立一個空的__init__.py在drqa目錄下。


2.訓練

  運行python  train.py.

      訓練這部分比較復雜,train會調用model.py,layers.py,rnn_reader.py這些文件去進行訓練,會耗費大量的時間,在trian里面有參數設定的說明。如:

  parser.add_argument('-e', '--epochs', type=int, default=40)

  parser.add_argument('-bs', '--batch_size', type=int, default=32)

  parser.add_argument('-rs', '--resume', default='best_model.pt',
  help='previous model file name (in `model_dir`). '
  'e.g. "checkpoint_epoch_11.pt"')
  parser.add_argument('-ro', '--resume_options', action='store_true',
  help='use previous model options, ignore the cli and defaults.')
  parser.add_argument('-rlr', '--reduce_lr', type=float, default=0.,
  help='reduce initial (resumed) learning rate by this factor.')

  運行時候可能會報缺少cuda,可以通過注釋model中的#'torch_cuda_state': torch.cuda.get_rng_state() (不懂為什么設置了--cuda False依舊會報錯)

  訓練得到的每個checkpoint和best model都會被存到models文件夾下。需要注意的是,每次開始訓練時,train都會去加載原有的model,因此在采用不同數據集進行計算時候會出現維度不匹配的錯誤,因此我們需要把models里的文件及時遷移。


 

3.交互

  運行 python scripts/reader/interactive.py --model /path/to/model
  這里的 model 便是我們之前計算得出的模型;如果忽略就會使用默認的模型。
  如果要在數據集上執行模型預測,則運行如下代碼:
   python scripts/reader/predict.py /path/to/format/B/dataset.json --model /path/to/model
  同樣,官網也給出了很多的參數
  --reader-model Path to trained Document Reader model.
  --retriever-model Path to Document Retriever model (tfidf).
  --doc-db Path to Document DB.
  --tokenizers String option specifying tokenizer type to use (e.g. 'corenlp').
  --candidate-file List of candidates to restrict predictions to, one candidate per line.
  --no-cuda Use CPU only.
  --gpu Specify GPU device id to use.

   至此,我們便跑完了一整個DrQA的流程。由於這篇只是簡單的隨筆,所以可能存在紕漏和講訴不清晰的地方,還請見諒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM