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が一生懸命予測をして文章生成をしているのを見ると、けなげで可愛いです。

では、また。

10 件のコメント

    • murata さん

      コメントありがとうございます。
      それは良かったです。
      これからも分かりやすいブログを心がけて行きたいと思います。
      今後とも、よろしくお願いします。

  • はじめまして。株式会社Books&Companyの野村と申します。今、我々の会社ではAIを使った小説制作にチャレンジしています。お忙しいとは存じますが、情報交換等を兼ねてご挨拶させていただきたいのですが、いかがでしょうか。実はほかのAI作家さんにもお声がけさせていただいており、ゆるくコミュニティのようなものが形成できないかと思っております。もちろん、対面ではなく、オンラインのみでも結構です。ご返信いただけますと幸いです。よろしくお願い申し上げます。

    • 野村さん

       コメントありがとうございます。
      私のブログの文章生成に関して興味を持って頂き、嬉しいです。

      ただ、私はディープラーニング関連のコードを趣味で少しいじっている程度でして、とてもAI作家なんて呼べる者ではありませんので、念のため。

      昨年から今年に掛けてNLP(自然言語処理)は、ELMo、GPT、BERT、そしてGPT-2と急速に進んでいて、凄いAI作家が生まれる土壌は確実に作られて来ていると思います。

      今後も、NLPに関する情報もブログにして行きたいと思っています。ちなみに、3/10のブログはGPT-2をご紹介します。

      今後とも、よろしくお願いします。

      • cedro様
        ご返信ありがとうございます(すみません、1週間以上気づきませんでした)。
        もしよろしければ、下記メールアドレスにご返信いただけないでしょうか。
        ご面会は無理でもオンラインだけでの情報交換ではいかがでしょう。
        今日も別のAI作家さんとお会いすることになっております。
        実は「AI小説大賞」を開催できればと思い、今いろいろな方にお目にかかっています。
        公募文学賞にすれば、学生さんやフリーのプログラマーの方などが参加していただけるのではないかと思っております。
        全部で20名のご応募があれば、立派なかつ世界初のイベントになると思います。
        どうぞよろしくお願い申し上げます。

  • とても勉強になる情報をありがとうございます。
    いまディーブラーニングに手を染めたばかりなので、このようなサンプルは非常に助かります。

  • Traceback (most recent call last):
    File “5.py”, line 6, in
    from keras.optimizers import RMSprop
    ImportError: cannot import name ‘RMSprop’ from ‘keras.optimizers’ 
    という,エラーが出てしまいました.
    なんででしょうか.どうしたら,実行できるでしょうか.

    • 大橋真由さん
      コメントありがとうございます。

      Kerasのバージョンが上がって、エラーが出る様です。お手数ですが、

      from keras.optimizers import RMSprop を
      from tensorflow.keras.optimizers import RMSprop 

      に変更して下さい。そうすると動かせます。

  • 野村 衛 へ返信する コメントをキャンセル

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

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

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。