見出し画像

歌詞から見る、秋元康とさっしーの違い【歌詞分析】


はじめに

構文解析のお勉強の一環として、僕の好きな坂道アイドルの歌詞分析を行って遊んでいたときに、秋元康さんと指原莉乃さんで歌詞傾向に違いはあるのか?ってことが気になり、比較してみました。

個人的には、恋愛ソングでお二方の歌詞系統に違いがでるなと直感的に感じてます。
秋元康さんは男性目線の歌詞が多く、失恋した際には僕が悪かったや、君のような素敵な人はもいない系の歌詞が多く
一方、指原さんは、私降るなんて見る目ない、私より幸せにならないで、後悔させてやるといった、強い女性の歌詞が目立つと思います。

歌詞を入手

歌詞情報サイト歌ネット(utanet)から該当アーティストさんの歌詞を取得しました。
サーバに負荷を与えないため、1つの歌詞ごとに1秒待機するようにしています。

#ライブラリインポート
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
import datetime
import time
import re

#取得したデータを格納するデータフレームを作成
songs_df = pd.DataFrame(columns=['song_name','lyrics'])

#Uta-Net先頭URL
base_url = 'https://www.uta-net.com'
#歌詞一覧ページURL
url = "https://www.uta-net.com/artist/32604/"
artist = "joy"

#歌詞一覧ページのHTML取得
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
links = soup.find_all('td', class_='sp-w-100 pt-0 pt-lg-2')
#歌詞ページより、情報を取得
for link in links:
  a = base_url + (link.a.get('href'))
  
  #歌詞ページよりHTMLを取得
  response_a = requests.get(a)
  soup_a = BeautifulSoup(response_a.text, 'lxml')
  #曲名取得
  song_name = soup_a.find('h2').text
  #歌詞取得
  song_lyric = soup_a.find('div', id="kashi_area")
  song_lyric = song_lyric.text
  song_lyric = song_lyric.replace('この歌詞をマイ歌ネットに登録 >このアーティストをマイ歌ネットに登録 >',' ')
  song_lyric = song_lyric.replace('\n','')   
    

  # 新しいデータを作成する
  temp_df = pd.DataFrame(
    [[song_name, song_lyric]],
    columns=KingGnu_songs_df.columns
  )
  # 既存のデータフレームに新しいデータを追加
  songs_df = pd.concat([KingGnu_songs_df, temp_df], ignore_index=True)
  #2秒待機
  time.sleep(2)

#csv出力
songs_df.to_csv("./lyrics/" + artist +'_songs_df.csv', mode='w')


分かち書きと可視化の実行

分かち書きとは、英語のように単語の間に区切り(スペースや改行)を入れて表現することを指します。

日本語は英語のように空白がなく、文章構造をそのままでは機械が読み取ってくません、そのためそれらを分ける「分かち書き」という工程が必要になります


風船は生きているの「分かち書き」
from janome.tokenizer import Tokenizer
import pandas as pd
import re

artist = "saka_marge"

#df = pd.read_csv("saka_marge_songs_df.csv")
df = pd.read_csv("./lyrics/" + artist + "_songs_df.csv")
song_lyrics = df['lyrics'].tolist()
df.info

t = Tokenizer()

results = []

for s in song_lyrics:
    tokens = t.tokenize(s)

    r = []

    for tok in tokens:
        if tok.base_form == '*':
            word = tok.surface
        else:
            word = tok.base_form
        # part_of_speech(品詞)
        ps = tok.part_of_speech

        hinshi = ps.split(',')[0]

        if hinshi in ['名詞', '動詞', '形容詞']:
            r.append(word)

    rl = (' '.join(r)).strip()
    results.append(rl)

text_file = "./wakachi/" + artist + "_ALL_wakachi.txt"
with open(text_file, 'w', encoding='utf-8') as fp:
    fp.write('\n'.join(results))

分かち書きが終わったら、可視化していきましょう

from wordcloud import WordCloud
from matplotlib import pyplot as plt
import japanize_matplotlib
from PIL import Image
import numpy as np

artist = "nogizaka"

f = open("./wakachi/" + artist + '_ALL_wakachi.txt', 'r', encoding='UTF-8')
# 日本語表示のためのフォントパス
fpath = 'C:\Windows\Fonts\meiryo.ttc'
text = f.read()

