
どーも! まじすけです✨ 今回はpythonで曲の歌詞から曲中の感情の動きを可視化してみました。
「会いたくて 会いたくて」を初め、女性に圧倒的人気を誇る西野カナさん。
よくメンヘラの代名詞とも言われる彼女の曲を可視化してみたら面白いんじゃないかな?ということでやってみました。ちなみに「会いたくて 会いたくて」はこんな感じに出ます。(浮き沈みが激しい…)

準備
import re
import csv
import time
import pandas as pd
import matplotlib.pyplot as plt
import MeCab
import random
%matplotlib inline
title = 'nishino'
f = open(title+'.txt')
lyrics_df = f.read()
f.close()
m = MeCab.Tagger('')
print(m.parse(lyrics_df))

こんな感じに出ればひとまずokです! 続いてネガポジ判定の辞書を読み込みます。
pn_df = pd.read_csv('pn_ja.dic',\
sep=':',
encoding='utf-8',
names=('Word','Reading','POS', 'PN')
)
def get_diclist(lyrics):
parsed = m.parse(lyrics)
lines = parsed.split('\n')
lines = lines[0:-2]
diclist = []
for word in lines:
l = re.split('\t|,',word)
d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
diclist.append(d)
return(diclist)
word_list = list(pn_df['Word'])
pn_list = list(pn_df['PN'])
pn_dict = dict(zip(word_list, pn_list))
def add_pnvalue(diclist_old):
diclist_new = []
for word in diclist_old:
base = word['BaseForm']
if base in pn_dict:
pn = float(pn_dict[base])
else:
pn = 'notfound'
word['PN'] = pn
diclist_new.append(word)
pn_list = []
textlist = []
for word in diclist_new:
pn = word['PN']
text = word['BaseForm']
if pn != 'notfound':
pn_list.append(pn)
textlist.append(text)
return(pn_list, textlist)
dl_old = get_diclist(lyrics_df)
pn_list, text_list= add_pnvalue(dl_old)
aura_df = pd.DataFrame({'text':text_list,
'PN':pn_list,
},
columns=['text', 'PN']
)
plt.plot(pn_list)
plt.title(title)
plt.show

こんな感じにプロットできました。かなりマイナスの要素が強い曲でしたね。 歌詞というのは曲の中で時間とともに流れていくので、”感情の時系列データ”を抽出したとも言えるかもしれませんね。
最後までご覧くださりありがとうございました。