LSTMで夏目漱石ぽい文章の生成

  • 6
    Like
  • 0
    Comment

概要

n 番煎じではあるが、なかなか面白い結果が得られたので共有。

Deep Learningで遊ぶ(3): LSTM-RNNで夏目漱石っぽい文章の生成にトライしてみる

をなぞって実行してみただけである。深く感謝。

だた、上の記事だと漢字混じりの原文をそのまま処理しているのだが、文字種は少ないほうが学習が進みやすいのではないかと考えて、ここではぜんぶひらがなに変換した上で処理をしてみた。

環境

  • Ubuntu 14.04
  • GeForce GTX 1060 6GB
  • Intel Core i7

やったこと

上の記事で共有してくれている夏目漱石のテキストをダウンロード。souseki_all.txt という名前で保存。

$ cat souseki_all.txt | mecab -Oyomi | nkf -w --hiragana > souseki_all_hiragana.txt

とひらがな化。ただ、変換しきれない漢字やアルファベット等が混じっているので、ホワイトリストを作って、ひらがな・句読点・括弧・改行だけにする。

preprocess.py
whitelist = "\n「」。、あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゐゆゑよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょっゎ"
whitelist = set(whitelist)
with open("souseki_all_hiragana.txt", "r") as f:
    for l in f:
        for c in l:
            if c in whitelist:
                print(c, end="")

結果を souseki_all_hirgana2.txt として保存。

あとは、Keras の LSTM によるテキスト生成のサンプルをほぼそのまま使っただけである。

これらのコード、データおよび実行結果は、Github に上げておいた。

実行結果

ランダムにピックアップされた

ええ、つまるところおかしいです」
「ははははじにいとにもはなしたかい」
「しけん

という本物のテキストの一部に続く文字を推測させると…

ええ、つまるところおかしいです」
「ははははじにいとにもはなしたかい」
「しけんさいのおんなのあたまをうごかさせるところで、それをおっとにいる。だいすけはおとこのきゅうしきたいとおもう。
「そうはないの」
「だっておもいだいにがいかんがいまでもある。たかぎにおかしいから、それがいつか、このあいだあいてにあることができないんです。それがとうぜんのかんたんなんだから、なにをかいしゃくしているんだから」
「そうだろう。それでごぜんをしているんです」
「いままでにいったいしょうめんからようでもあるんですか」
「なにもうごいていたが、このつうりです。いままでからおとこのちょうしであったから」
「いつものとおりだ」
「いくらいっているんだから」
「どうもよくわからない。なにでもあるまい」
「そうだろう」
「このするうちに、かれはこのあいにくいくらいらないものと、いちぶんかということがない。
「いんかいはかいかないのかね」
「いいえ、あなたのいるかわりまったくだけのおんなが、あなた

(Iteration 23 diversity 0.5)

うーん、漱石ぽいw 意味は不明だけど、文体はある程度似ているというのが面白い。

あともうひとつ。

うね」とあによめがゆった。
するとでんとうがまたぱっときえた。じぶんはきゅうにはらのうちでこうしょうしゃのうちにかんがえている。
「なにみったのだ」
「だって、そのつぎのまえに、あなたはしゃしんがかんがえているのだ」
なみに、なにかかったかれは、このしょうじょうを、こころもちでもないように、きょうこんにちのとくになっても、とおいないといういみは、ことばのふたりのまにかんがえるものは、そのしつへやへあるいている。
「そうですか」という。
「きみはいつまでもなんでもしません。わたしはよきしていたのです。そうでしょう」
「ふじおさん、どうしても、このそんなんかのまにはなしだした。それでもかんたんなひとのかおをして、かれのかんけいをだいじくしている。おんなはいちばんしょうせつかいのおっとのかおをみた。
「それでもよい」
「そうですか」というと、おのべはわざととうきょうへでた。
「ゆっくりもまだからかんがえないんですね」というと、きょうは、またいちめんまんじょうかんじょうのほう

(Iteration 36 diversity 0.5)

不思議なのは、会話の引用の括弧(「」)がちゃんと対になって現れていること。また閉じ括弧(」)の直後には必ず改行が来るのもきちんと学習できているのがすごい。

たぶん LSTM だけで意味のある自然言語の文章を生成するのは難しいのだろうけど、「直近現れた文字から次の文字を推測・生成する」というのは人間の脳の機能としてもあるのかもしれない。だから、「意味はわからないけど、それっぽい」という現象が起こるのではないだろうか・・・(まあ何の根拠もない推量ではあるが)。

参考

mecabひらがな変換
KerasのLSTM model.predictを解読した話