まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:explorer

Watson API Explorer を実際に使って Watson API を体験してみます。今回は一人の人が書いたテキスト(メールや報告文やインターネットでの書き込みなど)を元にして、その文章の中で使われている単語の傾向や頻度などから、その人の性格を分析する、という Personality Insights API を使ってみます。

なお、このブログエントリはこの続きです。Watson API Explorer そのものの紹介など、まずはこちらの内容を一度確認ください:
Watson API Explorer の使いかた

また、Natrual Language Classifier API についてはこちらで紹介しました。今回はこれの Personality Insights 版になります:
Watson API Explorer で Natural Language Classifier を体験する


実をいうと NLC(Natural Language Classifier) の時と比べて、今回の方がシンプルな紹介になっています。NLC ではデータを学習させて、学習状況を確認して、問い合わせて、、、と色々な API が用意されていましたが、その点では Personality Insights の API は1つだけ(Deprecated な API を含めても2つだけ)なので、その紹介も簡単なのでした。


では実際に Personality Insights を使ってみましょう。まずは Personality Insights を利用するための資格情報を入手する必要があります。 IBM Bluemix にログインし、カタログ画面から Watson カテゴリ内の Personal Insights を選択してインスタンスを作成します:
2016070301


インスタンスを作成したら、そのインスタンスの「サービス資格情報」を確認します。画面内に資格情報が JSON フォーマットのテキストで表示されます。この中の username と password の値が必要になるので、メモしておきましょう。ここまでは前回と同じですね:
2016070302


ここまでの準備ができれば Watson API Explorer で Personality Insights を試してみることができます。まずは Watson API Explorer にウェブブラウザでアクセスします:
2016063000


画面内の "Personality Insights" と書かれたリンクを探してクリックします:
2016070303


すると以下のような Personality Insights API の OpenAPI document が表示されます。
2016070304


画面右上の欄に先ほどメモした username と password をそれぞれ入力します。これで API を実行することが可能になります:
2016070305


実際に性格分析を試してみましょう。性格分析を行うのは画面内リストの上にある POST /v2/profile という API です。 この API を選択します:
2016070306


この API の説明を読むと分かるのですが、性格分析はものすごくシンプルな API を呼ぶだけだったりします。まずリクエストヘッダの中で性格分析を実行するテキスト(後述)の言語を指定する必要があります。 Personality Insights API は日本語テキストにも対応しており、日本語テキストから性格を分析する場合は Content-Language ヘッダの値を "ja" に設定します:
2016070301


そして性格を分析する本文をリクエストボディ(Body)に与えます。シンプルなテキストで与える場合は Content-Type を text/plain にする必要があるので、同時に設定しておきます。なおどの言語のテキストにも言えることですが、ある程度以上の分量(というか単語量)がないと性格分析は動作できないので、それなりの分量のテキストを用意して Body に入力してください。実際にはここで与えるテキストは送信メールや SNS への書き込みなどから自動的に取得して取り出すようなものを使うイメージです:
2016070302


与える情報はこれだけです。最後に "Try it out!" ボタンをクリックして API を実行します:
2016070303


与えたテキストの分量が少なすぎたりすると 200 以外のステータスコードになって失敗しますが、HTTP ステータスコード 200 が返ってくれば成功です。その場合、Response Body には性格分析結果の JSON テキストが返ってくるはずです:
2016070304


なお日本語テキストの場合、動作するためには最低でも 70 単語が必要で、ある程度の精度を求めるには 3,500 単語以上、一般的には 6,000 単語以上必要である、とのことです(という警告メッセージがアウトプットされた JSON テキストの中に書かれています)。なので、例えばメールにしても1回に送信するメールの中身だけだと、動くことは動くが、あまり精度の高い結果にはならないことが予想されます。アプリケーションとして実装するには、それなりの量のインプットデータを入手する仕組みと併せて実装する必要があるように思えます。

アウトプットされた結果の意味も Watson API Explorer の画面で解説されているのですが、簡単に日本語でも紹介しておきます。

