Keras TensorFlowを用いたテキストの予測モデルを実装する|シェイクスピアの文章の予測をしてみた

スポンサーリンク

この記事では、Python で Keras TensorFlow API を使用して、シェイクスピアのテキストを予測するリカレントニューラルネットワークモデルを作成する方法について見ていきます。

また、次の記事もお読みください。

新鮮なテキストを生成するために、カスタムビルドのRNNモデルを使用して、GitHub Shakespeareanテキストデータセットをトレーニングします。

スポンサーリンク

Step 1: ライブラリのインポート

最も人気のある深層学習ライブラリのいくつかを利用しました。

Sweetvizは探索的なデータ分析を自動化する新しいパッケージで、特に私たちのトレーニングデータセットの分析に有益です。

1
2
3
4
5
6
7
8
9
pip install sweetviz
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
import sweetviz as sw
import seaborn as sns
sns.set()

Step 2: データセットの読み込み

1
2
3
4
shakespeare_url='https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt'
filepath=keras.utils.get_file('shakespeare.txt',shakespeare_url)
with open(filepath) as f:
    shakespeare_text=f.read()
Downloading data from https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt
1122304/1115394 [==============================] - 0s 0us/step
1130496/1115394 [==============================] - 0s 0us/step

データセットをPythonノートブックにダウンロードしたので、学習用に利用する前に前処理を行う必要があります。

Step 3: データセットの前処理

トークン化とは、長いテキスト文字列をより小さな部分、つまりトークンに分割する処理です。

大きなテキストの塊は文に、そして単語にトークン化することができる。

前処理では、生成されたトークンから句読点を取り除くことも必要です。

1
2
3
4
5
6
tokenizer=keras.preprocessing.text.Tokenizer(char_level=True)
tokenizer.fit_on_texts(shakespeare_text)
 
max_id=len(tokenizer.word_index)
dataset_size=tokenizer.document_count
[encoded]=np.array(tokenizer.texts_to_sequences([shakespeare_text]))-1

Step 4: データセットの準備

ここでは tf.data.Dataset を使用します。

これは一般的に、巨大なテキストデータの塊のような大きな要素の集合に対して有用です。

Dataset.repeat() はデータセットに対して、指定された回数だけ繰り返されます。

 window() はスライドウィンドウのようなもので、毎回指定した回数だけウィンドウをスライドさせ、繰り返し処理を行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
train_size=dataset_size*90//100
dataset=tf.data.Dataset.from_tensor_slices(encoded[:train_size])
 
n_steps=100
window_length=n_steps+1
dataset=dataset.repeat().window(window_length,shift=1,drop_remainder=True)
 
dataset=dataset.flat_map(lambda window: window.batch(window_length))
 
batch_size=32
dataset=dataset.shuffle(10000).batch(batch_size)
dataset=dataset.map(lambda windows: (windows[:,:-1],windows[:,1:]))
dataset=dataset.map(lambda X_batch,Y_batch: (tf.one_hot(X_batch,depth=max_id),Y_batch))
dataset=dataset.prefetch(1)

ステップ5:モデルの構築

モデルの構築はとてもシンプルです。

順次モデルを作成し、特定の特性を持つレイヤーを追加していくことになります。

1
2
3
4
model=keras.models.Sequential()
model.add(keras.layers.GRU(128,return_sequences=True,input_shape=[None,max_id]))
model.add(keras.layers.GRU(128,return_sequences=True))
model.add(keras.layers.TimeDistributed(keras.layers.Dense(max_id,activation='softmax')))

次に、モデルをコンパイルし、データセットにモデルをフィッティングします。

ここでは、Adamオプティマイザーを使用しますが、好みに応じて他のオプティマイザーを使用することも可能です。

1
2
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam')
history=model.fit(dataset,steps_per_epoch=train_size // batch_size,epochs=1)
31370/31370 [==============================] - 1598s 51ms/step - loss: 0.9528

Step 6: モデルのテスト

以下のコードでは、いくつかの関数を定義しています。

これらの関数は、定義したモデルに従って入力データを前処理して準備し、指定した文字数まで次の文字を予測します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def preprocess(texts):
    X=np.array(tokenizer.texts_to_sequences(texts))-1
    return tf.one_hot(X,max_id)
 
def next_char(text,temperature=1):
    X_new=preprocess([text])
    y_proba=model.predict(X_new)[0,-1:,:]
    rescaled_logits=tf.math.log(y_proba)/temperature
    char_id=tf.random.categorical(rescaled_logits,num_samples=1)+1
    return tokenizer.sequences_to_texts(char_id.numpy())[0]
 
def complete_text(text,n_chars=50,temperature=1):
    for _ in range(n_chars):
        text+=next_char(text,temperature)
    return text

以下のコードを使って、ある文字や単語のテキストを予測してみましょう。

1
2
3
4
print("Some predicted texts for letter 'D' are as follows:
"
)
for i in range(3):
  print(complete_text('d'))
  print()
Some predicted texts for letter 'D' are as follows:
  
d, swalld tell you in mine,
the remeiviss if i shou
 
dima's for me, sir, to comes what this roguty.
 
dening to girl, ne'er i was deckong?
which never be
1
2
3
4
print("Some predicted texts for word 'SHINE' are as follows:
"
)
for i in range(3):
  print(complete_text('shine'))
  print()

結果は以下の通りです。

Some predicted texts for word 'SHINE' are as follows:
  
shine on here is your viririno penaite the cursue,
i'll
 
shine yet it the become done to-k
make you his ocrowing
 
shine dises'-leck a word or my head
not oning,
so long

まとめ

RNN を使用してシェイクスピア語のテキスト予測器を構築する方法を学びました。

このチュートリアルは気に入りましたか?いずれにせよ、以下のチュートリアルをご覧になることをお勧めします。

  1. Pythonを使用した株価予測
  2. Pythonを使った暗号の価格予測
  3. Pythonによる株価予測
  4. Pythonによる興行収入予測 – 簡単な実装例

お時間を割いていただき、ありがとうございました! 何か新しいことを学べたでしょうか!

タイトルとURLをコピーしました