LoginSignup
7
9

More than 5 years have passed since last update.

Watson Natural Language Understandingの感情分析触ってみた

Last updated at Posted at 2017-05-19

Watson Natural Language Understandingの感情分析触ってみたところ面白そうだったのでメモ。他にもNLUのAPIあるんですけど、あんまり細かくは分からないんですよね。

翻訳

感情抽出に関しては英語にしか対応していませんので、まずはMicrosoft Translator APIで日本語を英語に翻訳しましょう。

Microsoft TranslatorでKey取得しておいて下さい。

こんな感じ。

translate.php
<?php

define('AZURE_KEY', 'YOUR_AZURE_KEY');
define('AUTH_URL', 'https://api.cognitive.microsoft.com/sts/v1.0/issueToken');

$text = $_GET['text'];
$from = $_GET['from'];
$to = $_GET['to'];

try
{
  $accessToken = GetAccessToken();
  $params = 'text=' . urlencode($text) . '&from=' . $from . '&to=' . $to . '&appId=Bearer+' . $accessToken;;
  $url = 'http://api.microsofttranslator.com/v2/Http.svc/Translate?'  .$params;
  $response = Request( $url );
  echo $response;
} catch(Exception $e) {
    echo $e->getMessage();
}

function GetAccessToken()
{
  $params = json_encode('{body}');
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_URL, AUTH_URL );
  curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($params),
    'Ocp-Apim-Subscription-Key: ' . AZURE_KEY
    )
  );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );

  $response = curl_exec($ch);
  if(curl_errno($ch)){
    throw new Exception( curl_error( $ch ) );
  }
  curl_close( $ch );

  return $response;
}

function Request( $url )
{
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: text/xml' ) );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );

  $response = curl_exec($ch);
  if(curl_errno($ch)) {
    throw new Exception(curl_error($ch));
  }
  curl_close( $ch );

  return $response;
}

?>

感情分析

page.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no" />
<title>Watson NLU Test</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(function(){
  $("#text").focus();
  $('#text').keypress(function(e) {
    if (e.which == 13) {
      $("#button").click();
    }
  });
  $("#button").click(function(){
    $("#result").html("Understanding...");
    var translated = "";
    $.ajax({
      type: "GET",
      url: "translate.php?from=ja&to=en&text=" + encodeURI($("#text").val()),
      async: false,
      success:function(data){
        console.log("success");
        console.log(data);
        translated = data;
      },
      error:function(){}
    });

    var url = "https://watson-api-explorer.mybluemix.net/natural-language-understanding/api/v1/analyze?version=2017-02-27&features=emotion&text=" + encodeURI(translated);
    console.log(url);
    $.ajax({
      type: "GET",
      url: url,
      success: function( data ){
        console.log("success");
        var emotions = data.emotion.document.emotion;
        console.log(data);
        console.log(emotions);
        $("#result").html("<span style='font-size:" + (20 + 50 * (emotions.anger / 1.0)) +
          "pt'>😡</span><span style='font-size:" + (20 + 50 * (emotions.disgust / 1.0)) +
          "pt'>😵</span><span style='font-size:" + (20 + 50 * (emotions.fear / 1.0)) +
          "pt'>😱</span><span style='font-size:" + (20 + 50 * (emotions.joy / 1.0)) +
          "pt'>😃</span><span style='font-size:" + (20 + 50 * (emotions.sadness / 1.0)) +
          "pt'>😭</span>");
      },
      error: function( XMLHttpRequest, textStatus, errorThrown ){}
    });
  });

});
</script>
</head>
<body>
  <h1>Watson NLU Test</h1>
  <input type="text" id="text">
  <button id="button">Tap Me</button>
  <div id="result"></div>
</body>
</html>

分析してみる




まとめ

翻訳通さずに直接英語渡すとかなり精度出るんですが、翻訳挟むとそうでもないですね。

宣伝

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例

好評発売中!

7
9
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
9