LoginSignup
4
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-20

はじめに

さて、気づけば今年も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)
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1