やりたいこと

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

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

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

歌詞分析してみる

分析ツール

COTOHA API Python 3.8.1

分析対象

会いたくて会いたくて震える曲

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

以下はレコチョクですでにカテゴライズされていたので、その中から私の趣味で曲を選定しました。

明るい曲

  • Greeeen 「キセキ」
  • サンボマスター 「世界はそれを愛と呼ぶんだぜ」
  • SPYAIR 「BEAUTIFUL DAYS」*レコチョクにはなかったけど筆者が好きな曲

悲しい曲

  • 平井堅 「ノンフィクション」
  • back number 「ハッピーエンド」

コード

感情分析でサボテンは踊るのをやめてしまうか 参考にさせていただきました。

実装

top/
 ├ file/
 │ ├ input.txt   (分析する歌詞)
 │ └ output.csv (出力結果)
 ├ config.ini
  └ 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()

分析結果

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

歌詞(冒頭)

会いたくて 会いたくて 震える
君想うほど遠く感じて
もう一度聞かせて嘘でも
あの日のように"好きだよ"って…
…

思ってたほどネガティブではなかった

Greeeen 「キセキ」

歌詞(冒頭)

明日、今日よりも好きになれる 溢れる想いが止まらない
今もこんなに好きでいるのに 言葉に出来ない
君のくれた日々が積み重なり 過ぎ去った日々2人歩いた『軌跡』
…

かなりポジティブな曲

サンボマスター 「世界はそれを愛と呼ぶんだぜ」

歌詞

涙の中にかすかな灯りがともったら
君の目の前で
あたためてた事話すのさ
…

どちらかというとネガティブな歌詞が多い

SPYAIR 「BEAUTIFUL DAYS」

歌詞

プラスにもっと変えていける そうやって信じていこう
誰かが君を笑っても 俺は笑ったりしないよ
新たなスタート どんな君も輝いていけるさ
不安&期待で Oh Try yourself
…

自分の中でかなりポジティブな曲だと思っていたのに

平井堅 「ノンフィクション」

歌詞

描いた夢は叶わないことの方が多い
優れた人を羨んでは自分が嫌になる
浅い眠りに押しつぶされそうな夜もある
…

まぁまぁネガティブ

back number 「ハッピーエンド」

歌詞

さよならが喉の奥につっかえてしまって
咳をするみたいにありがとうって言ったの
次の言葉はどこかとポケットを探しても
…

バランスが良い

まとめ

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

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