ミスチルの終わりなき旅をCloud Natural Language APIで感情分析してみた

私はミスチルが好きで、歌詞の中で一番ポジティブな歌詞やネガティブな歌詞を自動で判別できないかと思い、いろいろと試してみましたが、なかなかうまくできませんでした。

試した方法としては、PythonのライブラリであるJanomeを使用した形態素解析を行い、日本語の感情分析(ポジティブ、ネガティブな単語を判別)ができる極性辞書(日本語評価極性辞書や単語感情極性対応表)を使用してネガポジ分析を行ってみました。

しかし、ポジティブな曲なのにネガティブな曲と判定されたり、そもそも形態素解析で分割した単語が極性辞書に大部分含まれておらず、うまく分析できないという結果でした。

上記の問題を解決するには、形態素解析の方法を見直したり、極性辞書を改編、自作するなど、かなり大変なことをしないといけません。

今回色々と調べていると、Googleが提供するAPIであるCloud Natural Language APIで簡単に感情分析ができることを知ったので試してみることにしました。

今回はミスチルの中で一番ポジティブで知名度が高いと私が勝手に思っている「終わりなき旅」で試してみました。



Cloud Natural Language API とは

Cloud Natural Language APIはGoogleがクラウド上で提供するサービス(Google Cloud Platform=GCP)のうちのひとつで、感情分析や文章の構造分析などができます。

今回はこの中の感情分析を使用します。

感情分析では-1.0を最もネガティブ、+1.0を最もポジティブをして、-1.0 から +1.0 の間のスコアで文章のネガポジ分析ができます。

Cloud Natural Language API の使い方

Cloud Natural Language API を使用するためには、まずGCPのサイトで登録をしてAPIキーを取得する必要があります。

GCPサイトでの登録方法、APIキーの取得方法、Cloud Natural Language APIの使い方は以下のYouTubeがわかりやすかったので、参考にしてください。

Cloud Natural Language API の料金

Cloud Natural Language API は使い込むと料金が発生します。

ただし、お試しで使うくらいであれば、無料枠で使用できます

また、最初の3か月は約3万円の無料クレジットがもらえるので、課金されることなく安心して使えます。

約3万円と書いているのは、無料クレジットが $300 という表記であるからです。

以下は、登録時の無料クレジットの説明です。

無料クレジットがいくらかは、GCPのサイトで見れます。

私の場合は以下の金額の無料クレジットでした。

先に無料クレジットの説明をしてしまいましたが、以下はCloud Natural Language APIの料金体系です。

2021年10月時点の料金をGCPのサイトから転載しています。

機能という欄の数字が何かは、サイトで以下のような説明があります。

料金単位
Natural Language の使用量は「ユニット」の数に基づいて計算されます。分析のためにこの API に送信される各ドキュメントのユニット数は、少なくとも 1 ユニットとなります。ドキュメントに 1,000 文字を超える Unicode 文字が含まれている場合(空白文字や、HTML / XML タグなどのマークアップ文字も含まれます)、複数ユニット(1,000 文字 = 1 ユニット)としてカウントされます。

たとえば、Natural Language に送信する 3 件のリクエストに、それぞれ 800 文字、1,500 文字、600 文字が含まれている場合、1 番目のリクエスト(800)が 1 ユニット、2 番目のリクエスト(1,500)が 2 ユニット、3 番目のリクエスト(600)が 1 ユニット、合計 4 ユニットとして課金されます。

Natural Language の使用料は、使用された API の機能とその機能を使用して評価されたユニットの数に基づいて、月単位で計算されます。次の表に、請求月に分析されたユニットの総数に基づく 1,000 ユニットあたりの料金を示します。

引用:Cloud Natural Language

少し補足をすると、1回のリクエストで1ユニットとカウントされます。

1回のリクエストで1,000文字を超える場合は2ユニット、2,000文字を超えると3ユニットとカウントされます。

