7
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-09

やりたいこと

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

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

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

歌詞分析してみる

分析ツール

COTOHA API
Python 3.8.1

分析対象

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

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

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

明るい曲

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

悲しい曲

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

コード

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

実装
top/
 ├ file/
 │ ├ input.txt   (分析する歌詞)
 │ └ output.csv (出力結果)
 ├ config.ini
  └ cotoha_sentiment.py
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 「ハッピーエンド」

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




バランスが良い

まとめ

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

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

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2