chainerのptbを使って集めたデータから文章生成
chainerのptbつかって文章生成を試したので次やるときに忘れないように手順をメモ。
今回は自分のあるフォロワーさんのような文章を生成しようとしました。
使ったchainerのサンプルはtrainingとかimportしないころの少し古いやつです。
前提条件としてchainerのインストールは終えてます。
chainer自体のインストールは超簡単です。
GPUを使うには設定が面倒なのでめんどかったらなくてもいいと思います。
今回はフォロワーさんっぽい文章ということで、twitterから学習データを集めました。
素人なのでコードの汚さとかは許して下さい。
tweepyを使ってツイート内容を取得し、テキストファイルに保存しました。
#!/usr/bin/python #-*- coding: utf-8 -*- import tweepy #認証を行う consumer_key = "hoge" consumer_secret = "huga" access_token = "foo" access_secret = "bar" auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_secret) api = tweepy.API(auth) f = open("out.txt","w") for p in tweepy.Cursor(api.user_timeline,id="取得する人のid").items(3200): f.write(p.text+"\n") f.close()
これで一応ツイート内容がファイルに保存されました。
単語や品詞に区切る必要があるのでmecabを使います。
コマンドも参考にしたブログと同じです。
$ mecab out.txt -F "%m "|sed -e "s/EOS//g" > train.txt
一応文章が区切られているか確認します。
そして生成された文章を適当にptb.test.txtとptb.train.txtとptb.valid.txtに分割します。
trainを一番多くしてほかは1割ずつくらいに割り当てました。
chainerのexampleのptbフォルダに3つとも移します。
定期的にモデルを保存させるために少しtrain_ptb.pyを書き換えました。
これもブログを参考にしました。
152行目あたりの最後にモデルの保存部分を追加します。
if (i + 1) % 10000 == 0: now = time.time() throuput = 10000. / (now - cur_at) perp = math.exp(float(cur_log_perp) / 10000) print('iter {} training perplexity: {:.2f} ({:.2f} iters/sec)'.format( i + 1, perp, throuput)) cur_at = now cur_log_perp.fill(0) serializers.save_npz('model%04d' % (i+1)+'.model', model) print('save model'))
最初はepoch数もデフォルトで学習させてみます。
$ python train_ptb.py -g 0
そして学習が終了したら文章生成も試しましょう。
今回は文章の始まりを私にしてみます。
$ python genetxt.py -m model10000.model -v vocab.bin -p 私
私 の フォロワー だ よ それ は なく て 効果 ない の に 気づい た … … ちょ から
始まりを人にしてみます。
$ python genetxt.py -m model10000.model -v vocab.bin -p 人 人 を たべる し 買っ て 好き に どう 10 の わかん て ない の か し … … ボーダー を
いまいちよくわからん文章になってますね。
原因として考えられるのは、
- 学習データが悪い
- ループが足りない
URLとか人の名前とか削除したほうがいいのかもしれない。
今回の出力は一番最初のモデルでやってるのでそれの影響も大きそう。
というわけでepochを増やしてみて、次に学習データも少し変えてみたいと思います。
参考にしたブログ
http://www.kabipan.com/computer/twitter/
Chainerのptbサンプルを解説しつつ、自分の文章を深層学習させて、僕の文章っぽい文を自動生成させてみる - shi3zの長文日記