はじめに
さて、気づけば今年も8月20日。
夏が始まったばかりだと思っていたら、もう終わりを告げようとしています…
まぁサラリーマンなんで、夏休みとか関係ないんですけどね
夏といえば、やはり夏うた。夏うたを聞いて、せめて気持ちだけでも夏休み気分を味わいたくなりますよね…。
ドワンゴさんのこちらの記事によると、海の似合うアーティストの投票で、1位サザンオールスターズ2位TUBEと、3位を大きく引き離してバチバチのデッドヒートを繰り広げている模様です。
サザンは「TSUNAMI」「真夏の果実」、TUBEは「シーズン・イン・ザ・サン」「あー夏休み」と両者ともに名曲揃いで、これはどちらも優劣をつけがたい感じです。
ということで今回はPython+Mecabで歌詞の形態素解析を実施し、夏ワードの出現回数を比較することで、真の夏うた王を決定したいと思います。
ルール
- 全曲の夏ワード(「海」「ビーチ」など)の出現回数の合計を曲数で割り、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回も使っていません。**サザンは直接的な夏のワードを使わずに、夏の情景が浮かんでくるような歌詞を書くのが得意なのかもしれませんね。
Congratulations!
TUBE is king of summer.
コード
最後に集計用のコードを記載しておきます。
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)