「恋」と「愛」とはいったい何なのか？word2vecを使って歌詞分析をしてみた

#自己紹介
はじめまして。Qiitaはいつも見てばっかですが初投稿してみました。
いわゆるメーカー系SEというやつを8年ぐらいやっております。
といってもユーザと接する機会はほぼなく、バックグラウンドでR&D的な事をしてます。
三十路エンジニアです。

#今回やった事
word2vecを使って色んなアーティストの歌詞分析をしてみました。

仕事でword2vecに触れる機会があり、結果が分かりやすくて面白いと感じました。
これを何かに使えないかなと思い今回実施したことが**「歌詞分析」**です。
「歌詞分析ってありがちな発想・・・」確かにそうかも知れません。

僕が思ったのは、歌詞を分析することでこのアーティストってこの言葉をどう捉えているのか知ることが出来、そのアーティストの世界観に触れることが少しでも出来るのではないかと思いました。

そこで、永遠のテーマである「**恋**」と「**愛**」の言葉について、
近い意味で使われている言葉は何なのか調べて見ることにしました。

#そもそも「恋」と「愛」とは？
歌詞分析をする前に、辞書的に「恋」と「愛」ってどういう意味なのかコトバンクで調べてみました。
まずは「恋」です。

> こい〔こひ〕【恋】
> 特定の人に強くひかれること。また、切ないまでに深く思いを寄せること。恋愛。
https://kotobank.jp/word/%E6%81%8B-493530

続いて「愛」。

> あい【愛】
> 特定の人をいとしいと思う心。互いに相手を慕う情。恋。
https://kotobank.jp/word/%E6%84%9B-23564


「愛」の説明に「恋」が出てきちゃってる・・・。
コトバンクさんでも両者の違いを説明するのは難しそうって事ですね。


#対象のアーティスト
私の趣味と偏見により、以下の6アーティストを対象に歌詞を分析しました。

|アーティスト名|理由|
|:--:|:--:|
|スピッツ|個人的に大好きなバンド|
|Mr.Children|人気スター|
|安室奈美恵|最近引退したばっかでさみしい|
|きゃりーぱみゅぱみゅ|若者の代表、何となく歌詞が変わってそう|
|石川さゆり|演歌界の大御所|
|氷川きよし|演歌界のプリンス|

#word2vecとは？
単語をベクトル化するアルゴリズムで、単語同士の演算（「王様」-「男」-「女」=「女王」）や、意味的に近い単語の導出（犬と猫など）などが出来ます。主に自然言語処理の分野で使われています。
今回使ったのは、後者の「意味的に近い単語の導出」です。


#おおまかな処理の流れ
簡単ですが、おおまかな処理の流れをまとめてみました。
アーティスト単位で歌詞分析を行いたいので、word2vecで学習したモデルを分けています。
プログラムはすべてPython3で記述しました。

