RNN (Recurrent Neural Network) を使って何かをやってみようと前々から考えてましたがネタが思いつかない・・・
・・・・・・・・・・・・・・・
・・・ ありました! 競走馬の名前を生成してみよう
ということで早速やってみました。
名前を題材にしたワケ
RNNを使った文章生成というのはいろいろ試されています。
- 【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる - Qiita
- Oriental Robotics: RNNによる学習で文豪っぽいテキストを出力させる (aka DeepDazai)
- 文字だけのRNNに自分の文章150万字を喰わせてみる - shi3zの長文日記
が、何となくの文章は作成できますがまともに意味の通った文章は作成できません... >< 。 名前であればそういう問題を回避でき実用的なアプリケーションとしても成立し得るのでは?と考え選択しました。
データの収集
何はともあれ、データの収集です。 競走馬の名前データはNetkeibaさんのサイトからクローラで取得してきました。
クローラのコードはこちら github.com
以下のような感じで賞金順に約5万頭分取得しました。
テイエムオペラオー ディープインパクト ゴールドシップ ブエナビスタ オルフェーヴル ジェンティルドンナ ウオッカ ヴァーミリアン ゼンノロブロイ スペシャルウィーク タップダンスシチー メイショウサムソン ホッコータルマエ エスポワールシチー ダイワメジャー メジロマックイーン (以下続く)
学習
yusuketomotoさんのコードを一部だけ修正して学習します。
修正した点
- 単語単位で入力するのではなく文字単位で入力する
- 名前の最後に終端記号
<eos>
を挿入し、これも入力する
学習のコードはこちらです。 github.com
学習時間は手持ちのGPUなしのMacBookProで50分ちょっとでした。 epoch数を始めパラメータはチューニングせずにとりあえずそのまま使いました。
名前の生成
学習した結果を使って生成してみます。
オリジナルのコードから修正している点は
<eos>
が出力されたら改行コードに置き換えて出力
だけです。
1epoch後の学習データから生成してみると、、
$ python sample.py --vocabulary data/umaname/vocab.bin --model cv/charrnn_epoch_1.20.chainermodel
ドキドキ、、
ポィー コンモカッゴード エンボラータンド コシャンシィード ジァブナンシュベ ダイシッハーブゲ ダイキビビィ フメボシャタブウス マエンジィニスアイ アインチルダントス スエーショモンダ ホイナードフロム スロフミニント トサトフリクテケリー (以下、続く)
おぉ、なんとなく馬の名前っぽい (^^)
さらに学習してみます。 50epoch学習した後で以下のように生成されました。
シタ メジロモスカル コスモフローラ アカネホール タイコウ フジノフェアリー メイショウドナバブ ラウンドストール ミサフルチャペル トウショウコラント トウショウタキフ イデルスユー ダークストーリー トーセンミューター (以下、続く)
「トウショウ」や「トーセン」といったおなじみの冠名も再現されてます。より馬名っぽくなりました!
成功です。ヾ ( ´ ρ ` ) ノ
デモサイト
こちらにあります。
https://tanakatsuyo-umaname-generator.herokuapp.com/
「Get one」ボタンを押すとコンピュータが生成した名前をランダムで表示します。 仮想の馬名を使いたいけど考えるのが面倒だというシチュエーションで役立つと思います。。