gpt-2-simpleによる遊戯王カードのテキスト自動生成

gpt-2-simpleによる遊戯王カードのテキスト自動生成

遊戯王カードのテキストをディープラーニングにより学習

以前遊戯王カードのイラストを学習して新たな遊戯王カードのイラストを生成するという実験を行った。

今回は遊戯王カードのテキストを学習して新たなテキストを生成する。

1. 結果

最初に実験結果を載せる。
1行につき1つの効果が生成されている。



いくつか目についたものを抜粋。

原文:

FLIP: Destroy all face-up monsters on the field with an ATK or DEF equal to or less than this card’s ATK.

日本語訳:

リバース:このカードの攻撃力以下の攻撃力か守備力を持つフィールド上の表側表示モンスターを全て破壊する。

実在する効果なんじゃないかと思って検索したけど無かった。

原文:

Select 1 face-up Machine-Type monster on the field. That monster’s ATK and DEF become half its current ATK and DEF, and if it does, destroy it.

日本語訳:

フィールド上に表側表示で存在する機械族モンスター1体を選択する。そのモンスターの攻撃力・守備力を半分にして破壊する。

無駄に半減させる。

原文:

Your opponent cannot select their Field Spell Cards as an attack target.

日本語訳:

相手はフィールド魔法を攻撃対象に選択できない。

王国編とかでは活躍しそう。

実験の方法は次以降。

2. gpt-2-simple

GPT-3という自然言語処理で大きな成果を出しているすごい言語処理モデルがある。
これを使おうと思い申し込んだが返事が来ないためGPT-2という少し古いやつを使う。

「gpt-2-simple」というライブラリを使うとGPT-2による文章学習→文章生成が簡単に行える。

3. gpt-2-simpleの使い方

Windows10で「gpt-2-simple」を使うための環境構築を行う。

3.1. ダウンロード

GitHubから「gpt-2-simple」のリポジトリをダウンロード。

https://github.com/minimaxir/gpt-2-simple

3.2. インストール

Anacondaが既にインストールされている前提。
入ってなければ以下を参考にして入れる。

はじめにgpt-2という名前の環境を作る。

1
2
conda create -n gpt-2 python=3.6
conda activate gpt-2

gpt-2に必要なライブラリをインストール。

1
2
3
conda install regex requests tqdm numpy
pip install tensorflow-gpu==1.15
pip install toposort

3.3. 実行

GitHubのUsageに書いてあるコードをコピーして実行するとあらかじめ用意してあるシェイクスピアの文章を学習することができる。

Usage

1
2
3
4
5
6
7
8
9
import gpt_2_simple as gpt2
import os
import requests

model_name = "124M"

~省略~

gpt2.generate(sess)

これがちゃんと動けば環境構築に成功している。

4. 遊戯王カードを学習

続いて自分で用意した遊戯王カードのテキストを学習する。

4.1. 遊戯王カードのテキスト収集

前回と同様に遊戯王APIというAPIを使う。

これを使うと遊戯王カードに関する情報が取得できる。
テキストは英語版のものだが学習モデル自体も英語用なのでちょうどいい。



図のようにカード1枚につき1行としてテキストファイルに保存する。
今回は効果モンスター、魔法、罠のテキストを対象とした。
また、融合・シンクロなどの1行目に書かれている召喚条件の部分は削除した。

4.2. 学習

さきほど用意したテキストファイルを学習する。
以下のコードで学習。

gpt2_train.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import gpt_2_simple as gpt2
import os

# Variables
model_name = "355M" # 124M, 355M, 774M, 1558M
file_name = "carddesc1.txt"
run_name="carddesc1_355_300"
batch_size = 16
steps=300
sample_length=256
sample_num=1
save_every=50

# Download Model
if not os.path.isdir(os.path.join("models", model_name)):
print(f"Downloading {model_name} model...")
gpt2.download_gpt2(model_name=model_name)

# Training
sess = gpt2.start_tf_sess()
gpt2.finetune(sess,
file_name,
model_name=model_name,
batch_size = batch_size,
run_name = run_name,
sample_length=sample_length,
sample_num=sample_num,
save_every=save_every,
steps=steps)
変数名意味
model_name使用するモデルサイズ、大きいほど精度が良くなるが重い。124M, 355M, 774M, 1558Mの4種類。
file_name学習するテキストファイルの名前
run_name学習したモデルの保存先の名前
batch_sizeバッチサイズ、大きいと学習が速いがPCスペックに対して大きすぎると動かなくなる。
steps学習するステップ数。
sample_length学習時に現在の学習モデルによる生成サンプルが生成される、その長さ。
sample_num学習時に現在の学習モデルによる生成サンプルが生成される、その数。
save_every何ステップおきに学習結果を保存するかを示す。

今回はモデルサイズを355M、ステップ数を300として実験。
学習に30時間ほどかかった

より大きなモデルにするとおそらくはより良い結果になるがさらに時間がかかってしまう。

4.3. 生成

学習したモデルを使って遊戯王カードのテキストを生成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import gpt_2_simple as gpt2

# Variables
model_name = "355M" # 124M, 355M, 774M, 1558M
run_name="carddesc1_355_300"
generate_length=2560
generate_nsamples=10
save_filename = "desc_355_300.txt"

# Generate
sess = gpt2.start_tf_sess()
gpt2.load_gpt2(sess, run_name=run_name)
savetextlists = gpt2.generate(
sess,
model_name=model_name,
run_name=run_name,
length=generate_length,
nsamples=generate_nsamples,
return_as_list=True
)

# Save
for savetext in savetextlists:

savetext_splitted = savetext.split("\n")
savetext = "\n".join(savetext_splitted[:-1])

text_save_filename = save_filename
with open(text_save_filename, mode='a', encoding="utf-8") as f:
f.write(savetext)
変数名意味
model_name使用するモデルサイズ、大きいほど精度が良くなるが重い。124M, 355M, 774M, 1558Mの4種類。
run_name学習したモデルの保存先の名前
generate_length生成するテキストの長さ。
generate_nsamples生成するテキストの数。
save_filename生成するテキストファイルの名前

およそカード200枚の効果を20分弱で生成した。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×