Watson on Bluemix でNLCことはじめ (2)


[Watson on Bluemix でNLCことはじめ (1)](http://qiita.com/hosoken/items/dc0b72a2474c41e2cc81) の続きです。
今回はアプリケーションからAPI経由で、NLCサービスをつついてみたいと思います。
とは言いつつもアプリケーションは一から手作りせずに、以下の方針で進めます。

1. GutHubからアプリを拝借
1. 拝借したアプリの設定を変更して、自作のNLCサービスに接続
1. アプリから自作のNLCをつついてみる

こんな感じでやってみようと思います。

今回の手順では、Bluemixのクラウド上で全てを済ませることが出来るので、特にクライアント側で準備するものはありません。
もし、UIを変更したり独自の機能を作りこみたい場合、ローカルで作業したくなると思います。その際は、今回拝借するアプリがNode.jsアプリなので、ローカルに[Node.js](https://nodejs.org/en/)や[npm](https://www.npmjs.com/)を入れたり、Bluemixデプロイ用に[Cloud Foundry CLI](https://github.com/cloudfoundry/cli)ツールを入れたりする必要があります。

## 1. GitHubからアプリを拝借

今回利用するのは、[IBM Watson Developer Cloud](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/)で公開されているNLCの[デモアプリ](http://natural-language-classifier-demo.mybluemix.net/)です。

デモ自体は、天候についての質問をすると「気温」についての質問なのか、「天候状態」についての質問なのか、を分類してくれるとっても興味深いデモです。[トレーニングデータ](https://github.com/watson-developer-cloud/natural-language-classifier-nodejs/blob/master/training/weather_data_train.csv)も公開されています。

#### 1-1. GitHubから"Deploy to Bluemix"

早速、デモアプリのgithubページからアプリを拝借します。
 https://github.com/watson-developer-cloud/natural-language-classifier-nodejs

普通のForkではなく、ページ中段にある「Deploy to Bluemix」ボタンからアプリを持ってくるようにします。

![101_fork.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/0ce70f2a-f3ad-3cee-6811-9e2520200e4a.jpeg)

すると、Bluemixにログインするように求められるので、素直にログインします。
デプロイに際しては、アプリ名やデプロイ対象のBluemixスペースなどを設定して、「DEPLOY」ボタンをクリックします。

![102_deploy.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/07de7984-b439-a4b9-0671-a05ed258e26a.jpeg)

※ここでは、[IBM DevOps Services](https://hub.jazz.net/)が利用されます。
詳細についてはこちらの[チュートリアル](http://www.ibm.com/developerworks/jp/cloud/library/j_cl-teamdev-bluemix-app/)がわかりやすいかもしれません。
Gitのホスティングサービス、Web IDE、自動デプロイなどの機能が提供されています。

しばらく待つとデプロイが完了し、以下のような画面になります。

![103_deploy_success.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/b55bb8c2-f3eb-57a2-c46e-f79fc231fd42.jpeg)

#### 1-2. アプリケーション確認

「VIEW YOUR APP」ボタンをクリックすると、自分のBluemix環境上にデプロイされたデモアプリが開きます。
この段階で、画面上の「Ask」ボタンをクリックしてもNLCが動かないため、Errorとなります。

いったん、Bluemixのダッシュボードに戻ってみると、以下のようにアプリケーションとNLCサービスが作成されていることがわかります。

![104_deploy後ダッシュボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/444490d7-ac80-48f5-129e-ed6c82eb1d92.jpeg)

NLCのサービス名が「natural-language-classifier-standard」となっている方が、DEPLOYによって自動生成されたものです。
今回、自動生成された方のサービスは使わないので、右上の歯車マークから「サービスの削除」をしてしまって良いです。

## 2. 自作のNLCサービスに接続

ここからは、Gitから取得したアプリ（ソース）に、前回作成した自作のNLCサービスを紐付けて、自作NLCサービスに接続するように設定していきます。

#### 2-1. サービスをバインド

まず、ダッシュボードからアプリケーションを選択し、アプリケーション概要ページで「サービスまたはAPIのバインド」をクリックします。

![105_アプリ概要.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/a866084d-b497-2002-a2d7-a0d88a102d4f.jpeg)

ポップアップ内に表示される前回作成した自作のNLCサービスを選択し、"追加" ボタンをクリックします。これでアプリケーションに自作のNLCサービスがバインドされました。

バインドが完了すると、"アプリを再ステージングするか" と聞かれますが、どっちみちまだ動かないのでしなくても良いです。

#### 2-2. 資格情報を確認

つぎは、利用するサービスの資格情報を確認し、アプリケーションに設定できるようにメモっておきます。

アプリケーションにサービスをバインドすると、概要ページにサービスのハコが表示されるので、NLCのハコの中にある、"資格情報の表示"をクリックします。
資格情報が表示されるので、"password" と "username" をメモっておきます。

![106_サービス資格情報.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/5f2be6e5-12be-3027-f59b-0cc58046c3a6.jpeg)


また、NLCのtoolkitを起動し、作成したClassifierの "Classifier ID" もメモっておきます。
![107_classifierID.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/edf4fe39-fee9-9974-f07e-3eee7d4ee217.jpeg)


#### 2-3. Web IDEでソース編集

続いては、コードを編集して自作NLCを設定します。
アプリケーションの概要ページにある、"コードの編集" をクリックすると、Web IDEが起動し、ソースコードを編集できます。

![107_コード編集.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/f62298e8-ee09-90a1-834f-0582a2e537b5.jpeg)

Web IDE
![110_コード編集画面_対象.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/f15ea890-6ffa-acb0-271c-5ca9d2d73537.jpeg)

app.jsとmanifest.ymlが編集対象です。以下のように修正します。

**app.js**
username と password の箇所を2-2. で確認した資格情報の値で置き換えます。47行目の"classifier-id"を自作NLCのClassifier IDに置き換えます。

```js
// Create the service wrapper
var nlClassifier = watson.natural_language_classifier({
  url : 'https://gateway.watsonplatform.net/natural-language-classifier/api',
  username : '<username>',
  password : '<password>',
  version  : 'v1'

});
```

```js
// Call the pre-trained classifier with body.text
// Responses are json
app.post('/api/classify', function(req, res, next) {
  var params = {
    classifier: process.env.CLASSIFIER_ID || '<classifier-id>', // pre-trained classifier
    text: req.body.text
  };
```

**manifest.yml**
"natural-language-classifier-standard"の箇所を自作NLCの名前に修正します。


```yaml
---
declared-services:
  natural-language-classifier-standard:
    label: natural_language_classifier
    plan: standard
applications:
- services:
  - natural-language-classifier-standard
  name: natural-language-classifier-nodejs-xxx
  command: npm start
  path: .
  memory: 512M
  host: natural-language-classifier-nodejs-xxx
```

* 編集後、保存するのを忘れずに！
(Ctrl+s もしくは、「メニュー」->「ファイル」->「保存」）

* "ワークスペースからのアプリケーションのデプロイ" を実行
![111_デプロイonWebIDE.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/a0967ade-5f04-a938-8d5b-1ddf5d49307c.jpeg)
* 実行中になればOK


## 3. アプリから自作のNLCをつついてみる

ようやく、自分のBluemix上のアプリから、自作NLCをつつきます。
アプリケーションの概要から「経路」のURLから画面を開いて、前回やったような文言をテキストボックスに入力し、「Ask」ボタンクリックしてみます。

![112_アプリ画面.jpg](https://qiita-image-store.s3.amazonaws.com/0/119379/e492704b-778d-63e0-2970-6c8c1d849198.jpeg)

Outputが、OK・NG にClassificationされていれば自作NLCが使えています。
お疲れ様でした！

---
#####  さいごに、、、

今回はアプリから自作NLCをつついてみるという事でしたが、Bluemixの使い方に終始してしまった感があります。。とは言え、これをきっかけにいろいろいじっていければと思う次第です。



##### 以下参考
* API Reference
http://www.ibm.com/watson/developercloud/natural-language-classifier/api/v1/

* API Explorer 
https://watson-api-explorer.mybluemix.net/apis/natural-language-classifier-v1