つまり、1,000文字以下の分析であれば、5000回までは無料で使えます

簡単な文章の感情分析を行った結果

ミスチルの終わりなき旅の歌詞を分析する前に、まずは簡単な文章で感情分析を試してみます。

ポジティブな文章

以下の文章を分析しました。

ポジティブな文章
今日はとてもいい休みだった。早起きして資格の勉強、仕事、ランニング、趣味、やりたいことがほとんどできた。明日もがんばろう。

結果は以下です。

感情分析結果
文章全体のmagnitude: 2.1
文章全体のscore: 0.7
今日はとてもいい休みだった。 magnitude: 0.8 , score: 0.8
早起きして資格の勉強、仕事、ランニング、趣味、やりたいことがほとんどできた。 magnitude: 0.9 , score: 0.9
明日もがんばろう。 magnitude: 0.3 , score: 0.3

文章全体のスコアは0.7であり、ポジティブな文章と判定されています。

マグニチュードはその文章における感情の強さを表しています。

ポジティブ、ネガティブ両方の単語や文章があるたびにマグニチュードは増えていきます。

個々の文章の分析結果を見てみると、全ての文章がポジティブな判定となっています。

うまく分析できています

ネガティブな文章

以下の文章を分析しました。

ネガティブな文章
今日は駄目な休みだった。昼前に起きて、テレビとYouTubeを見ながらだらだら過ごした。明日こそ、がんばろう。

結果は以下です。

感情分析結果
文章全体のmagnitude: 1
文章全体のscore: -0.3
今日は駄目な休みだった。 magnitude: 0.8 , score: -0.8
昼前に起きて、テレビとYouTubeを見ながらだらだら過ごした。 magnitude: 0 , score: 0
明日こそ、がんばろう。 magnitude: 0 , score: 0

スコアは -0.3 で、若干ネガティブな判定となりました。

先ほどより、マグニチュードの値は小さくなっています。

個々の文章の結果を見てみると、後半2つの文章はスコア、マグニチュードともに0になっています。

2つ目の文章は「だらだら」という単語が入っていることで若干ネガティブに感じる文章ですが、どちらかというとニュートラル(スコア0)な文章かもしれません。

3つ目の文章は、少しポジティブな文章ですが、ニュートラルな判定となっています。

しかし、ポジティブな文章で使った「明日もがんばろう」はスコア0.3ですが、「明日こそ、がんばろう」はスコア0になっています。

この違いを数値化できるのはすごいと思います。

終わりなき旅の感情分析を行った結果

では、終わりなき旅の感情分析を行った結果です。

終わりなき旅の歌詞は歌詞サイトからスクレイピングで取得しました。

歌詞を感情分析した結果

以下は分析に使用した終わりなき旅の歌詞の冒頭の一部です。

所々、全角スペースが入っています。

息を切らしてさ 駆け抜けた道を 振り返りはしないのさただ未来だけを見据えながら 放つ願いカンナみたいにね

Mr.Children「終わりなき旅」

分析結果は以下です。

感情分析結果
文章全体のmagnitude: 0.1
文章全体のscore: 0
息を切らしてさ 駆け抜けた道を 振り返りはしないのさただ未来だけを見据えながら 放つ願いカンナみたいにね 命を削ってさ 情熱を灯してはまた光と影を連れて 進むんだ大きな声で
 声をからして 愛されたいと歌っているんだよ「ガキじゃあるまいし」自分に言い聞かすけど また答え探してしまう閉ざされたドアの向こうに 新しい何かが待っていてきっと きっとっ
