形態素解析でアイカツ!シリーズのテーマを知る

初記事です。

目次


やったこと

アイカツ!」と「アイカツスターズ!」の曲の歌詞を解析しました。 解析と言っても頻出単語を調べただけですが。

対象楽曲

アイカツ!フォトonステージ!!」楽曲も含め、アイカツ!は102曲、アイカツスターズ!は37曲を対象とし、「AIKATSU GENERATION」「アイカツメロディ」「ラン・ラン・ドゥ・ラン・ラン!」の3曲は両タイトルを合わせた解析にのみ使用しました。
全部で何曲リリースされているのか把握していないので、取りこぼしがあるかも知れません。
もしかするとタイトルの分類ミスがあるかもしれませんが、1, 2曲ならまあ誤差かなと思います。


結果

使用回数の多かった単語上位20位は以下の通り。同率20位の単語もありましたが割愛。

f:id:FunMocha:20180604091126p:plain

21位以下も含め、単語の使用回数をワードクラウドで可視化したものが以下になります。 「'」が付いた単語がめちゃくちゃ気になりますが、理由は後述

これぞアイカツ!って感じですね。
「夢」「未来」が両タイトルともトップに並んでいます。特に「夢」の使用回数は圧倒的。
アイカツ!シリーズを観れば誰もが感じ取るかと思いますが、やはりこの辺りがシリーズを通して描こうとしている一番大きなテーマだと思います。自分なりの夢を見つけて突き進んで行って欲しいという子供達へのメッセージを強く感じる作品です。
(22歳女児)もいちごちゃん達が夢に向かって力強く成長していく姿に心を動かされた人間の一人で、その影響で人生大きく好転したと思っています。
本当にありがとうアイカツ

また、見事に明るいイメージの単語ばかりが並んだわけですが、この傾向は作品本編にも当てはまる部分かなと思います。(話が逸れ始める)
アイカツ!」の登場人物達は皆お互いにライバル関係にありますが、他者を否定するような発言は一切せず、常に認め合い、励まし合い、称え合います。なので対人関係で負の気持ちを抱くような展開はなく、シリアスな展開は少しあったりますが常に救いがあるので安心して観ていられる作品です。(宣伝)
そんな風にストーリー、歌共に前向きで明るい雰囲気に溢れているのが、多くの大きなお友達に愛されている理由の一つかなと思います。(解析結果殆ど無視でアイカツの話をするだけになってしまったのでこの辺で止めます)


折角なので「夢」「未来」と聞いてパッと思い浮かんだ曲を貼っておきます。(本当はアニメ版のバケモノクオリティのCGステージを観てほしいしCD音源のフルVer.を聴いてほしいけど公式動画はこれしかない)

どちらもアイカツらしさ溢れる曲なので、観たことがない人は是非聴いて雰囲気だけでも知ってください。
アイカツファン以外でこの記事に辿り着く人は少ないと思いますが。

www.youtube.com

www.youtube.com

追記

記事を読んでくれた友人から、1つの楽曲中で同じフレーズが繰り返されていることを考慮すべきでは?という指摘を受けました。

仰る通りだと思います。

そこで、コードを少しだけ弄って1曲1カウントまでのルールで数え直しました。結果は以下。

f:id:FunMocha:20180604222409p:plain

多少順位の入れ替わりが起きましたが、大きな変化はないですね。
基本的にはサビの回数が減るだけの違いかなと予想しましたが、回数の変化を見てもまあそんなとこだろうと思います。
大きなミスではなかったのでめでたしめでたし。


作業の流れ

1. 歌詞のスクレイピング

著作権的に問題アリだと思うのでスクレイピングしたサイト名は伏せます。 スクレイピングにはBeautiful Soupを使用しました。何度か使ってるけど使い易いと思う。
PythonとBeautiful Soupでスクレイピング

2. 形態素解析で名詞を抽出

