寄り道をしつつ**「ディアゴスティーニ」(サダゴスティーニとは節度のある大人なので言わない)的に週一頻度で記事を書いてきましたが、一応「さだロボ」**が形になったのでそれをメインテーマに記事書きます。
一応念の為にお断りしておくと、さだまさしに限らず歌手の世界を完全に再現し、詞として完成されたものを自動生成する、というのはとても難しいテーマで、週末の空き時間を使って数日で作れるものでもありません...。
なので、今回出来上がったのはユーザー操作を前提とした作詞補助ツール(?)という位置づけになります。
デモサイト
https://sadatech.herokuapp.com/sadabot
ページを開くと、candidate phrase
欄に一行、さだまさしっぽい歌詞のフレーズが表示されます。
このフレーズを使いたい場合は add
ボタンを押すとこのフレーズを採用した上で、関連のあるフレーズを新たに表示します。採用した歌詞は generated result
に表示されるようになります。
気に入らない場合は retry
を押すと別のフレーズを生成します。
作られたものが気に入らない場合は clear
を押すと全消去して最初から作り直します。
みたいな事を繰り返していくことで、さだまさし風の歌詞っぽいものが作成されていく、というものになっています。
なお、作成した歌詞を絵文字混じりの文字に変換したい方々(?)のために、絵文字変換ボタン (to emoji
) も下の方に用意してある親切設計です。
動作イメージ
実装について
文章の自動生成にはいくつかの選択肢があると思いますが、オンラインでデモを動かすという意味だとあまり計算に時間を使えないので、デモサイト上ではシンプルなマルコフ連鎖を用いています。
ただし、単純にマルコフ連鎖のロジックを使うだけだとなかなか歌詞として自然な文章にならないので、出力に強い制約をかけることでデモは実現しています。
入力
出力の前に情報ソースの話ですが、先週作成した N-gram コーパス ( http://qiita.com/moaikids/items/1d8811320098e70ca98e ) を使います。
今回は、3-gram ~ 7-gram のデータを元に学習をさせてます。また出現頻度に応じて学習スコアを少し変えています。
出力
歌詞らしい文章を出力するために、以下の制約を加えています。
- フレーズの最初の単語の品詞は「名詞」「動詞」「形容詞」など(非自立語除く)
- フレーズの最後の単語の品詞は「助詞」「助動詞」など
- 長過ぎたり、短すぎる文章は除外する
- すでに作成されたフレーズと、自然なつながりになる文章を採用する
- 今回は、作成済みのフレーズの末端の数単語と、新たに作成したフレーズの最初の数単語の組み合わせが N-gram コーパスの中に存在するかどうかでチェックをする
ローカル環境では、すでに作成されたフレーズ中に含まれている単語群と、新たに作成した単語群の Word2Vec による類似度を判定したりしていたのですが、 heroku 上で動かすには制約が多かったので外しています。
このデモを作る上で参考にしたサイト
シンプルなRNN/LSTMだけでまともな文章はできない
このアドベントカレンダーではマルコフ連鎖を使ったものを紹介していますが( RNN/LSTM を用いた例は明日書きます)、このブログ記事に書かれていた以下に引用する、コンピュータの文章生成精度を挙げるためのアプローチが参考になりました。
1.前の文字列のみを素性とするのではなく文法素性や言語資源をふんだんにぶち込む
2.大量に生成した文をからまともなものだけをピックアップする
3.生成した文を人手でチェックして修正する
4.出力に人手で作った厳しい制約を課す
5.学習させる文の種類を極端に狭める
今回のデモでは
-
- : ユーザーインタラクションを前提とした UI にして、人による選択、修正が行えるようにしている
-
- : 歌詞のフォーマットに沿いやすいように強い制約を与えている
-
- : 「歌の歌詞」「さだまさし」という狭いコンテキストに限定している
という感じです。
こういうアプローチにすることで、今回みたいなかなりナイーブなアプローチでも、そこそこな精度が保てているように思えます(主観)。
個人的に気に入っているフレーズ
以下は、いろいろためす中で遭遇した、個人的にお気に入りのフレーズです。
- 作詩:さだロボ
- 補作詩(ボタンをポチポチ押す人):moaikids
といった趣きです。
一度だけの手紙を書いた
誰かに刻んだ
恋はいつでも
僕の胸に熱が上る
振り返り消えそうな
笑顔を思い出して
人を愛してくれた
君はその時に
あなたに届くように
手を離さずに生きて
いたんだね
君の肩を抱きしめられた
時は過ぎて
恋は必ず消えて
夢を見ていた
誰かの誰かの
ために君は何処か
心に届くように
あなたの夢だった
さだまさしっぽいとも言えるし、そうでないとも言える気もしますが、、いずれにせよさだまさし氏の今までの素晴らしい曲の数々を教師データとして学習した「さだロボ」により創りだされた産物です。
いずれにせよ
じゃあ「さだロボ」はともかくとしてコンピュータアルゴリズムがさだまさし本人を超えられるかというと短期的には想像が難しく、余人には到達できない前人未到の領域に達しているさだまさし氏に、人はおろか、機械もおいそれとたどり着くことは難しいことを、あらためて実感しました。
そして、いろいろとさだまさしの詞を解析していくなかで、改めてさだまさしの作品について理解し、その偉大さを感じる、個人的にはそんなアドベントカレンダーでした。
まとめにかえて
なんとか最低限の水準では**「さだロボ」**を作り上げる事ができました。
残りの枠で、RNN で文章作成することを試してみたり、出来上がった詩にメロディ(コード進行)をつけて曲にしてみたり、なんてことが出来ればと思います。
(時間があれば、ですが。)