て 僕を動かしてるいいことばかりでは無いさ でも次の扉をノックしたいもっと大きなはずの自分を探す 終わりなき旅誰と話しても 誰かと過ごしても 寂しさは募るけどどこかに自分を
必要としてる人がいる憂鬱な恋に 胸が痛んで 愛されたいと泣いていたんだろう心配ないぜ 時は無情な程に 全てを洗い流してくれる難しく考え出すと 結局全てが嫌になってそっとそっ
と 逃げ出したくなるけど高ければ高い壁の方が 登った時気持ちいいもんなまだ限界だなんて認めちゃいないさ時代は混乱し続け その代償を探す人はつじつまを合わす様に 型にはまって
く誰の真似もすんな 君は君でいい生きる magnitude: 0.1 , score: -0.1
為のレシピなんてない ないさ息を切らしてさ 駆け抜けた道を 振り返りはしないのさただ未来へと夢を乗せて閉ざされたドアの向こうに 新しい何かが待っていてきっときっとって 君を
動かしてるいいことばかりでは無いさ でも次の扉をノックしようもっと素晴らしいはずの自分を探して胸に抱え込んだ迷いが プラスの力に変わるようにいつも今日だって僕らは動いてる嫌
な事ばかりではないさ さあ次の扉をノックしようもっと大きなはずの自分を探す 終わりなき旅 magnitude: 0 , score: 0

ほとんど分析できていません

マグニチュードが0.1ということは、ほとんどこの歌詞に感情が入っていないということになります。

文章としては2つに分けられていますが、よくわからない位置で分けられています。

全角スペースを。に変換した歌詞を分析した結果

単純な文章で分析した場合は、文章の区切りが明確でうまく分析できていたため、全角スペースを「。」に置き換えて分析してみます。

息を切らしてさ。駆け抜けた道を。振り返りはしないのさただ未来だけを見据えながら。放つ願いカンナみたいにね。

Mr.Children「終わりなき旅」

分析結果は以下です。

感情分析結果
文章全体のmagnitude: 8.9
文章全体のscore: 0
息を切らしてさ。 magnitude: 0.1 , score: -0.1
駆け抜けた道を。 magnitude: 0.1 , score: -0.1
振り返りはしないのさただ未来だけを見据えながら。 magnitude: 0.1 , score: -0.1
放つ願いカンナみたいにね。 magnitude: 0.2 , score: -0.2
命を削ってさ。 magnitude: 0.1 , score: -0.1
情熱を灯してはまた光と影を連れて。 magnitude: 0 , score: 0
進むんだ大きな声で。 magnitude: 0.1 , score: 0.1
声をからして。 magnitude: 0.3 , score: -0.3
愛されたいと歌っているんだよ「ガキじゃあるまいし」自分に言い聞かすけど。 magnitude: 0.5 , score: 0.5
また答え探してしまう閉ざされたドアの向こうに。 magnitude: 0.1 , score: -0.1
新しい何かが待っていてきっと きっとって。 magnitude: 0.4 , score: 0.4
僕を動かしてるいいことばかりでは無いさ。 magnitude: 0 , score: 0
でも次の扉をノックしたいもっと大きなはずの自分を探す。 magnitude: 0.2 , score: -0.2
終わりなき旅誰と話しても。 magnitude: 0.1 , score: -0.1
誰かと過ごしても。 magnitude: 0 , score: 0
寂しさは募るけどどこかに自分を必要としてる人がいる憂鬱な恋に。 magnitude: 0 , score: 0
胸が痛んで。 magnitude: 0.1 , score: -0.1
愛されたいと泣いていたんだろう心配ないぜ。 magnitude: 0.9 , score: 0.9
時は無情な程に。 magnitude: 0.1 , score: -0.1
全てを洗い流してくれる難しく考え出すと。 magnitude: 0.2 , score: 0.2
結局全てが嫌になってそっとそっと。 magnitude: 0.8 , score: -0.8
逃げ出したくなるけど高ければ高い壁の方が。 magnitude: 0.3 , score: -0.3
登った時気持ちいいもんなまだ限界だなんて認めちゃいないさ時代は混乱し続け。 magnitude: 0 , score: 0
その代償を探す人はつじつまを合わす様に。 magnitude: 0 , score: 0
型にはまってく誰の真似もすんな。 magnitude: 0.6 , score: 0.6
君は君でいい生きる為のレシピなんてない。 magnitude: 0.3 , score: -0.3
ないさ息を切らしてさ。 magnitude: 0.1 , score: -0.1
駆け抜けた道を。 magnitude: 0.1 , score: -0.1
振り返りはしないのさただ未来へと夢を乗せて閉ざされたドアの向こうに。 magnitude: 0.1 , score: -0.1
新しい何かが待っていてきっときっとって。 magnitude: 0.4 , score: 0.4
君を動かしてるいいことばかりでは無いさ。 magnitude: 0 , score: 0
でも次の扉をノックしようもっと素晴らしいはずの自分を探して胸に抱え込んだ迷いが。 magnitude: 0.2 , score: -0.2
プラスの力に変わるようにいつも今日だって僕らは動いてる嫌な事ばかりではないさ。 magnitude: 0 , score: 0
さあ次の扉をノックしようもっと大きなはずの自分を探す。 magnitude: 0.6 , score: -0.6
終わりなき旅 magnitude: 0 , score: 0

