ポルノグラフィティが探しているものは何か?MeCabとWord2vecで分析してみた
こんにちは。五十嵐です。
この記事はNHN テコラス Advent Calendar 2018の25日目の記事です。
クリスマスですね。私は幼いころからずっと心からサンタさんの存在を信じていました。
小6のときに母から「分かってると思うけどサンタさんはお父さんだよ」という衝撃の一言を受けて、生まれてはじめて虚無という感情を覚えたことを毎年思い出します。
さて、本記事ではポルノグラフィティの歌詞分析をやってみました。
個人的にポルノグラフィティの曲は常に何か探しているイメージが強いので、一番探しているものは何なのか分析してみます。
使用したライブラリ
1 2 3 4 5 6 7 | library (rvest) library (tsne) library (magrittr) library (stringr) library (wordVectors) library (dplyr) library (RMeCab) |
上記のライブラリを使用しました。
MeCabとWord2vecについて
MeCabとは
ここで使うのはRMeCabというR用のパッケージです。
そもそもMeCabとは、オープンソースの形態素解析エンジンのことを指します。
例えば、「すもももももももものうち」とMeCabのコンソール上に入れてみると、
と品詞ごとに分解されます。
本記事では歌詞を全て品詞に分解した上で分析を行います。
MeCabを使用するにはここからMeCabをダウンロードをした上で、RMeCabのインストールを行います。
1 |
今回R操作中になぜか突然落ちてしまい、原因が分からずに心が折れかけましたが、
PCに既にインストールされているMeCabのバージョンと、CRANにあるRMeCabが対応するMeCabのバージョンに相違がある場合にうまくいかないようで、一度MeCabをアンインストールしてからインストールしなおすと解決しました。
Word2vecとは
Word2vecは単語をベクトル化することで単語同士の意味や関係の近さを表現することが出来るモデルです。Word2vecを使うと、単語同士の類似度を出したり、単語間での足し算・引き算ができるようになります。
例えば、有名な例だと
王様 – 男 + 女 = 女王
のような計算ができるとされます。
また、Word2vecを使用するために必要となるWordVectorsパッケージはCRANからインストールできないため、以下のようにGitHubからインストールを行いました。
1 | devtools:: install_github ( "bmschmidt/wordVectors" ) |
歌詞を取得する
歌詞の取得には歌ネットを利用しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | basic_url = "https://www.uta-net.com" # 1ページ目の歌詞を取得 porno_url = "https://www.uta-net.com/artist/1686/" porno_url_page = read_html (porno_url) url_list = porno_url_page %>% html_nodes (xpath = "//div[@id='artist']//table/tbody//td[@class='side td1']/a" ) %>% html_attr ( "href" ) song_url_list = url_list[url_list %>% grep ( "/song/" ,.)] lyrics = "" for (i in 1:(song_url_list %>% length ())){ song_url = song_url_list[i] tmp_url = paste (basic_url, song_url_list[i], sep = "" ) tmp_lyrics = read_html (tmp_url) %>% html_nodes (xpath = "//div[@id='kashi_area']" ) %>% html_text () lyrics = paste (lyrics, tmp_lyrics, sep = " " ) Sys.sleep (2) } write.table (lyrics, "lyrics_porno.txt" ,col.names = F,row.names = F) |
Webスクレイピングについては238曲もあったため歌詞ページが2ページに渡っており、2ページ一気にスクレイピングを行うことはできなかったため、1ページずつ行い、コピペでファイルをひとつ(lyrics_porno_all.txt)に纏めました。
MeCabで形態素解析を行う
MeCabで歌詞の形態素解析を行います。
1 2 3 4 5 6 7 8 9 10 11 | rmecab_text_porno = RMeCabText ( "lyrics_porno_all.txt" ) rmecab_text_porno_list = "" for (i in 1:(rmecab_text_porno %>% length)){ tmp_rmecab_text_porno = rmecab_text_porno[[i]] if ((tmp_rmecab_text_porno[2] % in % c ( "名詞" , "動詞" , "形容詞" )) (tmp_rmecab_text_porno[3] != "非自立" )){ rmecab_text_porno_list = paste (rmecab_text_porno_list, as.character (tmp_rmecab_text_porno[1]), sep = " " ) } } write (rmecab_text_porno_list, file = "rmecab_text_porno_list.bin" , append = TRUE ) |
WordCloudを作成してみる
形態素解析ができたのでWordCloudで可視化してみます。
1 2 3 4 5 6 7 | install.packages ( "wordcloud" , dependencies = T) library (wordcloud) docDF_lyrics_porno = docDF ( "lyrics_porno_all.txt" , type = 1) docDF_lyrics_porno_2 = docDF_lyrics_porno %>% filter (POS1 % in % c ( "名詞" ), POS2 != "非自立" , TERM != ")" , TERM != "(" ) # 最低15回頻出 wordcloud (docDF_lyrics_porno_2$TERM,docDF_lyrics_porno_2$lyrics_porno_all.txt, min.freq= 15, rot.per = 0, scale= c (4,0.2), random.order= FALSE , family = "JP1" , colors = brewer.pal (8, "Dark2" )) |
「僕」と「君」が圧倒的です。
「?」があることから高い頻度で問いかけていることが分かります。
たしかに新藤晴一さんの歌詞は尋ねがちな気がします。
ワードクラウドにある語は見ていると「なるほどね」といった感じでしっくりきますが、私の期待した「探して」というワードは含まれてませんでした。
「なんか分からないけどよく探している」という印象は、ただの私の偏った印象であることが分かりました。
Word2vecで歌詞を分析する
あまり探してないことが分かりましたが、ちなみに何を探してたのかWord2vecで学習して「探し」「探す」「探せ」との関連の深い語は何か、分析してみます。
1 | model_porno = train_word2vec ( "rmecab_text_porno_list.bin" , vectors = 50, window = 5, inter = 30 threads = 1) |
パラメータはデフォルトだといまいち過ぎる結果になったので、色々試して上記の値にしたときが一番しっくりきました。vectorsは単語ベクトルの次元数で、数千単語だと50~100が良さそうでした。windowは前後の単語数を示します。iterは計算回数で、今回データ量が少ないため、デフォルトの値である5から25に変更しました。threadsは並行処理する場合に2以上にする必要があるのですが、今回は1にします。
結果はこのようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 | model_porno %>% closest_to (model_porno [[ "探し" ]]) word similarity to model_porno[[ "探し" ]] word similarity to model_porno[[ "探し" ]] 1 探し 1.0000000 2 彷徨 0.5909659 3 薄い 0.5597935 4 憂い 0.5368750 5 生き 0.5268160 6 今夜 0.5122725 7 窮屈 0.5108367 8 ギター 0.5055253 9 ストーリー 0.5030357 10 におい 0.4851018 |
言葉だけみるとなんだか儚げですね。
1 2 3 4 5 6 7 8 9 10 11 12 | model_porno %>% closest_to (model_porno [[ "探す" ]]) word similarity to model_porno[[ "探す" ]] 1 探す 1.0000000 2 めぐり 0.5469677 3 めぐる 0.5365426 4 抱きしめ 0.5153010 5 探せ 0.5149211 6 景色 0.5140552 7 彼女 0.5090870 8 出口 0.5010828 9 違う 0.5005541 10 世界中 0.4979322 |
「探し」の類似単語とだいぶ似通ってます。
「彼女」はおそらく「ニセ彼女」の歌詞からきているのでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 | model_porno %>% closest_to (model_porno [[ "探せ" ]]) word similarity to model_porno[[ "探せ" ]] 1 探せ 1.0000000 2 確か 0.5500618 3 あいつ 0.5357660 4 何処 0.5262283 5 みつけ 0.5157111 6 探す 0.5149211 7 青春 0.5145850 8 奥 0.4829296 9 行か 0.4827165 10 本当 0.4705765 |
「青春」が入ってきているのがいいですね。すごくポルノっぽい気がします。
いろんな単語が浮かんできましたが、「ポルノグラフィティが探してたのは青春だった」でいいんじゃないんでしょうか。
雑になりましたが、いい感じのものが出てきたのでこれで結論にしたいです。
さいごに
今回歌詞分析をやってみて、私が思ってたほど、たいして探してなかったことが分かりました。
そして明確な探しものはよく分かりませんでした。
君とか敵とか切れない剃刀とかこの街がまだジャングルだったころから変わらない愛のかたちをはじめとしてたくさんいろんなものを探してたような気がしましたが、きっと探しものはひとつではないのでしょう。
そんなポルノグラフィティの楽曲は今年からストリーミング配信をしています!
Amazon MusicやApple Musicを契約している人は是非聞いてください。
この記事で一番伝えたかったことはここになります。
この時期にぴったりの、シングルにしか収録されていないHard Days,Holy Nightも聞くことが出来ます。昔の曲は今聞いても名曲ぞろいです。
そしてポルノグラフィティが何を探しているのか探してみてください。
ライブでは昭仁さんは最近歌い方の幅が広がり、最高を突き抜けたのでライブにも是非行ってみてください!
という、分析をフックに今こそポルノグラフィティをおすすめしたい記事でした。
参考文献
青空文庫のデータを使って、遅ればせながらword2vecと戯れてみた
【Rでword2vec】AKB48と乃木坂46の歌詞を分析して「人生とは何か?」質問してみた
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitterRecommends
こちらもおすすめ
-
[re:Invent2018]来年に活かしたい!若手エンジニアによる振り返り
2018.12.13
-
「統計的因果探索」の一部を動かしてみた
2018.12.20
-
配色はセンスじゃなく理論でなんとかなる!②活用編
2018.12.15

Special Topics
注目記事はこちら

データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16