Keras LSTMでサクッと文章生成をしてみる

今回は、Keras のLSTMのサンプルプログラムを使って、日本語の文章生成をしてみます。

こんにちは cedro です。

先回、LSTMで航空会社の乗客数の予測をしてみました。具体的には、過去12ヶ月の乗客数のデータから翌月の乗客数を予測をし、これを繰り返すことで、将来のトレンド予測をしたわけです。

これを文章に置き換えるとどうなるのでしょうか。連続した文字列からその後の1文字を予測する。これを繰り返すと、文章生成ができるはずです。

今回は、Keras のLSTMのサンプルプログラムを使って、日本語の文章生成をしてみます。

 

データセットを準備します。

今回、使うサンプルプログラムは、lstm_text_generation.py で、データセットニーチェの英文が使われているのですが、英語がほとんど出来ない私にとっては、英文の文章が生成されても、あまり意味がありません。

ということで、今回はアーネスト・ヘミングウェイ「老人と海」日本語訳版を使うことにします。青空文庫で、「老人と海」テキストファイル(ルビあり)をダウンロードし、サンプルプログラムと同じフォルダーに保管します。

 

ダウンロードしたテキストファイルをサンプルプログラムに適切に読ませるために、前処理を行います。このプログラムをサンプルプログラムと同じフォルダーに保存し、実行します。

実行すると、テキストファイルの形式(Shift-JIS)で読み込み、改行ルビ入力者注などを削除してから、サンプルプログラムが読めるように UTF-8に変換して、data_rojinto_umi.txt という名前で保存します。

あとはエディターを使い、手動で、文章の前後にある、余分な部分を削除します。前処理したファイルのサイズは167KBと、コンパクトです。

 

サンプルプログラムを修正します

プログラム冒頭の部分です。9行目に、後で学習ロス推移グラフ描かせるために、ライブラリーを追加します。15行目は、前処理したファイル(data_rojinto_umi.txt)を読み込む形に変更します。

25-26行目は、学習のためのデータセットを作る部分です。サンプルプログラムは、40文字単位maxlen=40)で次の1文字を予測し、それを3文字(step=3)づつずらしながらデータセットを作る仕様になっています。

これはアルファベット一文字づつを対象にしているためで、日本語の場合は漢字があり遥かに情報量が多いため、もっと短くしないと上手く学習出来ません。なので、8文字単位maxlen=8)で次の1文字を予測し、それを1文字(step=1)づつずらしながらデータセットを作る仕様に変更しました。

 

エポック毎に、生成文最初の8文字をテキストから選ぶ部分です。7行目start_index で、テキストの何文字目から取得するかをランダムに選んでいますが、生成文スタートは、毎回同じ方が成長度合いが見やすいので、8行目強制的に0にしています。これで、毎回テキストファイルの最初の「彼は老いていた。」から文章生成することになります。

9行目diversity は、数字が大きくなるに従って、予測確率の低い文字もある割合で採用する係数です。サンプルプログラムは、[ 0.2, 0.5. 1.0. 1.2 ] の4種類で文章生成していますが、ここでは 0.2 のみを使っています。

 

サンプルプログラムの最後の部分です。学習ロスの推移を見たかったので、2行目model.fit の前に history を追加し、8行目から学習ロス推移グラフを描かせる部分を追加しています。

 

プログラム全体を載せておきます。

 

プログラムを動かします

テキストが167KBと小さいので、通常のノートパソコンで十分動きます。私のMacbook Air60epoch1時間弱で完了しました。

プログラムを実行すると、まずこんな表示が出ます。テキストの総文字数corpus length)は56995文字、文字の種類total chars)は1337種類、学習データセット数nb_sequence)は56987個という意味です。

その後、約1分毎400文字の文章自動生成され、ターミナルに表示されます。これを眺めているのは、結構面白い。

 

学習したばかりの段階の生成文。「老人」ばっかり出てきますね(笑)。

 

かなり学習が進んだ段階の生成文。ところどころ、何か意味がありそうなことを言っている様な気がしないでもない(笑)。但し、全体的な文体は、確かに「老人と海」になっているのが凄い!

 

学習ロスの推移グラフです。順調に、学習は進んだようです。

今回は、LSTMによる単純な1文字単位の予測を使った文章生成ですが、PCが一生懸命予測をして文章生成をしているのを見ると、けなげで可愛いです。

では、また。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)