先ほどよりもマグニチュードが増えています。

ただし、スコアは0です。

個々の文章を見てみると、ポジティブ、ネガティブな文章が混ざっていますが、やはり変な場所で文章を区切っているのであまりうまく分析できているとは言えません。

各文章のスコアのヒストグラムを見てみると、下記のようになっています。

スコア0付近が割合として多いことがわかります。

歌詞を手作業で分割して分析した結果

歌詞を手作業で区切りが良いと思った場所で区切って感情分析を行ってみます。

こちらは手作業なので今後自動でできる手法ではありませんが、感情分析の精度を確認するために試してみます。

息を切らしてさ駆け抜けた道を振り返りはしないのさ。

ただ未来だけを見据えながら放つ願い。

カンナみたいにね命を削ってさ情熱を灯してはまた光と影を連れて進むんだ。

Mr.Children「終わりなき旅」

分析結果は以下です。

感情分析結果
文章全体のmagnitude: 13.2
文章全体のscore: 0
息を切らしてさ駆け抜けた道を振り返りはしないのさ。 magnitude: 0.3 , score: -0.3
ただ未来だけを見据えながら放つ願い。 magnitude: 0.2 , score: -0.2
カンナみたいにね命を削ってさ情熱を灯してはまた光と影を連れて進むんだ。 magnitude: 0 , score: 0
大きな声で声をからして愛されたいと歌っているんだよ。「 magnitude: 0.3 , score: 0.3
ガキじゃあるまいし」自分に言い聞かすけどまた答え探してしまう。 magnitude: 0.5 , score: 0.5
閉ざされたドアの向こうに新しい何かが待っていてきっと きっとって僕を動かしてる。 magnitude: 0.3 , score: 0.3
いいことばかりでは無いさ。 magnitude: 0.2 , score: -0.2
でも次の扉をノックしたい。 magnitude: 0.4 , score: -0.4
もっと大きなはずの自分を探す終わりなき旅。 magnitude: 0.4 , score: -0.4
誰と話しても誰かと過ごしても寂しさは募るけど。 magnitude: 0.2 , score: -0.2
どこかに自分を必要としてる人がいる。 magnitude: 0.1 , score: -0.1
憂鬱な恋に胸が痛んで愛されたいと泣いていたんだろう。 magnitude: 0.5 , score: 0.5
心配ないぜ時は無情な程に全てを洗い流してくれる。 magnitude: 0.9 , score: 0.9
難しく考え出すと結局全てが嫌になってそっとそっと逃げ出したくなるけど。 magnitude: 0.8 , score: -0.8
高ければ高い壁の方が登った時気持ちいいもんな。 magnitude: 0.3 , score: 0.3
まだ限界だなんて認めちゃいないさ。 magnitude: 0.4 , score: -0.4
時代は混乱し続けその代償を探す。 magnitude: 0.2 , score: -0.2
人はつじつまを合わす様に型にはまってく。 magnitude: 0.5 , score: 0.5
誰の真似もすんな君は君でいい。 magnitude: 0.7 , score: 0.7
生きる為のレシピなんてない。 magnitude: 0.5 , score: -0.5
ないさ。 magnitude: 0.7 , score: -0.7
ただ未来へと夢を乗せて。 magnitude: 0.1 , score: 0.1
閉ざされたドアの向こうに新しい何かが待っていてきっときっとって君を動かしてる。 magnitude: 0.4 , score: 0.4
いいことばかりでは無いさ。 magnitude: 0.2 , score: -0.2
でも次の扉をノックしよう。 magnitude: 0.5 , score: -0.5
もっと素晴らしいはずの自分を探して。 magnitude: 0.4 , score: -0.4
胸に抱え込んだ迷いがプラスの力に変わるようにいつも今日だって僕らは動いてる。 magnitude: 0.4 , score: 0.4
嫌な事ばかりではないさ。 magnitude: 0.3 , score: 0.3
さあ次の扉をノックしよう。 magnitude: 0.3 , score: -0.3
もっと大きなはずの自分を探す終わりなき旅。 magnitude: 0.4 , score: -0.4

