Python
HTML
mecab
Python3
新人プログラマ応援

サザン vs TUBE 真の夏うた王はどっちだ!? MeCabで歌詞分析をしてみた


はじめに

さて、気づけば今年も8月20日。

夏が始まったばかりだと思っていたら、もう終わりを告げようとしています…

まぁサラリーマンなんで、夏休みとか関係ないんですけどね:sweat_smile:

夏といえば、やはり夏うた。夏うたを聞いて、せめて気持ちだけでも夏休み気分を味わいたくなりますよね…。

ドワンゴさんのこちらの記事によると、海の似合うアーティストの投票で、1位サザンオールスターズ2位TUBEと、3位を大きく引き離してバチバチのデッドヒートを繰り広げている模様です。

サザンは「TSUNAMI」「真夏の果実」、TUBEは「シーズン・イン・ザ・サン」「あー夏休み」と両者ともに名曲揃いで、これはどちらも優劣をつけがたい感じです。

ということで今回はPython+Mecabで歌詞の形態素解析を実施し、夏ワード:sunny:の出現回数を比較することで、真の夏うた王を決定したいと思います。


ルール


  • 全曲の夏ワード(「海」「ビーチ」など)の出現回数の合計を曲数で割り、1曲あたりの夏ワード出現回数で勝敗を決定する。

(TUBEが約450曲、サザンが約270曲と開きがあるため、1曲あたりの比較としています。)


手法

(何らかの手法を使って)歌詞のテキストファイルを集める



すべての歌詞ファイルを結合し、文字列とする



Mecabで形態素解析



単語の出現回数を集計



出現回数を比較

歌詞ファイルの取得については、センシティブな部分かと思いますので、今回は詳細は省きます。

MeCabで形態素解析をすると、単語の分かち書きおよびに単語の品詞を取得できますので、今回は品詞が名詞のものに絞って集計しています。

なお夏ワードについては、完全に私の主観に基づき決定しています。


結果

単語/歌手
TUBE
サザン


462
118


187
57


124
66

summer
114
7

太陽
110
38

beach
80
5


43
20

真夏
42
17


35
30

湘南
32
8

wave
23
11

花火
22
6

surfin
21
0

sunshine
18
15

浜辺
14
11

結果/歌手
TUBE
サザン

合計
1327
409

曲数
454
271

1曲あたり
2.92
1.51

どう見てもTUBEがダブルスコアで圧勝です。本当にありがとうございました。

サザンは「ピースとハイライト」のように、社会問題など比較的いろいろなテーマを取り上げてる印象ですが、TUBEは夏にステータス全振りしてるので、そのあたりが影響してこれだけの差がついたのだと思います。

特徴的な部分として、TUBEは「summer」「beach」というワードをそれぞれ100回近く使用しているのに対し、サザンは10回も使っていません。サザンは直接的な夏のワードを使わずに、夏の情景が浮かんでくるような歌詞を書くのが得意なのかもしれませんね。

:bikini::bikini::bikini:

Congratulations!

TUBE is king of summer.

:beach::beach::beach:


コード

最後に集計用のコードを記載しておきます。

import csv

import MeCab
import glob
from collections import Counter

def make_word_list(all_lyric):
tagger = MeCab.Tagger('-Ochasen')
node = tagger.parseToNode(all_lyric)
word_list = []
while node:
if node.feature.split(",")[0] == "名詞":
word_list.append(node.surface.lower())
node = node.next
return word_list

def dict_to_csv(artist,histogram):
with open(artist + ".csv", "w") as csv_file:
writer = csv.writer(csv_file, lineterminator='\n')
header = ["単語", "回数"]
writer.writerow(header)
for key in histogram:
row = [key,histogram[key]]
writer.writerow(row)
csv_file.close()

if __name__ == "__main__":
# download_lyrics()
artists = ["サザン","TUBE"]
for artist in artists:
if artist == "サザン":
artist_folder_name = "southern_lyrics"
elif artist == "TUBE":
artist_folder_name = "tube_lyrics"

all_lyric = ""
for lyric_path in glob.glob(artist_folder_name + "/*"):
with open(lyric_path, "r",encoding="shift_jis") as f:
all_lyric += f.read()

word_list = make_word_list(all_lyric)
histogram = Counter(word_list)
dict_to_csv(artist,histogram)