読者です 読者をやめる 読者になる 読者になる

鴨川にあこがれる日々

軽い技術っぽい記事かいてます

NNLMで城ヶ崎美嘉のセリフを学習してみた

はじめに

これに関係した記事になります.
nzw.hatenablog.jp



当時はnumpyを使ってNNを記述しましたが,ここ最近は遊びでchainerとかkerasなどのライブラリを使っています.
今回は思いつきでkerasでセリフの再現ができるが試してみました.

手前味噌で申し訳ないですが,関連する情報としては

github.com

  • nzwが書いたQiitaのkeras記事

qiita.com

あたりを参考にしてください.


入力の系列は思いつきでして,日本語は英語と違い明確な文の区切りがないため,形態素解析を行い単語に分割する必要があります.
そこで単に1文字単位で入力するとどうなるのかを試してみました.

NNLMはざっくりいうとニューラルネットワークを使って1つ前の単語系列を使って次にくる単語の予測(確率値を求める)を行うモデルです.

環境

本題

www18.atwiki.jp
から片っ端に城ヶ崎美嘉のセリフをとってきます.

とってきたデータは以下の様な感じです.

はじめまして★城ヶ崎美嘉だよー。アイドルだろうと何だろうと、どうせやるならオンリーワンよりナンバーワンになりたい!ってことで、一緒にトップアイドル、目指そうね!

いい話ですね.
まずこれを文字ごとに分割し,文末であることを明示するために末尾に <eos> を加えます.

は じ め ま し て ★ 城 ヶ 崎 美 嘉 だ よ ー ...

これを使って学習を行います.

最初は
"は"を入力として受け取って使って"じ"を出力する確率が高くなるようにNNを学習します.
次は
"は じ"を入力として受け取って使って"め"を,
"は じ め"を入力として受け取って使って"ま"を,
というふうに末尾まで行い,これを全セリフ218件を使って学習します.

その結果を使い,セリフの最初の適当な1文字をいれて,その次にどのような文字がくるのかを予測させます.
それを文の最後(<eos>)まで繰り返せばセリフが再現できるはずです.


コードは以下になります.


gistc5fcfa0b1c62590764d4097387e16604


だいじなのは

Epoch 1/1
7049/7049 [==============================] - 46s - loss: 5.1615    
0 プ ぎ カ ロ 、 ア い 、 ュ も 愛 ご な と ロ カ タ ? ー シ っ ん <eos>

の読み方で,
0というのが0スタートで学習した回数です.
1回につきすべてのセリフを使って学習をしています.
ギャル語みたいな文字列は,"プ"を入力として与え<eos>がでるまで予測を繰り返し行った結果です.
次にくる単語はその確率にしたがってサンプルをしています.

101回目までくると

100 プ ロ デ ュ ー サ ー 、 ア タ シ は 近 そ 見 か 車 い て て ゃ ね ★ <eos>

私たち"プロデューサー"という文字列を含んだ文らしきものができています.

1番最後は"プ"を入力としたときに次に来る確率が最も高い単語をつかいます.
予測した単語を含めた状態で,また最も高い単語をという風に<eos>がでるまで繰り返しています.

その結果

プ ロ デ ュ ー サ ー 、 ア タ シ の 飲 み か け し か な い け ど … コ レ 飲 む ?

完璧です!!!


以上です.