ごゆるり日和

元気でヤンチャな子を推してるDSの備忘録など

Word2Vecを使ってBUMP OF CHICKENの歌詞を分析してみた

 

きっかけ

2019年11月3日,東京ドームにて BUMP OF CHICKEN(以下BUMPと表記) のライブに参戦してきました.

 

f:id:Kodachan:20191208025424j:plain

ライブ後に写真OK時間があるのは嬉しい

f:id:Kodachan:20191208025610j:plain

ライブ後に写真OK時間があるのは嬉しい

ライブの余韻に浸っているとき,ふとある記事のことを思い出しました.この記事を見たとき「めっちゃ簡単に自然言語処理できるやん」と衝撃が走り,「BUMPの歌詞でも簡単にコーパスを作れるだろ」という何とも安直な理由で分析を始めました.

 

注意

自然言語処理についてほぼ何も知らない状態で分析を行ったので所々間違っている可能性があります.また,数式的な話は一切しません(できません).理論的な話を知りたい方はツヨツヨな先人がたくさんいらっしゃるのでそちらの方々の記事,資料を参考にしてください.

また,普段Rを使用しているのでpythonのコードも間違いがあるかも知れません.ご了承ください. 

準備

データ収集

分析するためにはデータが必要ですね.ということでBUMPの歌詞データを準備します.ここでは明示的なやり方は割愛させていただきますが,下のQiitaの記事が参考になると思います.ちなみに,私は全て手動で集めました.

qiita.com

データクレンジング

今回,入手できた歌詞データは合計125曲でした.

しかし,このままでは少々問題があるので数曲の歌詞データを取り除き最終的に121曲のデータを使用していきます.以下に問題があると判断してデータから除外したり修正したりした曲名と理由を述べますが,特に重要ではないので読み飛ばしてもらっても構いません.しかし,自分的にはここが一番面白かったりします.

ハイブリッドレインボウ

この曲はthe pillowsがSYNCHRONIZED ROCKERSというアルバムを制作する際にカバーのオファーを出したそうです*1そのため,純粋なBUMP OF CHICKENの曲ではないと判断して除外することにしました.

Ever lasting lie