Janomeを使用。MeCabの方がメジャーですが、以前Janomeを使ったことがあり特に悪い点もなさそうだったので。
python で形態素解析。Janome が簡単。pip 一発でインストール | コード7区

3. 各名詞の出現回数を調べる+可視化

可視化にはWord Cloudを使用。こんなライブラリまであるなんてPython様様です。
Word Cloudで文章の単語出現頻度を可視化する。[Python]


つまづきポイント・気付きなど

Chromeなんかのブラウザでは、開発者ツールを使えば簡単にページ中の特定の要素のCSSセレクタをコピーできて、

body > table:nth-child(1) > tbody > tr > td:nth-child(2)

こんな感じの文字列を取得できます。(これは適当に作った例ですが)

BeautifulSoupでは

soup = BeautifulSoup(html)
soup.select(selector)

という感じでCSSセレクタを使用したスクレイピングもできるんですが、上記のコピーしたてホヤホヤのセレクタをそのままブチ込むと怒られました。 上記の例だと以下の修正が必要。

  • table:nth-child(1) → table:nth-of-type(1)
  • td:nth-child(2) → td:nth-of-type(2)
  • body, tbody → 省略

微妙に面倒な作業。今回必要だった修正はこれだけですが、他にも修正が必要なパターンがあるかも。変換ツール作っておけば今後楽かな。

  • 抽出した名詞に含まれるノイズ

Janomeで品詞が名詞であると判定された単語の使用回数をそのままランキングにすると以下の様になります。

順位 単語 回数
01 ! 504
02 ( 427
03 ) 366
04 189
05 , 163
06 わたし 140
07 130
08 118
09 未来 116
10 よう 113
11 ? 112
12 みんな 106
13 ' 105
14 笑顔 103
15 今日 94
16 94
17 こと 92
18 キミ 92
19 世界 92
20 !! 82

記号まみれで最悪です。「の」「ん」のような平仮名一文字も特に意味を持たないので消した方が良さそう。なので以下の正規表現を利用して除外しました。(正規表現ってどうすれば覚えられんですかね)

"[!-~]" # 半角英数字記号
"[ぁ-ん]" # 平仮名
"[ァ-ン]" # 片仮名

また、10位の「よう」の様な単体では特に意味を持っていなさそうな単語(「みたい」や「そう」など)は人力で除外。
今回は一人称代名詞、二人称代名詞、こそあど、英単語なども除外しました。

  • Word Cloudライブラリの欠点

このライブラリ、かなりイイ感じな画像を生成してくれて素晴らしいな~と思っていたんですが、欠点がありました。
恐らく作成者さんが英語での使用しか想定していないためだろうと思いますが、一文字の単語はWord Cloudに反映してくれません。(もし対応するためのオプションがあったらすみません。というか教えてください。)
なので今回は一文字の単語には適当に「'」を足して表示させました。凄くダサいのでなんとかしたい。

  • 便利なCounter

リスト中に各要素がいくつ含まれているかを数えてくれるCounterという物の存在を知る。

from collections import Counter

ls = ["A","B","C","D","A","A","B","A","C","B"]

cnt = Counter(ls)

print(cnt)
 # Counter({'A': 4, 'B': 3, 'C': 2, 'D': 1})
    
print(cnt.most_common(3))
 # [('A', 4), ('B', 3), ('C', 2)]

今までfor文回してました。普通に便利なので今後は頼っていきたい。


最後に

触ったことのあるライブラリだけで出来るし簡単だろ~と思いながら取り掛かりましたが、ちょこちょこ気付きがあって良かったです。
初めての記事なので気合い入って当初の想定より丁寧(?)に書いてしまいましたが、今後もこんな感じでやったこととか気付きとかを書き殴っていきたいと思います。


本当は結構真面目に考察っぽいことしようかと思っていたんですが、下手に語ると陳腐な作品だと思われそうなのでザックリとした話だけにしました。

要するに、言語化が難しいくらい魂で感じる作品なので皆さんアイカツ!を観ましょう。

アイカツ!を観れば幸せになれます。