マグニチュードは先ほどよりも大きくなっています。

スコアとしては0のままです。

しかし、先ほどよりもうまく分析ができているように思います。

各文章のスコアのヒストグラムを見てみると、下記のようになっています。

先ほどよりも、スコアの分布がばらけているのが分かります。

コード

上記の分析を行ったコードは以下です。

Your Keyの部分にGCPのサイトで取得したAPIキーを入力します。

textの変数に分析対象の文章を入れます。

import requests
import pandas as pd
# GCPのサイトで取得したAPIキーを入力
key = 'Your Key'
url = f'https://language.googleapis.com/v1/documents:analyzeSentiment?key={key}'
text = "今日はとてもいい休みだった。早起きして資格の勉強、仕事、ランニング、趣味、やりたいことがほとんどできた。明日もがんばろう。"
header = {"Content-Type": "application/json"}
body = { "document":{ "type": "PLAIN_TEXT", "language": "JA", "content": text }
}
# json形式で結果を受け取る。
response = requests.post(url, headers=header, json=body).json()
print("文章全体のmagnitude:",response["documentSentiment"]["magnitude"])
print("文章全体のscore:",response["documentSentiment"]["score"])
for i in response["sentences"]: print(i["text"]["content"],"magnitude:",i["sentiment"]["magnitude"],", score:",i["sentiment"]["score"])

今回 Cloud Natural Language API を使ってみて、かなり使えそうという印象を持ちました。

歌詞は人間が見ても人によって感じ方が違うなど、表現が難しかったり曖昧であったりするので、やはり分析は難しいです。

ただし、規則正しく書かれた文章であれば、分析の精度はかなり良くなってきそうなので、アンケート結果の分析等で使える場面があれば、使ってみようと思います。

また、かなり楽に便利に使えるということもメリットです。

形態素解析を行って、極性辞書を使うとなると結構面倒ですが、 Cloud Natural Language API は分析対象の文章をそのまま入れるだけである程度分析はできます。

ここまで記事を見ていただき、ありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


検索

アーカイブ

プロフィール

プロフィール背景画像
プロフィール画像

チャベス

1989生まれ、機械機器メーカーで研究開発をしている機械系エンジニアです。 業務効率化や日々の生活を効率化できるプログラミングネタを発信しています。PythonとNotionとSANGO(WordPress)が特に好きです。 詳細プロフィールはこちらnoteにNotionの記事も書いています。

WP-Searchにサイト事例として掲載されています。