グッバイ、イレーーギュラーーーーー
とか叫びたくなる今日この頃

なんとなく
Official髭男dismの歌詞の特徴を見てみたい
と思ってしまいました。

解説動画はこちら





はい
ひげだんさんの歌詞の特徴を見ていきたいですが
事前準備として
1.歌詞を集める
2.形態素解析する
3.テキストファイルにする

この作業が必要でーーーす。

これができましたら
以下のコードを試すことができます。

先ずは
ワードクラウドで歌詞の特徴を可視化する。

ワードクラウドは歌詞に出てくる単語の出現頻度順で
文字を大きさを決めて、1枚にまとめたものです。

コードは
from wordcloud import WordCloud
text_file = open('higedan_list.txt', encoding='utf-8')
text = text_file.read()

#fpath = 'C:/Windows/Fonts/meiryob.ttc'
fpath = '/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc'
stop_words = []
#stop_words = ['そう', 'ない', 'いる', 'する', 'まま', 'よう', 'てる','しまう','それ','なる', 'こと', 'もう', 'いい', 'ある', 'ゆく', 'れる']
wordcloud = WordCloud(background_color='white',font_path=fpath,width=800, 
  height=600, stopwords=set(stop_words),
                      regexp=r"[\w']+"
                     ).generate(text)
wordcloud.to_file('higedan.png')
plt.figure(figsize=(12,9))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

このコードではfpathでフォントの場所を指定しているので
お使いのマシンのパスにあわせてください。

ワードクラウドの結果は
higedan

する、僕、君
が大きいですねーーー

「僕と君がする」んでしょうね!!!!

何をするかは存じませんが
割と一般的な語句が多いようですね。

歌詞の特徴としてはそこまで
突拍子もない単語は連呼していない訳です。

次に単語の数ではなく
TF-IDFで重要そうな言葉を見てみます。

TF とは Term Frequency の略で、単語の出現頻度を表します。
IDF とは Inverse Document Frequency の略で、逆文書頻度を表します。

これを掛け合わせたものがTF-IDFで

ある単語が多くの文書で出現するほど値は下がり
特定の文書にしか出現しない単語の重要度を上げる役割をします。

TF-IDF値は0-1の間の値を取ります。
重要なキーワードは1に近づきます。

0.25より大きなワードを出してみました。

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
np.set_printoptions(precision=2)

with open('higedan_list.txt','r') as _f:
    docs = [row.replace('\n','') for row in _f]

vectorizer = TfidfVectorizer() 
X = vectorizer.fit_transform(docs)

words = vectorizer.get_feature_names()
for did, vec in zip(range(len(docs)), X.toarray()):
    print('doc id : ', did)
    for w, tfidf in sorted(enumerate(vec), key=lambda x: x[1], reverse=True):
        if tfidf>0.25:
            wo = words[w]
            print('\t{0:s}\t{1:f}'.format(wo, tfidf))
doc id :  1
	love	0.721728
      ・・・
doc id :  43
	違う	0.329506
	グッ	0.327694
	バイ	0.296629
	もっと	0.265779

doc id1は最近佐藤健さんが主演したドラマの主題歌です。

loveという単語は
他の歌詞にはあまり使われていないけど
ここの歌詞では連呼されてるんでしょうねーー

tf-idf 閾値0.1にすると
「イレギュラー」も含まれてきます。

doc id43は映画の主題歌になった曲です。
「グッバイ」が特徴的な感じしますね。

最後にn-gramをみてみます。

n-gramとはn個の単語の繋がりを表す言葉で
3つの単語であればtrigramになります。
with open('higedan_list.txt','r') as _f:
    docs = [row.replace('\n','').split(' ') for row in _f]

def n_gram(st, n):
    return [st[i:i+n] for i in range(len(st)-n+1)]

counts = {}
for doc in docs:
    trigrams = n_gram(doc,3)
    for tri in trigrams:
        key = ''.join(tri)
        if key in counts:
            counts[key] +=1
        else:
            counts[key] = 1
for k,v in sorted(counts.items(),reverse=True,key=lambda x:x[1]):
    print(k,v)
metellme 16
StandByYou 15
tellmetell 14
・・・・

一番多かったのは英語の歌詞の繋がりでした。
かなり英語の歌詞を多用している感じがあります。

まとめると

・全体的に割と一般的な日本語を多く使用する。
・1つの歌詞でキーワードになるような単語がある
「グッバイ」「イレギュラー」
・割と英語を多用するところもある。

かなーと思います。

歌詞の特徴を見るには
他にもいろんな手法があると思いますが
比較的簡単な方法をご紹介しました。

皆さんもぜひ試してみてください。
それでは。