SONY Neural Network Console でユーミンの歌詞生成をやってみる

再びユーミンの歌詞生成をやってみます

こんにちは cedro です。

さて、先回は、ユーミンの歌詞をベクトル化し、Neural Network Console の LSTM を使って、歌詞の自動生成をする可能性を探ってみました。

その結果、なんとか行けそうな感触を得ましたので、今回は、本格的にやってみたいと思います。

 

分かち書きの不満を解消する

先回、ユーミンの歌詞を分かち書きする時に、不満な点がありました。

神様 が いて」 → 「神様 が いる て」となってしまうのです。これは出てくる単語を辞書に載っている基本形に変更しているためです。

この基本形への変更は、どのような単語が使われているのか分析する場合には有効ですが、今回の様な歌詞合成には不向きです。

なので、今回は、この変更は無しで行うことにします。

 

分かち書きをするプログラムです。

tagger = MeCab.Tagger('-Owakati -F\s%f[6] -U\s%m -E\\n') のところの -Owakati が、基本形への変更をしないためのオプションです。wakati2.py で保存します。

 

プログラム wakati2.py を実行します。yuming.txt を分かち書きした結果が、yuming_wakati2.txt に格納されます。

 

今度は単語の変質は無くなりました。

後は微調整ですが、実は拘り始めると結構手間がかかります。

今回、日本語の繋がりだけに焦点を絞りたかったので、日本語だけで意味が通るところは、英語の部分は全て削除しました。

但し、September blue moon の様に、「君はSeptember blue moo」みたいに日本語の中に英語が組み込まれている場合は、仕方なく September_blue_moo と特別な単語にしておきました。

あと、Mecab は結構細かく単語を分割するので、好みに応じて、全体を見ながら単語を結合して調整します。

例えば、「あの  ひと」→「あの人」とか。この時、エディターの置換を使って、データ全体の「あの ひと」を「あの人」に変換することに注意です。

これ、やり出すときりがないので、適当なところで切り上げます。

 

ユーミンモデルを作成するプログラムです。これは前回と全く同じです。train.py で保存します。

 

プログラム train.py を実行します。yuming_wakati2.txt を使って yuming2.model (ユーミンモデル)が作成されます。

 

ユーミンモデルで遊んでみる

単語をベクトル化すると、Neural Network Console で読めるようになる以外に、嬉しいことがあります。

それは、単語の足し算、引き算ができるようになることです。

有名な例としては、英語の文章を大量に学習させたモデルで、King ー man + woman =を計算させると計算結果は Queen になるという話があります。

せっかくですので、yuming2.model (ユーミンモデル)でも似た様なことを試して見ましょう。

 

単語の加減算を実行するプログラムです。result.py で保存します。

 

プログラム result.py を実行して ママ ー 女 + 男 = を計算させて見ましょう。答えは、直ぐ想像できますよね。

 

そうです、答えは パパ です。ちゃんと思った通りの答えを返してくれます。さすが、word2vec

 

今度はマニアックな例です(笑)。
横須賀ガール ー 女 + 男 = を計算させて見ましょう。ユーミンファンなら狙いの答えはピンと来ますよね。

 

おおっ!ちゃんと 湘南ボーイ になりました。結構やります、word2vec !

ピンと来ない方は、荒井由実時代の名作、「コバルトアワー」を聞いてみて下さい。

さて、寄り道はこのくらいにして、本題に戻ります。

 

Neural Network Console のデータセットを作成します

分かち書きをした、yuming_wakati2.txt をエディターを使って、こんな感じの1行1単語csvファイルを作成します。

 

kashi_w.csv を1行づつ読み込んで ベクトル化し、kashi_v.csv に1行づつ書き込むプログラムです。encoder2.py で保存します。

 

プログラム encoder2.py を実行します。ベクトル化した結果は、 kashi_v.csv に格納されます。

 

kashi_v.csv の中身はこんな感じ。表示されているのは、冒頭の「小さい」をベクトル化した結果です。

“[   ]” で囲まれ空白で区切られていますので、エディターを使って 、“[    ]” を削除し空白カンマに置き換え、calcで1行100列のデータとして読めるようにします。

今回は、kashi_v.csv の先頭から1200行分を使います。

1200行分のデータを100行づつ、12個のファイルに分け、0.csv 〜 11.csv のファイル名を付けて、songフォルダーに格納します。

 

これが学習ファイルです。ファイル名は、ym_train.csv とします。

 

これが評価ファイルです。ファイル名は、ym_test.csv とします。

C:直下にSNNC96フォルダーを作り、songフォルダーym_train.csvym_test.csv を格納します。

そして、DATASET画面で、ym_train.csvym_test.csv を登録しておきます。

 

ニューラルネットワークの設定をします

EDIT画面です。基本的に先回と同様です。

入出力とも、100行×100列の行列の形になりますので、100,100です。

 

学習ファイルを設定します。

 

評価ファイルを設定します。

 

CONFIG設定です。Batch Size4Max Epoch 100 と設定し、学習を開始します。

 

学習曲線はいい感じです。過学習もないようです。所要時間11分10秒です。

 

さて、評価データ x に対する予測データ x’ ですが、一目みた感じ、あまり良い結果ではないようですね(笑)。

予測データは平坦で、4つともほとんど同じ形をしている様にみえます。

0.csv 〜 3.csv で出力されますので、連結して、lstm.csv というファイル名で保存します。

 

歌詞生成の結果をみて見ます。

先回は、LSTMから出力されたベクトルを1つ1つ単語に変換していましたが、さすがにここは改善しました。

ベクトルを単語に変換するプログラムです。lstm.csv から1行づつベクトルを読み込み、lstm_word.csv に単語を書き込みます。decoder.py で保存します。

※先回上手く動かなかったのは、csvファイルから読み込んだ結果が文字列になっていることが原因でした。なので、vector=list(map(float,line)) を追加して、数値に変更しています。

 

プログラム decoder.py を実行します。

 

これはダメですね。「胸」ばっかり言ってます(笑)。
ユーミンの表現豊かな言葉のベクトルの変化に、全く追従できていない感じです。

ならば、評価ファイルには、一生懸命勉強した学習ファイルをそのまま使えば、少しは追従性が上がるかもと思ってやってみることにしました。

方法は簡単です。DATASETボタンで、評価ファイルを学習ファイルに入れ替えて、評価ボタンを押すだけです。

 

その結果がこれ。少しマシになったようです(笑)。

 

うーん。さっきよりはマシになりましたが、まだまだですね。

 

とりあえず、単語を4つづつを組して、まあまあの所を抜き出したのが、これです。

まだ、歌詞生成には、ほど遠い感じですね(笑)。

LSTMでユーミンの歌詞生成モデルに取り組んだ感想は、LSTMは表現力豊かなユーミンの歌詞にとても追従できないということです。

言い換えれば、あの常に時代を先取りして、新らしい何か創造しているユーミンが、何か規則性のある歌詞を作るなんてことはないわけですよね。

そして、何か規則性がないとLSTMは上手く動かないようです。

では、また。

コメントを残す

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

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