圧倒的成長

日々の備忘録

湘南乃風の歌詞解析をする Part0 -前準備-

湘南乃風、イイぞ。 なんでハマったかは後ほど書くとして(けっこう深い理由がある)、今回は湘南乃風の歌詞解析をしてみた。これはその記録。

5thとコンセプトアルバムである「踊れ」以外、つまり1stから8thまで聴いたわけなんだけど、なんとなく最近のアルバムは曲がマイルドになっている気がしていた。 初期のヤンキー感というか・・・不良感というか・・・ギャングスタ感?がほぼなくなっている印象があった。歌詞も同じように物騒な単語が減ってきて、万人受けする普遍的なJPopみたいになっている感じがした。 今回はそれを検証するため、各アルバムで使われている言葉を調べてみて、ワードクラウドを使って可視化してみようと思った(ワードクラウドを使ってみたかったというのもある)。Pythonにはワードクラウドを簡単に作れるword_cloudというパッケージがあるので、特に苦労せずできそう。

まずは湘南乃風の歌詞を取得する必要がある。Webで悪いこといろいろするときのお供BeautifulSoupを使って頑張るわけだけど、著作権的にグレーな気がするからコードは書かない。 湘南乃風の歌詞はここが詳しい・・・のだが、実はこのページには不備がある。アルバムに含まれる、メンバーのソロ曲の一部(たとえば4thアルバム「Joker」収録の若旦那ソロ曲「ダイヤモンド」)が除外されている。あぶねぇ。スクレイピングだけでは見逃すところだった。

とりあえず頑張って全アルバム(たぶん・・・)の歌詞を取得した。でもどうやら上記サイトに掲載された時点で誤植があるようで、例えば4thアルバム「Joker」収録の「睡蓮花」の名フレーズ「レゲエ<砂浜<<Big Wave!!」が「レゲエ<浜辺<<Big Wave!!」になっている。言語道断だろこんなん。こういうのは手作業で直すしかない。分かった部分は直したけど、まだ間違っている部分はありそう。まぁしょうがないか。

とりあえず歌詞を収集したのち、アルバムごとにテキストファイルにまとめて保存した。 テキストファイルの中で、一行につき一フレーズが記録されている。イメージは下記。

...
目を閉じれば 億千の星 一番光るお前がいる
初めて一途になれたよ 夜空へ響け愛のうた

大親友の彼女の連れ おいしいパスタ作ったお前
家庭的な女がタイプの俺 一目惚れ
大貧民負けてマジ切れ それ見て笑って楽しいねって
優しい笑顔にまた癒されて ベタ惚れ
...

何回聴いても思うんだけど、大貧民になっただけでマジ切れするってどんだけ沸点低いんだ。

湘南乃風 feat. MeCab

これを形態素解析ライブラリであるMeCabを用いて単語レベルで分解した後、前処理を加えたうえでワードクラウドで処理して頻出語を可視化する流れになる。

基本的には一行ごとにMeCab分かち書きを行い、単語レベルで分解。 その後品詞ごとに独自の処理を行った上で得られた文章(実質的には単語の集合)を利用してワードクラウドを作成した。

このようなリリックがあるとして、

word = "大親友の彼女の連れ おいしいパスタ作ったお前"

MeCab分かち書きをする(mt.parse(word).split())と以下のようになる。

['大親友\t名詞,固有名詞,一般,*,*,*,大親友,ダイシンユウ,ダイシンユー',
 'の\t助詞,連体化,*,*,*,*,の,ノ,ノ',
 '彼女\t名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ',
 'の\t助詞,連体化,*,*,*,*,の,ノ,ノ',
 '連れ\t名詞,一般,*,*,*,*,連れ,ツレ,ツレ',
 'おいしい\t形容詞,自立,*,*,形容詞・イ段,基本形,おいしい,オイシイ,オイシイ',
 'パスタ\t名詞,一般,*,*,*,*,パスタ,パスタ,パスタ',
 '作っ\t動詞,自立,*,*,五段・ラ行,連用タ接続,作る,ツクッ,ツクッ',
 'た\t助動詞,*,*,*,特殊・タ,基本形,た,タ,タ',
 'お前\t名詞,代名詞,一般,*,*,*,お前,オマエ,オマエ',
 'EOS']

