Googleの感情分析APIで遊んでみた

はじめに

こんにちは、GMOアドマーケティング TAXEL開発部のy-otakiです。
今回は、Googleさんから提供されている Cloud Natural Language APIを試してみようと思います!

概要

  • Cloud Natural Language APIを用いてテキストの感情類推を行う。
  • 小説や単語の感情類推をテストしてみたうえで、業務に応用できないか検討を行う。
  • 導入方法については簡易的な説明のみに留める。

実際に動作させてみよう

こちらを参考にGoogleColaboratoryを使ってテストを行なっていきます。
APIキーの取得方法は調べれば山ほど出てきますので、ここでは省略させていただきますね。
上記のコードを実行すると、テキスト(“メロスは激怒した”)を解析した結果が下記のように出力されるかと思います。 Scoreは感情のポジティブ/ネガティブを-1から1までの値で表し、
Magnitudeは文章全体の感情の強度を表すとのことです。
(公式による各種値の解説はこちら)

scoreが-0.1であることから、 メロスは激怒した という文章は、微妙にネガティブな文章として認識されたようです。
激怒というワードが要因なのでしょうが、これだけではわかりませんね。
いくつか、極端な文章を放り込んで検証してみましょう。

※ 句点(。)があると分解されてしまうため、句点を使わないように書いています。多少読みづらい文章になっている点はご容赦ください。
※ 一文である限りscore=magnitudeになるため、magnitudeは省いています。
ID文章Score
1ペットの死は虹の橋を渡ると表現されるが、私にとってのその日はどしゃぶりの雨だった。-0.1
2うだるような暑さが失せた小春日和、こんな日は歩くだけで笑みが浮かんでしまう。0.2
3「貧困と飢餓を無くせ」と叫ぶその舌で、彼らは食を選り好む。0
4ぼくがパパになったその日、病院の窓の向こうで、満開の桜が踊っていた。0
5戦争と病、不景気と自殺、なにもかもが最悪な一年だった。-0.8
6そんな日々にも幸せはある、今日ぼくは結婚し、最高の一年を始めるのだ。0.9
7貧困と飢餓0
8戦争と病-0.1
9最悪な一年-0.9
10最高の一年0.9
文章に対するScoreの対応表
9や10で使っている”最高”や”最低”によって極端な結果が出たことから、文章を見て判別しているというよりも、単語を見て判別している可能性が高そうですが、それにしては7や8で有意な結果が出なかった点が気になりますね。”貧困”や”戦争”はネガティブに捉えられそうなものですし。
とはいえ、内部の仕様が公開されていない以上、確かめる方法もありませんし次の実験に移りましょう。


小説を分析してみよう


さて、次は長文を放り込んでみることにします!
著作権が消滅した作品を公開している青空文庫さんから、ハンス・クリスチャン・アンデルセン作(矢崎源九郎訳)、人魚の姫をまるごと解析してみることにします。人魚の姫は、人間に恋した人魚が声を対価に陸へと上がり、けれど言葉を伝えられないがために悲恋に終わる、有名な童話ですね。 解析が正常に機能していれば、ネガティブな数値に傾きそうですが……?
結果はご覧のとおり、正負どちらにも傾かないニュートラルな結果に終わってしまいました。 こちらは文章全体ではなく、句点ごとの出力になります。
このように小さなscoreが大量に加算された後に、句点数で除算されているのでしょうから、文章全体でのscoreは限りなく0に近づいてしまうのでしょう。となると、文章全体に対して感情類推を行うのは難しそうですね。もちろん、人魚の姫のような童話ではなく、極端なワードの多いエッセイなどを解析すれば、また別の結果が出るかもしれません。

また、”ポジティブなシーンでネガティブなワードを使っていないか”などを検証することは出来るでしょうから、小説執筆に対して利用する道もありそうです。面白いですね。

業務で利用する道はあるか考えてみよう

突然ですが、私が所属しているチームでは、TAXELの開発を行なっています。
TAXELは、いわゆるレコメンドエンジンの一種で、現在見ている記事に対してオススメの記事を提示するものです。そのレコメンド方法の一種として、Cloud Natural Language APIを用いればポジティブ/ネガティブレコメンドが出来るのではないかと考えました。
たとえば、明るい記事だけをレコメンドしたいメディアにおいては、scoreが正のものだけを表示し、逆にインパクトで勝負したいメディアであれば、スコアが負のものだけを表示する、などというレコメンドをイメージしています。

そんなわけで、記事っぽい名前のテキストをAPIで解析してみました!


※ これらのテキストは架空ものです。実在の人物/実際の出来事との関係は一切ありません。
ID文章Score
1身元不明の水死体、ジェーン=ドゥ氏のものと判明、警察当局が事件との関連を調査-0.1
2GMO動物園においてパンダの赤ちゃんが誕生、子供たちの笑顔あふれる0.8
3芸能人A氏、不倫相手にカメラの前で強烈ビンタ!「やりすぎ」「骨折したかと思った」と視聴者戦慄0.1
4にんにくチューブと粉チーズでつくる新感覚パスタが超絶美味と話題に0.7
5某政治家による賄賂疑惑に住民たちに不満の声、「信じていたのに……」支援者語る-0.3
文章に対するScoreの対応表
おぉ、割とそれっぽい結果が出てきました。
0.3あたりを閾値としてそれ以上のものだけを出すようにすれば、ポジティブレコメンドあたりは作れそうです。ネガティブな記事に興味がないユーザーに対してアプローチする手段になるかもしれません。
もちろん、実際に作成するだけの価値があるのかとなれば、いろいろと考えることはあるでしょうが……実現できる可能性は十分にありそうですね!

おわりに

今回はCloud Natural Language APIを使って楽しく遊んでみました。
算出方法には疑問が残るものの、実際に業務へと応用できる可能性のある、非常に面白いAPIですね!
Cloud Natural Language APIには感情類推だけではなく、構文解析やエンティティ分析の機能もあるようなので、今度はそちらにも触れてみたいと思っています。

それでは、最後まで閲覧していただき、ありがとうございました!