![処理の流れ.png](https://qiita-image-store.s3.amazonaws.com/0/206972/3d53ba04-7612-cfde-64b8-71ba900e806b.png)

##1. スクレイピング
アーティストの歌詞が記載されたWebサイトから歌詞データを取得します。
GETでURLにアクセスを行い、レスポンスのHTMLタグ解析を行っているだけで
特別なことはしていないため特に記載はしません。
ちなみに、ライブラリはHTMLparserやurllib3などを使いました。


##2. mecabで分かち書き
スクレイピングして取得してきたアーティスト全曲の歌詞（lyric_file）をmecabを使って分かち書きし、結果をファイル（word_file）に出力しました。歌詞には様々な品詞が含まれますが、単純化のために今回は「名詞」のみを抽出しました。

```ruby:
#全曲の歌詞をword2vecで分析しモデルを生成
def wakati():
    print("Execute mecab")
    mecab = MeCab.Tagger(' -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
    mecab.parse('')
    
    global word_file
    init_file(word_file)
    
    fi = open(lyric_file, 'r')
    fo = open(word_file, 'w')
    
    line = fi.readline()
    while line:
        line = line.replace('(※くり返し) ','')
        node=mecab.parseToNode(line)
        while node:
            attr = node.feature.split(',')[0]
            value = node.surface 
            if(attr == '名詞'):
                fo.write(value + ' ')
            node = node.next
        line = fi.readline()
    fi.close()
    fo.close()
```


##3. word2vecで歌詞分析
先ほどmecabで処理したファイル（word_file）を元にword2vecを使い学習させてモデルを生成します。

```ruby:
#word2vecで学習しモデルを生成
def createModel():
    print("Create model...")
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

    sentences = word2vec.LineSentence(word_file)
    model = word2vec.Word2Vec(sentences,
                              sg=1,
                              size=100,
                              min_count=1,
                              window=10,
                              hs=1,
                              negative=0)

    global model_name
    model.save(model_name)
```

出来たモデルを使って、近い単語TOP5を返すメソッドです。
getSimilar('恋')のように引数に「恋」もしくは「愛」を与えて呼び出します。

```ruby:
# 近い単語を表示
def getSimilar(target):
    global model_name
    model  = word2vec.Word2Vec.load(model_name)
    try:
        results = model.most_similar(positive=target, topn=5)
    except KeyError:
        print('No word in lyric')
        return None

    for result in results:
        print(result[0])
```


#結果
いよいよお待ちかね、歌詞分析の結果です。
各アーティスト別に関連度が高い順に表でまとめました。
意味がよく分からないものも多々ありますが、、いくつか取りあげてみます。

##「恋」と似た意味を持つ単語
||スピッツ|Mr.Children|安室奈美恵|きゃりーぱみゅぱみゅ|石川さゆり|氷川きよし|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|1位|頬|残酷|なに|たい|一日|歩いた|
|2位|咲き|程|あなたのすべて|幻|人間|破り|
|3位|フシギ|Everymonth|ドクター|りみ|終り|プラカード|
|4位|蝶々|想い|時空|必勝|浄土|ヶ月|
|5位|年|図|優しさ|休日|丹波|乳房|

- スピッツ：
恋は頬、赤くなり色づくということでしょうか。ロマンチック。

- Mr.Children：
恋は残酷であり想い。何となくミスチルっぽい？

- 安室奈美恵：
恋はあなたのすべて、優しさ。女性らしい。

- きゃりーぱみゅぱみゅ：
恋はまぼろしぃ～、恋は必勝。何となく若さを感じます。
 
- 石川さゆり：
恋は一日、ワンナイトラブ...？
恋は終わりで浄土、なんかあの世的なものを感じます。
 
- 氷川きよし：
全体的によく意味が分かりませんが、、恋は乳房とはストレートすぎませんか...？
というか氷川きよしの歌詞に乳房という単語が含まれていたことがまあまあの衝撃でした。

##「愛」と似た意味を持つ単語
||スピッツ|Mr.Children|安室奈美恵|きゃりーぱみゅぱみゅ|石川さゆり|氷川きよし|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|1位|たったひとつだけ|印|ひとつだけ|花|傷あと|X'mas|
|2位|放浪|瞬|ルージュ|流れ|秋風|宝物|
|3位|たま|環状線|優しさ|ため|せいな|Merry|
|4位|パジャマのまま|2001年|魂|恋の花|ハンカチ|きよし|
|5位|湖|失|いま|花びら|ジェラシー|世界中|

- スピッツ：
愛はたったひとつだけ。その通りな気がします。

- Mr.Children：
愛は瞬で失、はかない感じですね。

- 安室奈美恵：
愛はひとつだけ、スピッツと似てますね。
「優しさ」は先ほどの恋でもありましたね。さっすが安室ちゃん。

- きゃりーぱみゅぱみゅ：
全体的に花な感じが強め...
 
- 石川さゆり：
愛は傷あと、秋風、ジェラシー。大人な女性な印象を受けます。
 
- 氷川きよし：
メリークリスマス色がやや強めですが、とにかく「愛はきよし」らしいです。

#感想
歌詞分析をした結果、ん？となるものもありましたが、各アーティストでそれぞれの色合いが出ており中々面白かったのではないでしょうか。

やっぱりword2vecは楽しい！

実は他にもSMAPやさだまさしなどでも歌詞分析しましたが、あまりパッとしない結果だったので載せていません...こんなアーティストでやってみたら面白そうとかもしあれば教えてください。