「Pythonでつくる対話システム」という本(https://github.com/dsbook/dsbook
を参考にしまして、その中の、OpenNMTという翻訳ライブラリを用いてつくる対話システムについて質問なのですが、
質問のタイトルにあります通り、対話のやり取りを随時記録してそれを追加で学習しどんどん対話の精度を上げる 方法を教えていただきたいです。こちらの発話とシステムからの応答を記録していくイメージです。
バージョンは
OpenNMT-py v1.2.0 (https://github.com/OpenNMT/OpenNMT-py/tree/1.2.0
python3
!pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 torchtext==0.5 -f https://download.pytorch.org/whl/torch_stable.html !pip install spacy==2.2.2 panel==0.6.4 fbprophet==0.5 holoviews==1.12.4 configargparse !pip install OpenNMT-py==1.2.0 !git clone https://github.com/OpenNMT/OpenNMT-py.git -b 1.2.0
といった感じです。開発環境はJupyter Labです。
会話コーパスは名大会話コーパス (https://mmsrv.ninjal.ac.jp/nucc/
を使っております。(リンク先の>文字化資料ダウンロード をクリックするとダウンロードできます)
これはジャンルごとに対話文章が分かれて公開されているのですが、前処理で一つのテキストファイルにまとめました。
また、学習データを作成するコードは
python3
import MeCab import os # データ数を設定 TRAIN_PAIR_NUM = 500000 DEV_PAIR_NUM = 2000 TEST_PAIR_NUM = 2000 mecab = MeCab.Tagger("-Owakati") mecab.parse("") s = [] #発話文を入れるリスト t = [] #応答文を入れるリスト ds = [] #読み込んだ際にすべての文章を入れるリスト #テキストデータ読み込み with open('corpus_MEIDAI_edit.txt', encoding='utf-8') as f: for i , line in enumerate(f): line = line.strip() ds.append(line) #発話と応答に分ける _s = ds[0:len(ds)-1:2] #発話 _t = ds[1::2] #応答 for s_list in _s: #分かち書き s_str = str(s_list) s_wakati = mecab.parse(s_str) #分かち書き s.append(s_wakati) #リストに追加 for t_list in _t: t_str = str(t_list) t_wakati = mecab.parse(t_str) #分かち書き t.append(t_wakati) #リストに追加 # 設定したデータ数に達したら読み込みを終了 for i in range(len(s)): if len(s) > DEV_PAIR_NUM + TEST_PAIR_NUM + TRAIN_PAIR_NUM: break # 出力用のディレクトリを作成 os.makedirs("OpenNMT", exist_ok=True) # ファイル出力 with open("OpenNMT/dev.src", "w", encoding='utf-8') as f: for l in s[0:DEV_PAIR_NUM]: f.write(l) with open("OpenNMT/dev.tgt", "w", encoding='utf-8') as f: for l in t[0:DEV_PAIR_NUM]: f.write(l) with open("OpenNMT/test.src", "w", encoding='utf-8') as f: for l in s[DEV_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM]: f.write(l) with open("OpenNMT/test.tgt", "w", encoding='utf-8') as f: for l in t[DEV_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM]: f.write(l) with open("OpenNMT/train.src", "w", encoding='utf-8') as f: for l in s[DEV_PAIR_NUM + TEST_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM + TRAIN_PAIR_NUM]: f.write(l) with open("OpenNMT/train.tgt", "w", encoding='utf-8') as f: for l in t[DEV_PAIR_NUM + TEST_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM + TRAIN_PAIR_NUM]: f.write(l)
となっております。
そして前処理は
python3
#前処理 !python OpenNMT-py/preprocess.py -train_src "./OpenNMT/train.src" -train_tgt "./OpenNMT/train.tgt" \ -valid_src "./OpenNMT/dev.src" -valid_tgt "./OpenNMT/dev.tgt" -save_data dlg
となっております。
学習させている記述は
python3
#学習 !python OpenNMT-py/train.py -gpu_ranks 0 --save_checkpoint_steps 50000 --train_steps 100000 -save_model "./OpenNMT/dlg_model" -data dlg
です。
学習させたモデルでの推論を
python3
#推論 !python OpenNMT-py/translate.py -model "./OpenNMT/dlg_model_step_100000.pt" -src "./OpenNMT/test.src" -output pred.txt -replace_unk -verbose !tail pred.txt
でさせています。
対話のログを随時記録して新たに学習し、どんどん対話の精度が上がるようにしたいのですが、やり方が分かりません。どういった方法がありますでしょうか?
まだ回答がついていません
会員登録して回答してみよう