会いたくて会いたくて震える人の感情を分析したい

# やりたいこと

~~会いたくて会いたくて震える人の感情を理解する~~

歌詞から感情分析をして、
明るい歌なのか
悲しい歌なのか
判定したい。

音楽配信サービスなどで、明るい曲、悲しい曲といった曖昧検索が行えたらいいですよね。
今年は厄年でいいことないので、明るい曲聴いて頑張ってます


# 歌詞分析してみる
# 分析ツール
[COTOHA API](https://api.ce-cotoha.com/contents/)
Python 3.8.1

# 分析対象

### 会いたくて会いたくて震える曲
 * 西野カナ 「会いたくて会いたくて」

以下は[レコチョク](https://recochoku.jp/)ですでにカテゴライズされていたので、その中から私の趣味で曲を選定しました。
### [明るい曲](https://recochoku.jp/special/100236/)
 * Greeeen 「キセキ」
 * サンボマスター 「世界はそれを愛と呼ぶんだぜ」
 * SPYAIR 「BEAUTIFUL DAYS」*レコチョクにはなかったけど筆者が好きな曲

### [悲しい曲](https://recochoku.jp/special/100015/)
 * 平井堅 「ノンフィクション」
 * back number 「ハッピーエンド」


## コード
[感情分析でサボテンは踊るのをやめてしまうか](https://qiita.com/aikawa4866/items/3bb21d24e9b06041c758)
参考にさせていただきました。


<details><summary>実装</summary><div>

```
top/
　├ file/
　│　├ input.txt   (分析する歌詞）
　│　└ output.csv (出力結果）
　├ config.ini
  └ cotoha_sentiment.py
```

```python:cotoha_sentiment.py
# -*- coding:utf-8 -*-

import os
import urllib.request
import json
import configparser
import codecs
import csv


class CotohaApi:
    def __init__(self, client_id, client_secret, developer_api_base_url, access_token_publish_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.developer_api_base_url = developer_api_base_url
        self.access_token_publish_url = access_token_publish_url
        self.getAccessToken()

    def getAccessToken(self):
        url = self.access_token_publish_url
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }

        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        res = urllib.request.urlopen(req)
        res_body = res.read()
        res_body = json.loads(res_body)
        self.access_token = res_body["access_token"]

    # 感情分析API
    def sentiment(self, sentence):
        url = self.developer_api_base_url + "nlp/v1/sentiment"
        headers={
            "Authorization": "Bearer " + self.access_token,
            "Content-Type": "application/json;charset=UTF-8",
        }
        data = {
            "sentence": sentence
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        try:
            res = urllib.request.urlopen(req)
        except urllib.request.HTTPError as e:
            print ("<Error> " + e.reason)

        res_body = res.read()
        res_body = json.loads(res_body)
        return res_body

if __name__ == '__main__':
    APP_ROOT = os.path.dirname(os.path.abspath( __file__)) + "/"

    # config.iniの値を取得
    config = configparser.ConfigParser()
    config.read(APP_ROOT + "config.ini")
    CLIENT_ID = config.get("COTOHA API", "Developer Client id")
    CLIENT_SECRET = config.get("COTOHA API", "Developer Client secret")
    DEVELOPER_API_BASE_URL = config.get("COTOHA API", "Developer API Base URL")
    ACCESS_TOKEN_PUBLISH_URL = config.get("COTOHA API", "Access Token Publish URL")

    cotoha_api = CotohaApi(CLIENT_ID, CLIENT_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)

       # file/infile.txtから解析対象文取得
    checkpath = 'file/input.txt'
    song_data = open(checkpath, "r", encoding='utf-8')

    output_file = open('file/output.csv', 'w')
    writer = csv.writer(output_file, lineterminator='\n') # 改行コード（\n）を指定しておく

    sentence = song_data.readline()
    while sentence:
        print(sentence.strip())
        # API実行
        result = cotoha_api.sentiment(sentence)

        score = result["result"]["score"]
        print(score)
        sentiment = result["result"]["sentiment"]
        print(sentiment)

        one_row = [score,sentiment]
        writer.writerow(one_row)  # listを渡す

        sentence = song_data.readline()

    song_data.close()
    output_file.close()
    
```
</div></details>

# 分析結果

## 西野カナ 「会いたくて会いたくて」

<details><summary>歌詞(冒頭)</summary><div>

```
会いたくて 会いたくて 震える 
君想うほど遠く感じて 
もう一度聞かせて嘘でも 
あの日のように"好きだよ"って… 
…
```
</div></details>
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/a6ef832b-eb79-20a1-9b81-8f6271569f0a.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/1cdecff3-0e23-2122-baea-b46383cbcc75.png">
思ってたほどネガティブではなかった

## Greeeen 「キセキ」
<details><summary>歌詞(冒頭)</summary><div>

```
明日、今日よりも好きになれる 溢れる想いが止まらない 
今もこんなに好きでいるのに 言葉に出来ない 
君のくれた日々が積み重なり 過ぎ去った日々2人歩いた『軌跡』 
…
```
</div></details>
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/7c6749f1-9ba8-d65f-cf68-b2b9eb8eb915.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/e85a2aa4-4efa-01cb-ba7f-637d6a67ea1b.png">

かなりポジティブな曲
## サンボマスター 「世界はそれを愛と呼ぶんだぜ」
<details><summary>歌詞</summary><div>

```
涙の中にかすかな灯りがともったら 
君の目の前で
あたためてた事話すのさ 
…
```
</div></details>
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/dc1c63a6-2685-d33f-bf31-ab9adc811f0f.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/b0c4ae23-c58a-9849-73ee-ce25d4d0c66e.png">
どちらかというとネガティブな歌詞が多い

## SPYAIR 「BEAUTIFUL DAYS」
<details><summary>歌詞</summary><div>

```
プラスにもっと変えていける そうやって信じていこう 
誰かが君を笑っても 俺は笑ったりしないよ 
新たなスタート どんな君も輝いていけるさ 
不安＆期待で Oh Try yourself 
…
```
</div></details>
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/b70da2ee-2397-2dad-0fab-9ee397dd2e05.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/5f296bc6-085f-589c-1719-bd5f7e42c1a7.png">
自分の中でかなりポジティブな曲だと思っていたのに
## 平井堅 「ノンフィクション」
<details><summary>歌詞</summary><div>

```
描いた夢は叶わないことの方が多い 
優れた人を羨んでは自分が嫌になる 
浅い眠りに押しつぶされそうな夜もある 
…
```
</div></details>
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/649f1fcb-365f-480a-ee61-5089e4006f8f.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/60c3d6a0-4ba1-c40c-99d9-3242ce070f9c.png">

まぁまぁネガティブ

## back number 「ハッピーエンド」
<details><summary>歌詞</summary><div>

```
さよならが喉の奥につっかえてしまって 
咳をするみたいにありがとうって言ったの 
次の言葉はどこかとポケットを探しても 
…
```
</div></details>
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/75248021-6bf2-08ad-38da-286f93214799.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351187/2ea04655-ab07-b282-418e-6f7c5e0050c1.png">
バランスが良い

#まとめ

~~会いたくて会いたくて震える人の感情は理解できない~~

今回の感情分析は歌詞一行ずつ行いましたが、
単語の順番などもあって、結果に偏りが出てしまってるように思います。
もう少し分析する歌詞の粒度を細かすれば、より正確な結果が出るのではないかと思うので、時間があったらやってみます。