「Pythonでつくる対話システム」という本(https://github.com/dsbook/dsbook
を参考にしまして、その中の、OpenNMTという翻訳ライブラリを用いてつくる対話システムについて質問なのですが、
質問のタイトルにあります通り、対話のやり取りを随時記録してそれを追加で学習しどんどん対話の精度を上げる 方法を教えていただきたいです。こちらの発話とシステムからの応答を記録していくイメージです。
バージョンは
OpenNMT-py v1.2.0 (https://github.com/OpenNMT/OpenNMT-py/tree/1.2.0
python3
1!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 2!pip install spacy==2.2.2 panel==0.6.4 fbprophet==0.5 holoviews==1.12.4 configargparse 3!pip install OpenNMT-py==1.2.0 4!git clone https://github.com/OpenNMT/OpenNMT-py.git -b 1.2.0
といった感じです。開発環境はJupyter Labです。
会話コーパスは名大会話コーパス (https://mmsrv.ninjal.ac.jp/nucc/
を使っております。(リンク先の>文字化資料ダウンロード をクリックするとダウンロードできます)
これはジャンルごとに対話文章が分かれて公開されているのですが、前処理で一つのテキストファイルにまとめました。
また、学習データを作成するコードは
python3
1import MeCab 2import os 3 4# データ数を設定 5TRAIN_PAIR_NUM = 500000 6DEV_PAIR_NUM = 2000 7TEST_PAIR_NUM = 2000 8 9mecab = MeCab.Tagger("-Owakati") 10mecab.parse("") 11 12s = [] #発話文を入れるリスト 13t = [] #応答文を入れるリスト 14ds = [] #読み込んだ際にすべての文章を入れるリスト 15#テキストデータ読み込み 16with open('corpus_MEIDAI_edit.txt', encoding='utf-8') as f: 17 for i , line in enumerate(f): 18 line = line.strip() 19 ds.append(line) 20 21 #発話と応答に分ける 22 _s = ds[0:len(ds)-1:2] #発話 23 _t = ds[1::2] #応答 24 25 for s_list in _s: 26 #分かち書き 27 s_str = str(s_list) 28 s_wakati = mecab.parse(s_str) #分かち書き 29 30 s.append(s_wakati) #リストに追加 31 32 for t_list in _t: 33 t_str = str(t_list) 34 t_wakati = mecab.parse(t_str) #分かち書き 35 36 t.append(t_wakati) #リストに追加 37 38 # 設定したデータ数に達したら読み込みを終了 39 for i in range(len(s)): 40 if len(s) > DEV_PAIR_NUM + TEST_PAIR_NUM + TRAIN_PAIR_NUM: 41 break 42 43# 出力用のディレクトリを作成 44os.makedirs("OpenNMT", exist_ok=True) 45 46# ファイル出力 47with open("OpenNMT/dev.src", "w", encoding='utf-8') as f: 48 for l in s[0:DEV_PAIR_NUM]: 49 f.write(l) 50with open("OpenNMT/dev.tgt", "w", encoding='utf-8') as f: 51 for l in t[0:DEV_PAIR_NUM]: 52 f.write(l) 53with open("OpenNMT/test.src", "w", encoding='utf-8') as f: 54 for l in s[DEV_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM]: 55 f.write(l) 56with open("OpenNMT/test.tgt", "w", encoding='utf-8') as f: 57 for l in t[DEV_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM]: 58 f.write(l) 59with open("OpenNMT/train.src", "w", encoding='utf-8') as f: 60 for l in s[DEV_PAIR_NUM + TEST_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM + TRAIN_PAIR_NUM]: 61 f.write(l) 62with open("OpenNMT/train.tgt", "w", encoding='utf-8') as f: 63 for l in t[DEV_PAIR_NUM + TEST_PAIR_NUM:DEV_PAIR_NUM + TEST_PAIR_NUM + TRAIN_PAIR_NUM]: 64 f.write(l)
となっております。
そして前処理は
python3
1#前処理 2!python OpenNMT-py/preprocess.py -train_src "./OpenNMT/train.src" -train_tgt "./OpenNMT/train.tgt" \ 3 -valid_src "./OpenNMT/dev.src" -valid_tgt "./OpenNMT/dev.tgt" -save_data dlg
となっております。
学習させている記述は
python3
1#学習 2!python OpenNMT-py/train.py -gpu_ranks 0 --save_checkpoint_steps 50000 --train_steps 100000 -save_model "./OpenNMT/dlg_model" -data dlg
です。
学習させたモデルでの推論を
python3
1#推論 2!python OpenNMT-py/translate.py -model "./OpenNMT/dlg_model_step_100000.pt" -src "./OpenNMT/test.src" -output pred.txt -replace_unk -verbose 3!tail pred.txt
でさせています。
対話のログを随時記録して新たに学習し、どんどん対話の精度が上がるようにしたいのですが、やり方が分かりません。どういった方法がありますでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/05 14:41
2022/07/06 00:51
2022/07/06 06:27