こんな感じで単語ごとに品詞が分かる。たまに間違っていたりあやしいときもあるけど、基本的にはMeCabを信じる。

基本的には準備した歌詞のテキストファイルを読み込み、一節ごとに分かち書きして単語に分解、それをword_cloudで処理すれば良い・・・のだけど、 単に単語で分解しただけでは、助詞や助動詞が頻出語として表示されてしまうので、ここから若干恣意的な操作をして一部の単語を除外する。

具体的には、word_cloudで処理する品詞は"名詞", "形容詞", "感動詞", "副詞"に制限した。"感動詞"はなんとなく面白そうだったので入れただけで普通は除外して良いと思う。

品詞ごとには以下の処理を加えた。

  • 動詞の場合、活用形ではなく基本形(終止形)を利用する
  • どうやら英単語は名詞として扱われるようなので、名詞は一律str.lower()で小文字にする(日本語には影響なしのはず)
  • 名詞の語尾に!のようなが感嘆符が付いたままになるときがあるので、強制的に除去

そこそこ恣意的ではあるものの、これで歌詞中の単語を整形した上で、word_cloudで処理すれば良い。

arranged = [] # 整形した単語を要素として含むリスト

splitted = " ".join(arranged)
wc = WordCloud(font_path="/path/to/font", 
               collocations=False,
               color_func=color_func,
               width=1600,
               height=900,
               stopwords=stop_words,
               regexp="[\w']+")
wc.generate(splitted)
wc.to_file("word_cloud.png")

collocations=Falseにしないと単語ごとに処理してくれない。(wc.generate_from_frequencies(splitted)でもいけるかも?未検証)

stopwordsが重要で、除外したい単語のsetをここで渡す。もともと前処理の段階で助詞などは除かれているはずなので、ここではよくある代名詞などを入れた。恣意性はめっちゃある。なんてあるのか?と思われそうだけど、彼らには名曲やめちまぇ!があったり、ぜってぇみたいな崩れた日本語が存在するので、けっこう重要(だと思う)。

stop_words_jp = ["しよう", "なれる", "どこ", "どれ", "あれ",
                 "もの", "どう", "く", "たち", "ため", "なく",
                 "ちまう", "つく", "いい", "ぇ", "こう", "これ",
                 "そこ", "てる", "いる", "ある", "くる", "なる",
                 "れる", "らん", "ちま", "られる", "する", "こと",
                 "せる", "やる", "ゆく", "そう",  "ん", "よう",
                 "なん", "ら", "ない", "ここ", "の", "え", "くれる",
                 "さ", "もん", "ろう", "ろ", "それ", "ちゃう", "みる"]

stop_words_eng = ["0o", "0s", "3a", "3b", ...]

stop_words = set(stop_words_jp + stop_words_eng)

英単語のstop_words_engももちろん重要で、前置詞などはもちろん外したい。とりあえず代表的(?)な英語のstopwordsはこれを使わせてもらった。

color_funcには色を返す関数を指定することで、特定の単語だけ特別な色付けを行うなどの操作ができる。今回は, お前, , の4単語の場合のみ真っ白になるような関数を指定した(この機能めちゃ便利だ)。なんでこの4単語を特別扱いしているかというのは、後で書く。

コードの全容はGithubかなにかにアップロードしようと思ったんだが、プライベートのGithubアカウントのパスワードを忘れてしまったので後ほど・・・

基本的にはこれでワードクラウドを作った。とりあえず、2020年現在における湘南乃風の全ての曲の歌詞に対し上記の処理を行って得られた単語集合を用いて作ったワードクラウドが以下。

f:id:destroy_linux:20201005000501p:plain
湘南乃風の全歌詞から作られたワードクラウド

しかしお前の存在感がすさまじい・・・でも、なんというか、湘南乃風らしさが感じられる気が・・・する・・・

英単語で複数形をどうするかとか、故意にスペルミスしてる単語はどうするかなど課題はあるんだけど、とりあえずそこは無視して進めていく。 次(Part1)からは各アルバムごとに作ったワードクラウドを見ていきたい。ほかにも、各アルバムで使われる言葉の類似度なども調べてみたい。

しかし自分のブログに初めて登場する音楽グループが湘南乃風になるとはなぁ・・・(そもそも音楽の話題を書くかどうかも考えてなかったとはいえ・・・)