この曲はオリジナル*2とアコースティックバージョン*3の2つが存在しています.歌詞は全く同じなので一方を除外することにしました.(複数のバージョンが存在する曲は他にもあるが,この曲だけが2つ掲載されているのは謎...)(例:ガラスのブルースはオリジナル*4と28yearsバージョン*5Smileは弾き語り*6とバンドバージョン*7

OpeningとEnding

この2曲はプレゼントという曲の一部*8なので除外しました.

 

voyagerとflyby

この2曲は歌詞がカタカナで表記されているのでひらがなにする処理を施しました.

 

 

実際に動かしてみた

pythonのコードは次のQiitaの記事をほとんどコピペ参考にしました.

qiita.com

 まずはライブラリのインポートです.

import re
from janome.tokenizer import Tokenizer
from gensim.models import word2vec

次にワードを抽出する関数を定義します.

def extract_words(text):
    tokens = t.tokenize(text)
    return [token.base_form for token in tokens
        if token.part_of_speech.split(',')[0] in['名詞','動詞']]

ここでBUMPの歌詞データを読み込みます.

with open("./BUMPLyrics.txt", encoding='utf-8') as file:
    text = file.read()

これで準備は終わりです.では,実際にモデルを作っていきます.

sentences = text.split('。')
t = Tokenizer()
word_list = [extract_words(sentence) for sentence in sentences]

model = word2vec.Word2Vec(word_list, size=100,min_count=5,window=5,iter=100)

はい.これだけでモデルの出来上がりです!めっちゃ簡単ですね!

では,単語がどれだけあるかをみてみます.下のコードを実行すると単語とその数が歌詞の中でどれだけ出てきてるかがわかります.

w2c = dict()
for item in model.wv.vocab:
    w2c[item]=model.wv.vocab[item].count
w2c

今回は単語数が上位10個を表示してみます.

f:id:Kodachan:20191208050810p:plain

いきなりのExcelプロット

おおっ!何となくできてそうですね〜

ちなみに下のコードで具体的な単語数をさくっと調べることができます.

vocab_obj = model.wv.vocab["君"]
vocab_obj.count

では,Word2Vec恒例の類似語をみてみましょう.まずは,”君”の類似語をみてみます.

ret = model.wv.most_similar(positive=["君"] ) 
for item in ret:
    print(item[0], item[1])

結果:

僕 0.6448466777801514

出会える 0.46511760354042053

だす 0.41381388902664185

増える 0.4025307297706604

おかげ 0.3966715931892395

宝石 0.39443904161453247

今夜 0.3940380811691284

越える 0.3933907151222229

いた事 0.3921634554862976

一緒 0.3907034397125244

おおお!!!!できてる!!!!
”君”と”僕”が類似語っていかにもBUMPっぽいですよね!
”出会える”も”君と出会える”って解釈すればBUMPっぽいですよね!

他にもBUMPっぽい言葉と言えば”ガラス”や”猫”,”声”などがありますね!やってみましょう!!!と言いたいところですが,長くなってきたんでエモそうな結果だけを載せます.

"ガラス”の結果:

眼 0.7653242349624634

玉 0.7509319186210632

猫 0.7420406341552734

"猫”の結果:

黒 0.7920424938201904

眼 0.7430715560913086

ガラス 0.742040753364563

"声”の結果:

耳 0.6141402721405029

塞ぐ 0.6018502116203308

聴く 0.5937756896018982

エモみの塊ですね!!

エモそうなものだけ載せてるからそりゃエモみの塊になりますよね笑

大体この曲のことかなってのがよくわかりますね!Kとかガラスのブルースとかプレゼントとか.

 

次に動詞についてみてみます.BUMPっぽい動詞と言ったら”泣く”や”繋ぐ”,”走る”などが思いついたのでこれらの類似語を載せます.

"泣く”の結果:

怒る 0.7565212249755859

近く 0.5425382852554321

困る 0.4250868558883667

"繋ぐ”の結果:

紐 0.5604400634765625

離す 0.5582458972930908

離れる 0.5504225492477417

"走る”の結果:

急ぐ 0.6995325088500977

名 0.6664260625839233

手紙 0.5832282304763794

 

こちらもエモみが溢れてますね!泣くと怒るの類似度が高かったり,繋ぐと離す,離れるの類似度が高いあたりはBUMPっぽいですよね!

 

次にこれもWord2Vec恒例の足し算,引き算をやってみます.まずは”君”+”出会える”=”僕”+”?”を考えます.

ret = model.wv.most_similar(positive=["君","出会える"],negative=["僕"]) 
for item in ret:
    print(item[0], item[1])

結果:

教える 0.47623467445373535

いつか 0.4419512152671814

エモそう!!

”君”+”出会える”=”僕”+”教える”は”君と出会えることを僕が教える”みたいに解釈できそうですよね(強引かな?)

”君”+”出会える”=”僕”+”いつか”は”君と僕はいつか出会える”的な感じに解釈できそうですよね?!!(これは強引)

 

 それでは,”君”と”僕”を入れ替えた”僕”+”出会える”=”君”+”?”も考えてみます.

ret = model.wv.most_similar(positive=["僕","出会える"],negative=["君"]) 
for item in ret:
    print(item[0], item[1])

結果:

おかげ 0.48257261514663696

向ける 0.45529890060424805

エモそう?

”僕”+”出会える”=”君”+”おかげ”は”僕が出会えるのは僕のおかげ”みたいに解釈できそうですよね(強引ですね)

”僕”+”出会える”=”僕”+”向ける”は何かいい解釈ありませんかね笑

 

まとめ

安直な思いから始めた分析でしたが,結果としてはエモいものが多くとても満足いく結果を得ることができました.まだまだ,分析したい単語はあるので分析次第追記するなり呟くなりしたいと思います.

 

謝辞

分析してつぶやいたときに先人の方からありがたくモデルに名前をつけていただけました.ここでにのぴらさんには熱く御礼申し上げます.

 

次回

にのぴらさんから歌詞作成も面白いからやってみなという啓示を受けたのでやってみたいと思います.

また,歌詞が作成された年代も考慮に入れた分析もやってみたいと思います.