IBM Watosonを触ってみた(Language TranslatorとNatural Language Understanding)

[BRIGHT VIE Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/brightvie) の11日目です！（投稿が1日遅れました...）

今日はIBMのWatosonを利用する機会がありましたので、その時のメモです。

# はじめに

きっかけは、2017年10月27日(金)に東京で開催された、「[AI Business Forum - IBM とソフトバンクが描く、Watsonで変えるビジネスシーン](https://ibmsb.smktg.jp/public/seminar/view/4)」に参加したことから始まります。

この中で、「IBM Cloudライト・アカウント」について正式な発表があり、Watson APIを気軽に利用することが出来るようになりました。

また、発表の中やその後の展示会ブースでも「とにかく使ってみて下さい」とお話をされていたので、使ってみたときのことを記載してみようと思います。

- 参考
   - [AI Business Forum](https://ibmsb.smktg.jp/public/seminar/view/4)
   - [日本IBM幹部「Watson無料化」についてコメント「AI Business Forum 2017」](https://enterprisezine.jp/article/detail/10012)

# IBM Watsonとは

IBMはワトソンを、自然言語を理解・学習し人間の意思決定を支援する『コグニティブ・コンピューティング・システム（Cognitive Computing System）』と定義しており、ワトソンは人間の認知と同等の機能を目指して作られたAPI群の総称です。

そのため、自然言語処理によるテキスト解析を行うためのAPIや音声をテキストに変換するAPI、画像処理を行うAPIなど様々なAPIが提供されております。

- 参考
   - [結局IBM Watsonって何ができるの？](https://qiita.com/ykensuke/items/f85eca0bfd6615d0261b)
   - [IBM Watson って結局なに？どうやって使うの？](https://www.e-pit.jp/careerlab/3/1927)


# 記録データをIBM Watsonで分析してみる

弊社では、介護や医療、子育て支援系のシステム開発に携わっているため、日々の記録データなどが蓄積されてきている状態であり、そのデータをどのように有効活用し利用いただいている皆様にお返し出来るのかを試行錯誤している状態です。
その中でも、テキストデータを扱うことが多いため今回は、「Natural Language Understanding（テキスト分析）」を行ってみました。

なお、今回はサンプルデータとしてより現場でやりとりされているイメージに近い形でやってみたかったこともあり、
「車内では、昨日お寿司を食べに行って食べ過ぎた話や幼い頃の話などをされ終始笑顔のご様子でした。」
という文章を作成し、このテキストを用いてやってみようと思います。

## Language Translatorで日本語のテキストデータを英語に翻訳する

日本語データをそのまま扱うことが一番良いのですが、
実際にやってみた地点(2017/11/7)では「Natural Language Understanding」は、
まだ日本語に対応しておらず、日本語のテキストデータを一度英語に変換してから行う必要がありました。

そのため、英語に翻訳するために、「[Language Translator](https://www.ibm.com/watson/jp-ja/developercloud/language-translator.html)」を利用しました。

まずは、「IBM Cloudライト・アカウント」を取得後、APIを実行するためのキー情報を発行します。

詳しくは下記記事など参考になるかと...

- [IBM Cloud (aka Bluemix) ライト・アカウント作成手順](https://qiita.com/KenichiSekine/items/249d2ff691b6565fb127)
- [【AI事始め】Watson APIをPythonで使ってみる（Language Translator）](https://qiita.com/kg1/items/88be91c5ecde8600220e)


その後、[公式ドキュメント](https://www.ibm.com/watson/developercloud/language-translator/api/v2/?node#translate)に記載のようにプログラムを記載。（今回はNode.jsで試してみました）

```run.js
var watson = require('watson-developer-cloud');
var language_translator = watson.language_translator({
  username: '{username}',  // 発行したusernameを記載
  password: '{password}',  // 発行したpasswordを記載
  version: 'v2'
});
language_translator.translate({
    text: 'テキスト情報',  // ここが翻訳したいテキスト情報
    source: 'ja',       // 翻訳前の言語（今回は日本語から英語のためjaを指定）
    target: 'en'        // 翻訳後の言語（今回は英語のためenを指定）
  }, function(err, translation) {
    if (err)
      console.log(err)
    else
      console.log(translation);
});
```

公式のドキュメントにもサンプルは記載されているので簡単ですね。そして実行してみると...

```
$  node run.js 
Error: LanguageTranslatorV2 currently defaults to the url for LanguageTranslationV2, but this will change in the next major release of the watson-developer-cloud Node.js SDK. Please either specify the url https://gateway.watsonplatform.net/language-translator/api or else use LanguageTranslationV2. See http://www.ibm.com/watson/developercloud/doc/language-translator/migrating.shtml for more details.
    at new LanguageTranslatorV2 (/Users/xxxx/Workspace/Watson/language-translator/node_modules/watson-developer-cloud/language-translator/v2.js:42:17)
    at Object.value (/Users/xxxx/Workspace/Watson/language-translator/node_modules/watson-developer-cloud/index.js:91:14)
    at Object.<anonymous> (/Users/xxxx/Workspace/Watson/language-translator/run.js:2:34)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:504:3
```

なにやらエラーが...

npmのサイトを確認し([Watson Developer Cloud Node.js SDK - npm](https://www.npmjs.com/package/watson-developer-cloud))下記のように再度書き直します。

```run.js
var LanguageTranslatorV2 = require('watson-developer-cloud/language-translator/v2');
 
var languageTranslator = new LanguageTranslatorV2({
  username: '{username}',
  password: '{password}',
  url: 'https://gateway.watsonplatform.net/language-translator/api/'
});
 
languageTranslator.translate({
      text: '車内では、昨日お寿司を食べに行って食べ過ぎた話や幼い頃の話などをされ終始笑顔のご様子でした。',
      source: 'ja',
      target: 'en'
    }, function(err, translation) {
          if (err)
              console.log(err)
          else
              console.log(translation);
    });
```

そして実行

```
$  node run.js 
{ translations: [ { translation: 'in the car went to eat sushi yesterday, ate too much story and the story of his childhood is how smile throughout.' } ]}
```

出来ましたね。ただ、やはり日本語から英語に翻訳される際に日本語のニュアンスや精度の面で少し劣っているような気がしており、このデータを「Natural Language Understanding」で分析しても精度的にはどうなんだろうという懸念も少し持ちました。

が、今回はお試しなので次に行ってみます。

## Natural Language Understandingでテキストデータを解析

[Natural Language Understanding](https://www.ibm.com/watson/services/natural-language-understanding/)を利用して先程翻訳したテキスト情報を解析してみようと思います。

先ほどと同様にダッシュボードより認証のキーを発行後、下記のようにプログラムを記載

```run.js
var NaturalLanguageUnderstandingV1 = require('watson-developer-cloud/natural-language-understanding/v1.js');

var naturalLanguageUnderstanding = new NaturalLanguageUnderstandingV1({
  username: '{username}',  // 発行したusernameを記載
  password: '{password}',  // 発行したpasswordを記載
  version_date: '2017-02-27'
});

var parameters = {
   keywords:{},    // キーワードの抽出
   sentiment: {},  // 感情の抽出
   text: "in the car went to eat sushi yesterday, ate too much story and the story of his childhood is how smile throughout."
};

naturalLanguageUnderstanding.analyze(parameters, function(err, response) {
   console.log(response);
});
```

やってみた

```run.js
$ node run.js
{
  "results": {
    "keywords": [
      {
        "relevance": 0.947714, 
        "text": "sushi"
      }, 
      {
        "relevance": 0.892267, 
        "text": "story"
      }, 
      {
        "relevance": 0.781927, 
        "text": "childhood"
      }, 
      {
        "relevance": 0.663297, 
        "text": "car"
      }
    ],
    "sentiment": {
      "document": {
        "label": "positive", 
        "score": 0.920562
      }
    },
  }
}
```

でた！

あまり詳しくない中でとりあえず動かしてみただけですが、まずテキストの内容から「終始笑顔のご様子」ともあるのでポジティブなもというのが分かり、実際の分析結果としても「positive」と出ている。
キーワードとしても、お寿司、お話、幼少期、車とテキストの特徴を捉えている！

なるほどなぁと思いつつ、やはり日本語を英語に翻訳した際に微妙なニュアンスがうまく伝わらなかったりして精度が落ちないかは少し心配なところという印象はありました。


# まとめ

導入に関してはとても簡単に行うことが出来、環境として準備されているのはとてもありがたいことだなと感じています！
色々あるAPIやツールをどのように組み合わせれば、必要な情報、欲しい情報を見つけることが出来るのか、そのためそれぞれの特徴や出来ることをしっかり理解して、取り組んでいければなと思っております。