はじめに
こんにちは、GMOアドマーケティング TAXEL開発部のy-otakiです。今回は、Googleさんから提供されている Cloud Natural Language APIを試してみようと思います!
概要
- Cloud Natural Language APIを用いてテキストの感情類推を行う。
- 小説や単語の感情類推をテストしてみたうえで、業務に応用できないか検討を行う。
- 導入方法については簡易的な説明のみに留める。
実際に動作させてみよう
こちらを参考にGoogleColaboratoryを使ってテストを行なっていきます。APIキーの取得方法は調べれば山ほど出てきますので、ここでは省略させていただきますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import requests API_KEY = "あなたのAPIキーをここに入力してください。" END_POINT = "https://language.googleapis.com" URL = f"https://language.googleapis.com/v1/documents:analyzeSentiment?key={API_KEY}" analyzeText = "メロスは激怒した" headers = {'Content-Type': 'application/json'} body = { 'document': { 'type': 'PLAIN_TEXT', 'language': 'JA', 'content': analyzeText } } res = requests.post(URL, headers=headers, json=body) res.json() |
上記のコードを実行すると、テキスト(“メロスは激怒した”)を解析した結果が下記のように出力されるかと思います。
1 2 3 4 |
{'documentSentiment': {'magnitude': 0.1, 'score': -0.1}, 'language': 'ja', 'sentences': [{'text': {'content': 'メロスは激怒した', 'beginOffset': -1}, 'sentiment': {'magnitude': 0.1, 'score': -0.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 |
とはいえ、内部の仕様が公開されていない以上、確かめる方法もありませんし次の実験に移りましょう。
小説を分析してみよう
さて、次は長文を放り込んでみることにします!
著作権が消滅した作品を公開している青空文庫さんから、ハンス・クリスチャン・アンデルセン作(矢崎源九郎訳)、人魚の姫をまるごと解析してみることにします。人魚の姫は、人間に恋した人魚が声を対価に陸へと上がり、けれど言葉を伝えられないがために悲恋に終わる、有名な童話ですね。 解析が正常に機能していれば、ネガティブな数値に傾きそうですが……?
1 |
'documentSentiment': {'magnitude': 193.5, 'score': 0} |
結果はご覧のとおり、正負どちらにも傾かないニュートラルな結果に終わってしまいました。
1 2 3 4 5 6 7 8 9 10 |
'sentences': [{'text': {'content': '海のおきへ、遠く遠く出ていきますと、水の色は、いちばん美しいヤグルマソウの花びらのようにまっさおになり、きれいにすきとおったガラスのように、すみきっています。', 'beginOffset': -1}, 'sentiment': {'magnitude': 0.1, 'score': 0.1}}, {'text': {'content': 'けれども、そのあたりは、とてもとても深いので、どんなに長いいかり綱づなをおろしても、底まで届くようなことはありません。', 'beginOffset': -1}, 'sentiment': {'magnitude': 0.5, 'score': 0.5}}, {'text': {'content': '海の底から、水の面おもてまで届くためには、教会の塔とうを、いくつもいくつも、積みかさねなければならないでしょう。', 'beginOffset': -1}, 'sentiment': {'magnitude': 0.2, 'score': -0.2}}, (略) |
このように小さなscoreが大量に加算された後に、句点数で除算されているのでしょうから、文章全体でのscoreは限りなく0に近づいてしまうのでしょう。となると、文章全体に対して感情類推を行うのは難しそうですね。もちろん、人魚の姫のような童話ではなく、極端なワードの多いエッセイなどを解析すれば、また別の結果が出るかもしれません。
また、”ポジティブなシーンでネガティブなワードを使っていないか”などを検証することは出来るでしょうから、小説執筆に対して利用する道もありそうです。面白いですね。
業務で利用する道はあるか考えてみよう
突然ですが、私が所属しているチームでは、TAXELの開発を行なっています。TAXELは、いわゆるレコメンドエンジンの一種で、現在見ている記事に対してオススメの記事を提示するものです。そのレコメンド方法の一種として、Cloud Natural Language APIを用いればポジティブ/ネガティブレコメンドが出来るのではないかと考えました。
たとえば、明るい記事だけをレコメンドしたいメディアにおいては、scoreが正のものだけを表示し、逆にインパクトで勝負したいメディアであれば、スコアが負のものだけを表示する、などというレコメンドをイメージしています。
そんなわけで、記事っぽい名前のテキストをAPIで解析してみました!
※ これらのテキストは架空ものです。実在の人物/実際の出来事との関係は一切ありません。
ID | 文章 | Score |
1 | 身元不明の水死体、ジェーン=ドゥ氏のものと判明、警察当局が事件との関連を調査 | -0.1 |
2 | GMO動物園においてパンダの赤ちゃんが誕生、子供たちの笑顔あふれる | 0.8 |
3 | 芸能人A氏、不倫相手にカメラの前で強烈ビンタ!「やりすぎ」「骨折したかと思った」と視聴者戦慄 | 0.1 |
4 | にんにくチューブと粉チーズでつくる新感覚パスタが超絶美味と話題に | 0.7 |
5 | 某政治家による賄賂疑惑に住民たちに不満の声、「信じていたのに……」支援者語る | -0.3 |
0.3あたりを閾値としてそれ以上のものだけを出すようにすれば、ポジティブレコメンドあたりは作れそうです。ネガティブな記事に興味がないユーザーに対してアプローチする手段になるかもしれません。
もちろん、実際に作成するだけの価値があるのかとなれば、いろいろと考えることはあるでしょうが……実現できる可能性は十分にありそうですね!
おわりに
今回はCloud Natural Language APIを使って楽しく遊んでみました。算出方法には疑問が残るものの、実際に業務へと応用できる可能性のある、非常に面白いAPIですね!
Cloud Natural Language APIには感情類推だけではなく、構文解析やエンティティ分析の機能もあるようなので、今度はそちらにも触れてみたいと思っています。
それでは、最後まで閲覧していただき、ありがとうございました!