こんにちは。
キャスレーコンサルティングのCC部(CSVクリエーション部)の久保田です。

私はシステム開発プロジェクトのリーダーをしております。
今回は以前から興味があった、Googleの感情解析APIに関してブログに記述してみようと思います。
業務にどのように使えるかを考えていきたいと思います。

目次

  1. Google自然言語API(Google Cloud Natural Language API )とは
  2. Google Cloud Natural Language API使う前の準備
  3. Google Cloud Natural Language API を実際に使ってみた
  4. APIの反応について検証
  5. 考察・感想

1.Google感情解析API(CLOUD NATURAL LANGUAGE API)とは

Google Cloud Natural Language API は使いやすい REST API による強力な機械学習モデルを提供することで、
テキストの構造と意味を明らかにします。

Natural Language API によって、
例えばニュース記事やブログ記事で言及されている人、場所、イベントなどの情報を抽出できます。

また、例えばソーシャルメディアなどで自社サービスについて書かれていることの感情(例 : “肯定的”、“否定的”)を
理解したり、コールセンターやメッセージング アプリで使えば、趣旨を解析することもできます。
参考:CLOUD NATURAL LANGUAGE API

要するに文字列、文章をAPIをリクエストとして、その内容をGoogleの機械学習アルゴリズムが分析して
その文字列の感情を数値化したり、構造、意味を返してくれるというAPIです。

現在、Google自然言語APIは英語、スペイン語、日本語のテキストに対応しています。
今回は文字列の感情分析について検証してきたいと思います。

2.Google Cloud Natural Language API使う前の準備

Google Cloud Natural Language API を使うには、Google Cloud Platform にログインして、
Cloud Natural Language APIを有効化し、 APIキーを取得して、APIにアクセスできる状態にします。

この手順は割愛します。詳しくは以下のリンクを元にセッティングしてください。
https://cloud.google.com/natural-language/docs/common/auth?hl=ja

ここまでなら、難しくないと思いますが、さらにアカウントの請求情報(クレジットカード情報)を入力しないと
現在は利用できません。ここがちょっと試しでやるにはハードルがあるかなという感じです。
今回、ブログを執筆にあたり、自分のGoogleアカウントに請求情報を入力しました。

API利用料金、単価 Cloud Natural Language API の料金は、
テキスト レコードと呼ばれる測定単位を使用して計算されます。

テキスト レコードには、API に送信されて評価されるテキスト コンテンツ内の Unicode 文字を最大 1,000 文字含めることができます。この 1,000 文字を超えるテキストは追加レコードとしてカウントされます。
料金は、1,000 件のテキスト レコードあたりの金額(ドル)で表記されています。

Cloud Natural Language API の使用料金は、使用する API の機能と、その機能を使用して評価されるテキスト レコードの数に基づいて、月額で計算されます。

料金は次のとおりです。

月額料金(テキスト レコード 1,000 件あたり)

月額料金

https://cloud.google.com/natural-language/pricing

APIでリクエストした月のテキスト文字数が5,000文字以下だと無料で、それ以上は課金されますよってことで、
そこまで金額は高くはないと思いますが、お試しでやってみる場合でも文字数で課金されるので
ちょっとハードル高いかなと思いました。

3.Google Cloud Natural Language API を実際に使ってみた。

基本的なリクエストとレスポンスは以下になります。
まずはAPIをツールでhttpリクエストを投げるツールでAPIを投げてみました。
以下にリクエストとレスポンスの説明をします。

リクエスト

POST https://language.googleapis.com/v1/documents:analyzeSentiment?key=YOUR_API_KEY

リクエストのJSON

{
  “encodingType":"UTF8",
  “document":
  {
    “type":"PLAIN_TEXT",
    “language":"ja",
    “content":"僕は初めて技術ブログを書きます。"
  }
}

リクエストの説明をします。

documentのtypeはPLAIN_TEXTとHTMLが選べます。
languageは英語:’en’、スペイン語:’es’、日本語:’ja’が選べます。

解析する文字列はcontentとgcsContentUriでリクエストすることができ、content を渡すと、そのテキストが直接
JSON リクエストに含まれます。gcsContentUri を渡す場合は、Google Cloud Storage 内のテキスト コンテンツを指す
URI を含める必要があります。今回の検証ではcontentを使っていきます。

レスポンス

レスポンスのJSON

{
  "documentSentiment":
  {
    "magnitude": 0.1,
    "score": 0.1
  },
  "language": "ja",
  "sentences":
  {
    "text":
    {
      "content": "僕は初めて技術ブログを書きます。",
      "beginOffset": 0
    },
    "sentiment":
    {
      "magnitude": 0.1,
      "score": 0.1
    }
  }
}

