すのふら

すのふら

日々の備忘録

全148曲からディープラーニングでアイカツ!っぽい曲を探す

adventar.org
アイカツ!Advent Calendar18日目のエントリーです。
会社のLT大会で発表したネタになります。

今回は「アイカツ!」シリーズの歌詞を使用して以下観点から一番アイカツ!っぽい歌を出そうというのが目的。

  1. 頻出単語トップ10
  2. 歌詞の関連度をディープラーニングを用いて分析

ちょいちょいやっているネタですね。
snofra.hatenablog.com
snofra.hatenablog.com


登壇資料


分析内容について

頻出単語ベスト10から見るアイカツ!

頻出単語を出す前の仕込み

アイカツ!の歌から単語を取り出そうとしているときにいくつかやることがあって、それが以下3点。

  1. 表記ゆれの修正
  2. 歌詞の分かち書き
  3. ストップワードの削除

まずは形態素解析を使用して、各品詞単位で分割する。
f:id:snofra:20181221174937p:plain

そのあとに上記3点の観点で修正していく。
f:id:snofra:20181221174941p:plain

分かち書きする

上記はSTARTDASH SENSATIONの冒頭の歌詞だけど、まずは分かち書きする。

わかち書き(わかちがき)とは、文章において語の区切りに空白を挟んで記述することである。分かち書き・別ち書きとも表記する。
わかち書き - Wikipedia

これをやって品詞単位で分割する。
「I have a pen」のようにして後続でどれが名詞で動詞で形容詞か分かるようにしてあげる。

ストップワードを除去する

【stop word】あまりにたくさん検索にかかりすぎるので、検索精度の向上のためには検索対象から除外せざるを得ない語。助詞や助動詞などの機能語(日本語ならば「は」「の」「です」「ます」など、英語ならば「the」「of」「is」など)は、殆んどの場合これに該当する。
ストップワードとは - はてなキーワード

今回は「する」や「いる」などの単体で使用してもよくわからないが、大量に出てくるワードをピックアップして除去した。

単語の名寄せ作業

一緒に単語の名寄せ、例えば「わたし」や「ワタシ」を「私」に名寄せする作業を行っていく。

これをしっかりやればやるほど後々の精度が上がるんだけど、どこまでやるのかっていうのが、業務でもポイントになる点だったりする。

POSデータの分析にしても商品名はかなり表記ゆれる。数千数万商品を全部同じように直すのは無理なので、ある程度方針決めてやる必要がある。

今回は一番泥臭く全単語を出した後に目検で人力で寄せるべきリストを作っていく形にした。
この作業が一番面倒くさい。


頻出単語ベスト10

総単語数は3656で、その中のトップ10はこの単語。
f:id:snofra:20181221174946p:plain

この結果は大体前回分析したときと同じかなー。
snofra.hatenablog.com

この結果から見ても歌詞から見る「アイカツ!」とは
「今日」から「笑顔」で「未来」、「夢」に向かうアニメなんじゃないかと。

「私」から「君」というのも「アイドルとファン」「アイドルとアイドル」と二つの意味があるのかなって。


頻出単語を一番使っている歌はなんだ

f:id:snofra:20181221174950p:plain

というわけで頻出単語を一番使った曲は「ドラマチックガール」でした!

ベスト10は以下。
f:id:snofra:20181221232322p:plain
この結果を見ると圧倒的に「アイカツ!」の曲が多い。
アイカツフレンズ!」の歌が1曲もランキングに上がらなかったのが印象的。

「signalize」や「ダイヤモンドハッピー」、「SHINING LINE*」のシリーズ初期の曲がランクインされているので、その頃が色濃く出ていたのだと推察される。


ディープラーニングから見るアイカツ!

次にword2vecのskip-gramモデルを使用したディープラーニングを用いて、一番「アイカツ!」っぽい曲を出したいと思う。

俺の解説よりも100倍分かりやすいサイトがあるので、詳細はそちらを見たもらったほうが良い。

www.randpy.tokyo

pira-nino.hatenablog.com

結局何ができるのというのかというのをざっくり書く。
f:id:snofra:20181221175001p:plain


Skip-Gramモデルについて

f:id:snofra:20181221175005p:plain
ある次元数、ここでいうところで6単語を掛け算して、それぞれ「今日×生まれる」「今日×かわる」……を解析して一番それっぽいものを特定していく。
つまりベクトル同士の関連度を設定することになる。

f:id:snofra:20181221174957p:plain*1

もうちょい絵で表現すると、ある次元数(ここでいうところの「怠惰さ」「イチロー」「プログラマー」「パリ」の3次元)を解析して、怠惰さに一番マッチするのが「プログラマー」となる。

だからこの中では「怠惰さ」≒「プログラマー」となる。


今回は「アイカツ!」という言葉に一番近い言葉を探す

f:id:snofra:20181221174953p:plain

アイカツ!」の類似度をチェックするのに教師あり学習をしていくので、モデルを作る。

そのうえで、ベクトルの次元数は300とした。
日本語は大体50~300くらいだけど、3600単語くらいなら200以上かなーという感じで調整した。

学習に使用する単語から前後10語くらいを見ているんだけど、それだと文脈まで読んじゃうので微妙だったかも。
最初は前後5語くらいにしていたんだけど、いい結果が出なくて調査を重ねた結果ここに収まった感じ。

学習率は0.015でデフォルトの0.025よりは学習率を落とした。
これも最初デフォルトだったんだけど、いい結果が得られなくて少しずつ落としたという感じ。

モデルを作るうえで思ったのが、地道に微調整するもんなんだなっていうのと、ある程度結果ありきでモデルをつくっていくんだなというところ。


ディープラーニング的に一番のアイカツ!曲はなんだ

f:id:snofra:20181221175008p:plain
Skip-Gramモデルを使った一番のアイカツ!曲はアイカツ☆ステップ!」でした!

この類似度の高い単語はほぼこの曲で占められていたものになっていた。
これは文脈でとらえすぎたからというのも要因だと思うけど、局長もアイドル感あふれているし、「アイカツ!」っぽさのあるのでこれはいい結果だったかなと思っている。


アイドルが何をするのがアイカツ!なのか

最後にアイドルが何をするのがアイカツ!なのかという点を見ていく。
f:id:snofra:20181221175013p:plain

アイドルが「成長」するために「一直線」に「頑張る」ことがアイカツ!なんだなあ