ラップボット界のホームラン王、現る
こんにちは。ラップボットプロデューサーの @masaki925 です。
今年もこの季節がやってきました、毎年恒例のラップボットです。
昨年は流行りのBERT に手を出して痛い目を見ましたが、今年も懲りずにやっていきたいと思います。
ラップの強さと韻の飛距離
私の目標の1つは強いラップボットを作ることです。
では、強い、とはなんでしょうか?
韻の硬さ、フロウの柔軟さ、エモいバックグラウンド、色々あると思いますが、
ライムのクオリティを測る指標として、韻の飛距離という概念があります。
こちらの記事が参考になります。
https://news.1242.com/article/209776
R-指定:「A」という言葉と「B」という言葉で踏もうとしたら、「A」と「B」の言葉の響きは近ければ近いほどいい。でも、その内容がかけ離れていれば離れているほど、韻として面白いというか。
...
(中略)
...
R-指定:その時、ZORNさんがブワーッと電話越しで言ってくれたのが、「表参道のオープンカフェより、お嫁さんと食う醤油ラーメン」っていう。この飛距離、わかる?
バトル中にこんな飛距離あるライミングをされたら思わず吹っ飛ばされてしまいますね。
今年はこの韻の飛距離を計測すると同時に、宇宙の果てまで飛んでいくようなパンチラインをかますラップボットを開発しました。
韻の飛距離メー(タ|カ)ー MC ドカベン
韻の飛距離メーター 兼 韻の飛距離メーカー、MC ドカベンです。
あなたがキックしたバースの飛距離を採点するのと同時に、 アンサーとなるバースを飛距離と共に返し、飛距離を比較して勝敗を判定してくれます。
※ めちゃくちゃ重いです。。辛抱強くお試しください
国際航空連盟によれば高度100km (100,000m) からを宇宙と定義しているらしいので、宇宙旅行も夢じゃありませんね。
ぜひお友達になって、ガガーリンも真っ青な長距離砲ライムをかましてみてください。
※ 予算の都合上、年内いっぱいで活動休止するかもしれません。BERT メモリ食い過ぎ。。ということで、バトルはお早めに!
以降、開発の裏側の話です。
MC ドカベンのつくりかた
アルゴリズム編
まず、ライムを作るときの人間の思考方法について考えました。
それがこの図です。
時間がない 企業秘密のため詳細は省きますが、
要するに、「まず2小節目に使うキラーフレーズを選んで、そこに韻を乗せるように1小節目を構成する」です。
加えて、アンサー要素として「相手のバースに関連した内容を入れ込む」ことと、
レペゼン要素として「自分のキャラに合った内容を入れ込む」です。
MC ドカベンでは、この1小節目と2小節目の組み合わせをいくつか試行して、もっとも飛距離が出るものを採用することにしています。
※ 今回はとりあえずレペゼン「野球」に固定しています。
飛距離に関しては、ラップボットコンサルタントのkenichi 氏に教えてもらいました。まじリスペクト。
細かい部分は色々とありますが、ざっくり上記の方針でロジックを組んでいます。
実装編
ソースコードです。
前回までと同様、LINE Messenger API を利用して、フロントはRails, 裏側はFlask で構成しています。
学習済みモデルなどでかいファイルはignore してあります。
正直中身ぐちゃぐちゃです。
肝は、小節間の意味的な距離を測るためにBertScore を利用している部分でしょうか。
ただ、精度的にもサイズ的にもこれじゃなくてもいいのでは感が否めません。。今後の課題です。
キラーフレーズには、水島新司さんの野球漫画「ドカベン」から名言っぽいものを拝借しました。「飛距離」から着想を得ています。 今は数が少ないと、ラップっぽくないものも多数混ざってしまっているので、改善の余地が大量にあると思います。
文章生成のマルコフ連鎖の部分は、以前作ったDJマルコのコードをベースとして、少し改良したものになっています。
他にもBERT 使うためにDocker コンテナサイズと格闘した話(負けた) とか、Heroku でCedar が古すぎてupgrade のためにbuildpack と格闘したりしました(勝った) が、今年は 時間の都合 企業秘密で詳細は割愛します。
気が向いたら別記事を書くかも。
なにか気になるところあればコメントでもDM でもください。
以上です。良いお年を!