日本語に特化した「GPT-2」「BERT」事前学習モデルをつかって昔話創作モデルを実装してみた!
1.今回実装した昔話創作モデル
今回実装した昔話創作モデルは、冒頭の文章を与えると、続きの文章を複数生成し、提案してくれるというモデルです。
本来であれば、膨大な量の文章を集めて、長時間学習させないと行けないところ、公開された事前学習モデルを使うことで、GPUも使うことなく簡単に実装することができました。
昔話創作モデルの仕様
- 昔話の冒頭の文章として「昔々あるところに、」という文章を入力する。
- 入力された文章をもとに、続きの物語を複数生成する。
- おもしろ文章を見つけて、日々の生活に役立てる。
2.全体像
コード全体は以下の通りで、Google colaboratory上で実行しました。
GitHubにも公開しています。
https://github.com/Oregin-ML/Fairy-tale-creation-model
!git clone https://github.com/rinnakk/japanese-pretrained-models
%cd /content/japanese-pretrained-models
!pip install -r requirements.txt
# ライブラリをインポートします。
from transformers import T5Tokenizer, AutoModelForCausalLM
# 学習済みモデルをダウンロードします。
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
tokenizer.do_lower_case = True
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-medium")
# 生成する文章の冒頭部分を設定します。
beginning = '昔々あるところに、'
# 文章を機械学習の入力とできるようコード化します。
input = tokenizer.encode(beginning, return_tensors="pt")
# 文章の生成処理を実施します。(出力はコードで出力されます。)
output = model.generate(input,do_sample=True, max_length=100, num_return_sequences=5)
# 出力されたコードを文章に戻します。
DecodedOutput = tokenizer.batch_decode(output)
# 生成された文章を表示します。
print('#'*40)
print(f'冒頭が「{beginning}」となる文章を出力します。')
print('#'*40)
for j in range(5):
print('#'*40)
print(f'### 文章案{j} ####')
print('#'*40)
i = 0
while i < len(DecodedOutput[j]):
print(DecodedOutput[j].replace('</s>','')[i:i+30])
i = i+30
では、コードを順番に見ていきます。
3.学習済みモデルをインストールする
GitHubより、学習済みモデルをダウンロードして、ダウンロードされたフォルダ内にある、「requirements.txt」を使えば、必要なライブラリが一発でインストールできます。
!git clone https://github.com/rinnakk/japanese-pretrained-models
%cd /content/japanese-pretrained-models
!pip install -r requirements.txt
4.学習済みモデルを定義する
学習済みモデル("rinna/japanese-gpt2-medium")を、読み込みます。
この数行を記載するだけで、莫大なデータやリソース、時間を必要とする学習を省略することができます。
# ライブラリをインポートします。
from transformers import T5Tokenizer, AutoModelForCausalLM
# 学習済みモデルをダウンロードします。
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
tokenizer.do_lower_case = True
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-medium")
5.生成の基となる昔話の冒頭部分を設定する。
昔話の冒頭部分として、'昔々あるところに、'を設定します。この部分を変更すれば、昔話に限らず、いろいろな文章が作れます。
なお、文章を機械学習の入力として使えるようにコード化する必要があります。
# 生成する文章の冒頭部分を設定します。
beginning = '昔々あるところに、'
# 文章を機械学習の入力とできるようコード化します。
input = tokenizer.encode(beginning, return_tensors="pt")
6.続きの物語を生成して出力する。
モデルのgenerate()を使って、続きの物語を生成します。
入力にはコードに変換済みの冒頭の文章(input)を指定します。
各オプションは以下のとおりです。
do_sampleをTrueとすることで、実行毎に出力を変化させることができます。
max_lengthは、生成する文章の最大の長さになります。
num_return_sequencesは、生成する文章の数になります。
出力は、コードで出力されるため、.batch_decode()を使って、文章にもどします。
表示にあたっては、改行をいれて出力させています。
# 文章の生成処理を実施します。(出力はコードで出力されます。)
output = model.generate(input,do_sample=True, max_length=100, num_return_sequences=5)
# 出力されたコードを文章に戻します。
DecodedOutput = tokenizer.batch_decode(output)
# 生成された文章を表示します。
print('#'*40)
print(f'冒頭が「{beginning}」となる文章を出力します。')
print('#'*40)
for j in range(5):
print('#'*40)
print(f'### 文章案{j} ####')
print('#'*40)
i = 0
while i < len(DecodedOutput[j]):
print(DecodedOutput[j].replace('</s>','')[i:i+30])
i = i+30
7.実行結果
このコードを実行した出力の例は以下のとおりです。
少し違和感のある文章もありますが、なかなか良い文章もできています。
中には、続きが気になってしまう文章案もあります。
手直しすれば、オリジナルの昔話も作れそうですね。

8.感想
今回は、日本語に特化した事前学習モデルを使って、昔話創作モデルを作ってみました。
大したものは作れないと思っていたのですが、なかなか良い文章が出てくるので、創作文章を作るときの最初のアイデア出しに使えそうな気がしました。
もっと色々使ってみて、活用方法を考えていきたいと思います。
【第1弾】簡易大喜利モデル
oregin-ai.hatenablog.com
【これまでの道のり】
oregin-ai.hatenablog.com
oregin-ai.hatenablog.com
oregin-ai.hatenablog.com
oregin-ai.hatenablog.com
oregin-ai.hatenablog.com