API 実行が成功した場合の JSON テキストは以下のようになっているはずです:
{
  "id": "*UNKNOWN*",
  "source": "*UNKNOWN*",
  "word_count": 250,
  "word_count_message": "There were 250 words in the input. We need a minimum of 3,500, preferably 6,000 or more, to compute statistically significant estimates",
  "processed_lang": "ja",
  "tree": {
    "id": "r",
    "name": "root",
    "children": [
      {
        "id": "personality",
        "name": "Big 5",
        "children": [
          {
            "id": "Openness_parent",
            "name": "Openness",
            "category": "personality",
            "percentage": 0.8817962669891322,
            "children": [
              {
                "id": "Openness",
                "name": "Openness",
                "category": "personality",
                "percentage": 0.8817962669891322,
                "sampling_error": 0.06374453499999999,
                "children": [
                  {
                    "id": "Adventurousness",
                    "name": "Adventurousness",
                    "category": "personality",
                    "percentage": 0.6949448384206791,
                    "sampling_error": 0.053405595
                  },
                  {
                    "id": "Artistic interests",
                    "name": "Artistic interests",
                    "category": "personality",
                    "percentage": 0.5663919553503082,
                    "sampling_error": 0.108869125
                  },
                     :
                     :

この結果は結構深い階層構造になっています。まず結果の "tree" 要素の中に性格分析結果が含まれています。その下の "children" の中は3つの要素からなるカテゴリー別の分析結果(の配列)になっていて、最初の1つ目が "Big 5" と呼ばれる手法に従っての性格分析結果になっています。"Big 5" という名前の通り、5つのカテゴリに分けた性格分析がされており、その子要素(children)の最初は "Openness"(開放性)に関する分析結果になっています。Openness の下にも更に細分化された性格分析の結果が含まれており、上記例ですと "Adventurousness"(冒険性)が 0.6949.. つまり約 69.5 %、そのサンプリングエラー値が約 5.3% である、という結果になっています。同様に "Artistic interests"(芸術への理解)の値は約 56.6% で、サンプリングエラー値は約 10.9% である、とされています。このような形での性格分析結果が1つの JSON テキストでまとめて得られてた、ということが分かります。


Watson Personality Insights API による性格分析というのはこのようなものです。つまり入力したテキストに対する分析結果を JSON テキストで返す、という非常にシンプルなものです。この結果をどのように視覚化するか、という部分に関しては原則的には利用者に任されていますが、一例がもう1つの API (POST /v2/visualize ※deprecated)として提供されています。

先ほどの POST /v2/profile の結果の JSON テキストをそのまま POST /v2/visualize を展開した Body に入力します。Content-Type を application/json に設定しておきます:
2016070305


この状態で "Try it out!" ボタンをクリックすると、/v2/profile の結果を使った視覚化処理が行われ、実際にウェブページ内で視覚化を行うための HTML(の一部)が Response Body に返されます:
2016070306


Response Body の中身は HTML 内で使える <script> タグ(<script> ~</script>)なので、これに適当な HTML タグを与えてブラウザで開くと、性格分析結果がこのようなパイチャートのグラフになって表現することができます:
2016070307


ただ、このパイチャート形式のグラフで表現するのはあくまで一例であって、これを使わなければならない、というものではありません。実際に API 自体も deprecated 扱いになっていますし、参考程度に使ってください。

なお、Personality Insights の API そのものの詳細については以下のリファレンスを参照ください:
http://www.ibm.com/watson/developercloud/personality-insights/api/v2/


 

この記事の続きです:
Watson API Explorer の使いかた

上記記事で Watson API Explorer サービスの紹介をしました。今回はより実践的に Watson API を使ってみます。

今回対象にする Watson API は上記記事でも紹介した Natural Language Classifier (以下 NLC)とします。前回は学習前の(空の)データを確認しただけですが、今回は実際にデータを学習させた上で、学習データに対して問い合わせをする、という一連の機能を Watson API Explorer で確認する、という手順を行います。

この手順を紹介する上で、あらかじめ NLC サービスインスタンスを Bluemix 上に作成し、認証情報(username と password)を取得しておく必要があります。その手順については上記前回の記事を参照してください。

加えて今回はデータを学習させる手順が含まれるので、サンプルの学習用データを用意しました。以下のリンクをクリックして、nlc_api_training.zip をダウンロード&展開してください:
http://dotnsf.blog.jp/nlc_api_training.zip

展開すると2つのファイルが出来上がります。いずれもテキストファイル(JSON ファイルと CSV ファイル)なので、興味のある人はテキストエディタで中身を確認してみてください:
2016063001


では実際に Watson API Explorer で NLC を使ってみます。まずは NLC API のページに移動します:
https://watson-api-explorer.mybluemix.net/apis/natural-language-classifier-v1

そして取得済みの username と password を画面右上欄に入力します。これで準備完了:
2016063002


最初にデータを学習させてみますが、その前にまだ何も学習されていないことを確認しておきましょう。現在の状態を確認する API はリストの一番上にある GET /v1/classifiers です。ここをクリックして展開します:
2016063003


この API の説明やパラメータ、実行結果の意味などが表示されますが、この API はパラメータなしで実行するので、特に何も指定する項目はありません。そのまま "Try it out!" ボタンをクリックして実行します。するとこの API が実行され、その結果(Response Body)を見ると "classifiers" が空配列([])になっており、まだ何も学習されていないことがわかります:
2016063004


なお、この上記画面内の "Request URL" を見ると、同じ処理を curl で実行する場合のコマンド内容を確認できます。また "Response Headers" には REST API 実行結果に含まれている HTTP ヘッダの内容を確認することもできます。

もしもこのコマンドの実行結果が空配列ではなく何か含まれていて、次の学習コマンドを実行する前に内容をリセットする場合は、API リストの下から2番目にある DELETE /v1/classifiers/{classifier_id} を実行して現在の学習内容を削除できます。その方法は最後に紹介しますが、ここでは現在は何も学習していない状態であるとして以下を紹介します。

では NLC に学習データを送信してみましょう。新しいデータを学習させる場合の API は上から2番目の POST /v1/classifiers を使います:
2016063005


パラメータの説明を見ると、この API の実行には2つの情報を(POST データとして)与える必要があると書かれています。1つは training_meta_data という名前の JSON データで、もう1つは training_data という名前の CSV データです。実はこれらのサンプルが上記でサンプル zip ファイルを展開した中に含まれていた2つのファイルです。

training_meta_data のサンプルが demo_metadata.json です。サンプルファイルの中身は以下のようになっているはずです:
{"language":"ja","name":"dotnsf_nlc_demo"}

非常にシンプルな内容の JSON テキストです。"language" はこの後の学習データに使われている言語(日本語なので "ja" を指定)、また "name" はこの学習データに付ける名前(この例では "dotnsf_nlc_demo")です。"name" の内容は適当に変更しても構いません。

もう1つの training_data のサンプルが dwj.csv です。 これが学習データに相当するもので、こちらもテキストエディタで開くとわかりますが、以下の様な内容の CSV ファイルです:
Bluemix の Auto-Scaling サービスは、ターゲット環境の・・・,cloud
この記事では、IBM DevOps Services で使用されるスプリント・・・,cloud
  :
  :
Java 8 には、より簡単にプログラムを作成できるように・・・,java
  :
  :
ほとんどの Linux システムでは、仮想マシン (VM) を作成およびサポートするための・・・,linux
  :
  :

CSV の1行は2つだけの列で構成されており、1つ目が本文、2つ目は本文のカテゴリーになっています。つまり「(カテゴリー)の例として(本文)がある」ということを学習データとして与えています。これを1つのカテゴリーについて充分な(この dwj.csv では1つのカテゴリーにつき約100個の)本文を与えて、それを元に学習させている、ということです。

もう少し細かく説明すると、与えた本文は(training_meta_data で指定した「日本語」のルールで)単語に区切られ、品詞に分類した上でその出現頻度や傾向などから「カテゴリ(例えば cloud)とは、こういう特徴を持ったものだ」ということを自分で判断・理解して学習させています。このような例をカテゴリごとに大量に用意して、(上記サンプルでは)cloud とはこういうもの、java とはこういうもの、linux とはこういうもの、・・・といった内容を学習させる、そのための学習元データになっています。

したがって、上記の dwj.csv ファイルはそのままでも動くサンプルですが、新しい情報を書き加えたり、新しいカテゴリのデータを加えて与えたりしても動きます(更新後の内容を学習します)。興味があれば自分なりにカスタマイズしてみてください。


改めて、この2つのサンプルファイルを使って NLC の学習 API を実行してみます。Watson API Explorer のリスト上から2番目の POST /v1/classifiers を展開し、training_meta_data に demo_metadata.json を、training_data に dwj.csv を指定して、"Try it out!" をクリックします:
2016070101


すると指定した2つのファイルがアップロードされ、学習用の分類器(classifier)が新たに1つ生成されて学習が開始されます。"Response Body" にはこの新たに作成された分類器を識別するための ID("classifier_id"、以下の例では "2374f9x69-nlc-8772") が含まれているのでメモしておきましょう。また現時点では "status" が "Training" となっていることもわかります。これは「この分類器はまだ学習が終わっていない状態である(問い合わせできる状態にはなっていない)」ことを意味しています。なので学習が完了するまではしばらく待つ必要があります:
2016070101


なお上記の curl コマンドを見ると、2つのファイルが multipart/form-data 形式でアップロードされていることがわかります。実際にこの部分を REST API で作る際には multipart/form-data で POST するように実装する必要がある、ということもわかります。またメタデータで指定した "name" ("dotnsf_nlc_demo")はこの API の実行結果に現れていることもわかりますね。


特定の分類器の学習が完了しているかどうかを確認するための API も用意されています。リストの1番下にある GET /v1/classifier/{classifier_id} という API です。この API を展開し、パラメータの classifier_id 欄に先程作成した分類器の classifier_id(この例では "2374f9x69-nlc-8772") を指定して "Try it out!" ボタンをクリックします:
2016070102


実行結果の "Response Body" を確認します。下の結果ではまだ "status" が "Training" となっていて、学習が完了していないことがわかります:
2016070103


しばらく(ケースバイケースですが、15~30分程度)待って、この API を実行し、"status" が "Available" となっていれば与えたデータの学習が完了したことになります。こうなると学習済みの分類器に対する問い合わせが可能になります:
2016070105


なお、この状態で再度最初の GET /v1/classifiers API を実行すると、(最初に実行した時の結果は空配列でしたが)先程新たに生成した分類器が実行結果に含まれて返ってくることがわかるはずです:
2016070104


さて、学習が完了したので、Watson NLC に問い合わせを実行してみましょう。リストの上から3番目の GET /v1/classifiers/{classifier_id}/classify か、または4番目の POST /v1/classifiers/{classifier_id}/classify を使って問い合わせを行います。この2つの違いは HTTP メソッド(GET か POST か)と、問い合わせテキストの送信方法(パラメータかリクエスト本文か)です。どちらでもいいのですが、今回は後者の POST /v1/classifiers/{classifier_id}/classify を使ってみましょう。

リスト内の POST /v1/classifiers/{classifier_id}/classify を選んで展開し、classifier_id に作成した分類器の classfier_id(この例では "2374f9x69-nlc-8772")を、body には Watson NLC に問い合わせさせたい日本語テキスト文書を、それぞれ入力します。

今回問い合わせるテキストは「RedHat だけでなく Ubuntu も勉強しないとね」というものにします(変更しても構いません)。この日本語の自然言語テキストを先程学習させた NLC に対して分類をリクエストし、学習時に与えたデータに基いて「学習データに使ったカテゴリでいえば、どのカテゴリに属するテキストであるか?そしてそれはどのくらいの確信度があるのか?」を問い合わせます。

なお body には JSON テキストを指定する必要があり、そのテンプレートが右側にあるので、その内容に沿って、以下のように body を用意する必要があることに注意してください:
{
  "text": "RedHat だけでなく Ubuntu も勉強しないとね"
}

2016070106


そして最後に "Try it out!" をクリックします。正しく実行されると、以下の様な JSON テキストが "Response Body" に返ってくるはずです:
2016070101


ちなみに "Response Body" の全文はこんな感じでした:
{
  "classifier_id": "2374f9x69-nlc-8772",
  "url": "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/2374f9x69-nlc-8772",
  "text": "RedHat だけでなく Ubuntu も勉強しないとね",
  "top_class": "linux",
  "classes": [
    {
      "class_name": "linux",
      "confidence": 0.5345447969025622
    },
    {
      "class_name": "xml",
      "confidence": 0.17404873174100038
    },
    {
      "class_name": "cloud",
      "confidence": 0.09516428245259624
    },
    {
      "class_name": "opensource",
      "confidence": 0.07239515901217708
    },
    {
      "class_name": "web",
      "confidence": 0.0611971709641311
    },
    {
      "class_name": "java",
      "confidence": 0.04321802457711143
    },
    {
      "class_name": "mobile",
      "confidence": 0.019431834350421725
    }
  ]
}

実行結果に相当するのは上記の赤字部分です。これを表形式でまとめると以下の様な結果だった、ということになります:
分類結果順位分類結果確信度(%)
1linux53.45447969025622
2xml17.404873174100038
3cloud9.516428245259624
4opensource7.239515901217708
5web6.11971709641311
6java4.321802457711143
7mobile1.9431834350421725


1位は約 53.45% という確信度を以っての "Linux" でした。7つのカテゴリからの選択で 50% 以上の確信があるということはかなり高いと言えます。また人間の普通の感覚としても「RedHat だけでなく Ubuntu も勉強しないとね」というテキストの分類結果が Linux というのは、自然な(正しい)結果であるように感じます。 改めて注目していただきたいのは、問い合わせ本文には一言も Linux という単語はなかったのに、Linux という分類結果が高い確信度と共に得られている、という点です。


最後に、滅多に使わないかもしれませんが、作成した分類器が不要になった場合に削除する方法も紹介しておきます。リストの下から2番目にある DELETE /v1/classifiers/{classifier_id} を展開し、classifier_id パラメータに自分の ID(この例では "2374f9x69-nlc-8772")を指定して "Try it out!" をクリックします:
2016070102


実行が成功しました。が、成功した場合は特に "Response Body" には削除されたかどうかがわかる情報は含まれてない感じ:
2016070103


本当に消えているかどうかは、一番最初のステータス確認 API を再度実行して、classifier_id が消えていることを確認する必要があります。↓こうなっていれば消えています:
2016070101


以上、Watson API Explorer を使って NLC を体験してみました。NLC がどんなものか、なんとなく理解できましたかね。

まあ、個人的には「curl でやっちまった方が早いじゃん」とも思ってますが、コマンドラインに慣れない人もいるだろうし、こういう Watson API Explorer のようなウェブインターフェースが用意された背景にはそれなりの需要があったのではないかと考えています。加えて、ドキュメントと動作確認機能が統合されているのは確かに便利ですよね。



なお、NLC の API そのものの詳細については以下のリファレンスを参照ください:
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/natural-language-classifier/api/v1/


 

IBM のコグニティブエンジンである Watson の各種 API を実際に使って動作を確認するためのサービス: Watson API Explorer を紹介します:
https://watson-api-explorer.mybluemix.net/


上記サイトにブラウザでアクセスすると、このような画面になり、IBM Bluemix で提供されている各種 Watson API が一覧で並んでいます。ここから実際に使ってみたい API を選択します:
2016062901


今回は自然言語テキストをカテゴリ分類する NLC(Natural Language Classifier) の API を試してみましょう。というわけで Natural Language Classifier (以下 NLC)を選択します:
2016062902


すると NLC の Open API Document 形式のページが表示されます。ここに NLC で提供されている各種 API の概要と、そのエンドポイント URL、メソッド、などが一覧表示されています:
2016062903


試しに一番上の GET /v1/classfiers をクリックしてみると、この API の詳細情報が展開されます。実行時に必要なクエリーパラメータがある場合はその情報も表示され、実行結果のフォーマットサンプルも表示されています。またこの Watson API Explorer サービスの最大の特徴ですが、 "Try it out!" と書かれたボタンをクリックすると、この API を(ここで指定したパラメータで)実際に実行して、その実行結果を確認することも可能です:
2016062904


ただし、実行にはこのサービスを利用するための認証情報が必要になります。画面右上に username と password を入力するフィールドがあり、ここに Watson API を実行するための正しい認証情報を指定する必要があります:
2016062905


この認証情報は IBM Bluemix で対象サービス(今回の例であれば NLC)を追加すると確認することができます。もしまだ NLC を Bluemix で使っていない場合は追加しましょう。Bluemix のカタログページから Watson カテゴリ内の NLC を選択します:
2016062906


今回はランタイムアプリケーションとのバインドを行わずに実行するので、アプリケーション欄は「アンバインド」を選択します。そしてサービスを作成します:
2016062907


サービスが作成できたら左メニューから「サービス資格情報」を選び、この NLC サービスを利用するための認証情報を確認します。画面右にサービス資格情報の JSON テキストが表示され、その中に username と password が表示されるはずです:
2016062908


この username と password を Watson API Explorer 画面の NLC の username および password として指定します。これで準備は整いました:
2016062901


では改めて GET /v1/classifiers を実行してみましょう。この API は現在作成した(学習させた) classifier の一覧を取得する API です。特にパラメータは必要ないのでそのまま "Try it out!" ボタンをクリックします:
2016062902


すると指定した username と password を使って API が実行されます。まだ特に NLC で学習データを作っていない場合は classifier は1つも存在していないので、Response Body の "classifiers" には空配列([])が指定されているはずです。また画面内にはこの処理を curl コマンドで実行する場合に指定するコマンドや、実際にアクセスする先のエンドポイント URL(のホスト名を含めた全文字列)、HTTP レスポンスのヘッダやステータスコードなどが確認できます:
2016062903


とりあえず今回はここまで。Watson API Explorer を使うには目的の Watson サービスインスタンスを作って接続情報(username と password)を取得し、それらの情報を使って API を実行する、という流れを紹介しました。 別の機会により具体的な Watson API ごとの利用方法を紹介するつもりです。



 

コマンドプロンプトをずっと使っていたけど、このワザは知らなかった。。。

Windows7 以降では、エクスプロラーで開いているディレクトリをカレントディレクトリとしてコマンドプロンプトを開く、ということが可能になっていました。その手順を紹介します。

まずエクスプローラーで適当なディレクトリを開きます。この例ではデスクトップを開いています:
2016011801


この状態で画面上部のアドレスバーに "cmd" と入力して Enter キーを押します:
2016011802


別ウィンドウでコマンドプロンプトが開き、直前に見ていたフォルダ(この例ではデスクトップ)がカレントディレクトリになっています:
2016011803


IBM Bluemix の cf ツールはカレントディレクトリをドキュメントルートとみなしてアプリケーション一式を転送、なんてことをよくやるので、このオペレーションで今見ているディレクトリをコマンドプロンプトで開けるのはかなり便利だと思いました。エクスプローラーでファイル一覧からテキストエディタで編集して、編集が終わったら cf ツールでプッシュ、という一連の流れをスムーズにできるようにするために多用することになりそうです。

コマンドプロンプトに関するこの手のワザは結構詳しいつもりでいたのですが、これは知らなかった・・・・

このページのトップヘ