レスポンスの説明をします。
magnitudeは感情の振れ幅の絶対値を表します。

score は、0 より大きい値でポジティブな感情を示し、0 より小さい値でネガティブな感情を示します。
範囲は-1.0〜1.0のとなります。

今回の例では0.1だったので、ほんのちょっとポジティブな感情と判定されたみたいです。
実際の入力した感情としては無感情でしたが、ポジティブにとらえてくれたみたいです。
今回は入力した文字列のscoreを検証して、どのような文章がポジティブなのか、ネガティブなのかを検証していきたいと思います。

今回検証するためにテキストボックスに文章を入力して、その文章のscoreだけを表示する簡単なツールをphpで作成しました。一応ソースを載せておきます。

<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charset = “UFT-8”>
<title>自然言語API Tool</title>
</head>
<body>
<h1>自然言語API Tool</h1>
<form action = 'test.php' method = 'post'>
<textarea name ='comment'  rows="4" cols="40">
<?php
if(isset($_POST["comment"])){
$comment = $_POST["comment"];
echo $comment;
}
?>
</textarea><br/>
<input type = 'submit' value ='送信'>
</form>
<?php
if(isset($_POST["comment"])){
$comment = $_POST["comment"];
$url = “https://language.googleapis.com/v1/documents:analyzeSentiment?key=ここは取得したAPIキーを入力してください。";
$document = array('type' =>'PLAIN_TEXT','language' =>'ja','content' =>$comment);
$postdata = array('encodingType' => 'UTF8', 'document' => $document);
$json_post = json_encode($postdata);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_post);
$result = curl_exec($ch);
curl_close($ch);

$result_array = json_decode($result,true);
echo '感情数値:'.$result_array[documentSentiment][score];

}
?>
</body>
</html>

4.APIの反応について検証

まずはすごくポジティブな反応が出るような文章を入れてみました。
色々、試してみたのですが。。。最高のスコアは0.6でした。
1.0を出すにはどんな文章なんでしょうか。。。

結果は以下です。

検証1

次はすごくネガティブな反応が出るような文章を入れてみました。。。。
がscore:-0.8が最低でしたがブログに載せられる文章ではなかったので、省略します。
代わりに最もポジティブな反応が出た文章を全て否定してみました。
結果は以下です。

検証2

ポジティブな言葉を単純に否定しただけでは、その分の幅でマイナスになるのではないようです。
次にお店の口コミの投稿に使って、口コミの評価をこのAPIで自動的に評価できないかと思い、
今回は飲食店を想定して、口コミを投稿して、お店の評価に使えるかを検証してみました。

検証3

検証4

検証5

検証6

4つの口コミを試してみましたが、ほぼほぼ思った通りの判定になりました。

結構厳しく書いた口コミは-0.5と思ったよりもポジティブに捉えられました。
良くも悪くもない口コミに関しては、-0.1と少しネガティブに捉えられました。

5.考察・感想

今回、感情解析APIを利用してみて、全体的にネガティブに捉えられる傾向があるのかなと思いました。
私の文章の書き方が、ネガティブ傾向があるのかもしれませんが。。。

maxのポジティブ(1.0)、ネガティブ(-1.0)のスコアの文章が考えらえなかったのは残念でしたが、
特に意識せずに文章を書いた場合は、ほぼほぼ-0.6〜0.6に収まる結果になるのかなと思いました。

このAPIを使う用途としては、メールの受信時にAPIの結果を表示し、送信されたメールの感情のスコアを表示して、
ネガティブなメールに対してはアラートをあげる、もしくはネガティブなメールを送らないように送信前に
APIでネガティブなメールを送ろうとしていないかをチェックすることがあげられます。
この用途については、すぐにでも使えると思います。

また口コミ等の書き込みを投稿するサイトにおいて、あまりにも酷い書き込みを防止するために、
このAPIでチェックし、例えばスコアが-0.3以下の書き込みは入力チェックで弾く等のチェックとして利用するのは
有効だと思いました。ただし閾値をどの数値にするかは、具体的にどのような文章がそのスコアになるかがAPIに
任せることになるので、なにを以ってその閾値にするかを決めるのはなかなか難しいと思いました。

おわりに今回、Cloud Natural Language APIを検証しましたが、他に公開されたAPIはgoogle以外でも沢山あるので、
面白いものがあれば検証していきたいなと思います。

以上です。