# 除外ワード設定
stop_words = ['そう', 'ない', 'いる', 'する', 'まま', 'よう',
              'てる', 'なる', 'こと', 'もう', 'いい', 'ある',
              'ゆく', 'れる', 'なっ', 'ちゃっ', 'ちょっ',
              'ちょっ', 'やっ', 'あっ', 'ちゃう', 'その', 'あの',
              'この', 'どの', 'それ', 'あれ', 'これ', 'どれ',
              'から', 'なら', 'だけ', 'じゃあ', 'られ', 'たら', 'のに',
              'って', 'られ', 'ずっ', 'じゃ', 'ちゃ', 'くれ', 'なんて', 'だろ',
              'でしょ', 'せる', 'なれ', 'どう', 'たい', 'けど', 'でも', 'って',
              'まで', 'なく', 'もの', 'ここ', 'どこ', 'そこ', 'さえ', 'なく',
              'たり', 'なり', 'だっ', 'まで', 'ため', 'ながら', 'より', 'られる', 'です',"の","さ","ん","何"
                ]

#マスクイメージ読み込み
image_color = np.array( Image.open( "./mask/" + artist + "_mask.png" ))

wordcloud = WordCloud(
                        font_path=fpath,
                        width=900, height=600,
                        background_color='black',
                        colormap='BuPu',#nogi color
                        #colormap='Blues_r',#hinata color
                        #colormap='RdPu',#sakura color
                        stopwords=set(stop_words),
                        mask = image_color,
                        max_words=500, # default=200
                        min_font_size=4, # default=4
                        collocations=False # default = True
                        ).generate(text)

plt.figure(figsize=(15, 12))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig("./result/" + artist + '_lyrics.png', dpi=300)
plt.show()

そう、ない、いる 等の日本語特有の意味のない言い回しをここでは
削除しています

結果

さぁ、お待ちかねの結果です!
(せっかくなので、それぞれのグループ毎のトリミングして出力してみました。)

坂道内での比較

3坂道の比較画像

坂道間の違いは少なく「僕」「君」「誰」が大部分を占めていますね
「僕「君」が多いのは直感で分かりましたが、「誰が」が上位に入るとは思わなかったですね。

「Oh」の比率が一番多いのは乃木坂だと思いましたが、櫻坂だったのが以外だOh!

秋元康とさっしー

坂道アイドルとイコノイジョイ

おー、結構な違いがでましたね
「僕」が多い坂道アイドルと対照的にイコノイジョイでは「私」が増えていることから後者では女性目線の曲が多いことがわかりますね

また、イコノイジョイでは「好き」や「love」「恋」「愛」といったラブソング系統の歌詞が多いことが読み取れますね
好きって歌詞がいっぱい入ってるのかわいいっすね

ただ、坂道に関しては曲数が多すぎるのか、特に傾向といったものが読み取れず、、、

💬次は坂道の中で歌詞から曲をクラスタリングして遊ぼうかしら、、、

おまけ

最近、3期が始まって激熱なLiellaさんの歌詞もついでに分析してみました。

Liella

同じアイドルですがこちらは「夢」や「未来」といったポジティブなワードが多く、応援ソングが多いことがわかりますね

実際に聞いてみると、がんばろうと思える歌詞が多いので、興味ある方
(ない方も)お手すきの際に聞いてみてください

https://music.youtube.com/watch?v=uQ-OH9Pek88&si=zfYcZjYttXmNCgwV

終わりに

ひよっこエンジニアによる、歌詞分析でした。いかがでしたか?皆さんも考察とかあったら是非、コメントやXにて教えてください!

こういう分析だったりするのが好きなのですが、坂道界隈だとやってる人があまりいないので少し寂しいですね、、、


もっと技術を使って面白いことがしたいので、坂道オタク(じゃなくても)仲良くしてくれる人がいたらお声がしていただけると嬉しいです。



参考にさせていただいた記事と本

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ) [ 国本 大悟 ]


いいなと思ったら応援しよう!

セカンド
頂いたサポートは余すことなくミーグリに還元されていきます

この記事が参加している募集