IBM Bluemix でベータ公開されている Watson Relationsship Extraction サービス(API)を使ってみました。


このサービスは IBM の人工知能サービス Watson の中で、特にテキスト解析を目的として提供されているものです。文章としてのテキストをインプットすると、その中に書かれている関係性を解析して返してくれる、というものです。入力データは非常にシンプルですが、その解析結果はかなり複雑なものになります。しかもこれが REST の API を通じて利用できる、というサービスです。 残念ながら現時点では日本語テキストには対応しておらず、英語およびスペイン語でベータ版サービスが提供されています。ベータ版ということもあるでしょうが、現在は無料で利用できます。


これがどんなものなのか、試しに使ってみたので、その様子を紹介します。

まず、このサービスを利用するには IBM Bluemix のアカウントが必要です。また IBM Bluemix アプリケーションを作成することになります。この辺り、詳しくはこちらのエントリを参照するなどしてください:
http://dotnsf.blog.jp/archives/1001093607.html


また Watson Relationship Extraction サービス自体の解説はこちらを参照いただくのがいいと思います:
https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/sireapi/


では実際にサービスを使ってみます。IBM Bluemix にログインし、Watson Relationship Extraction サービスを作成します。Watson カテゴリの中にあるのでこれを選択します:
2015010800


このサービスを REST から利用するにはエンドポイントURL、ユーザー名、そしてパスワードが必要です。その情報はサービスの「資格情報の表示」と書かれた箇所をクリックして確認できます:
2015010801



特に以下の情報が必要になるのでメモっておきます(これらの情報を環境変数からダイナミックに取得することも可能ですが、コードを単純にしたいので予め用意しておきます):
- url: REST をコールするエンドポイントURL
- username:API を実行する際のユーザー名
- password: 同パスワード

以下ではこれらの内容が後述のようであったと仮定して説明し、コードを書いていきます:
url : https://gateway.watsonplatform.net/laser/service/api/v1/sire/XXXXXXXXXX
username: USERNAME
password: PASSWORD

では、まずコードを書く前に API の実際の挙動を確認してみます。ブラウザを起動し、url の値を使い、以下の内容をそのままアドレスバーに入れてアクセスします:
https://gateway.watsonplatform.net/laser/service/api/v1/sire/XXXXXXXXXX?sid=ie-en-news&rt=xml&txt=John+Smith+lives+in+New+York%2C+and+he+has+been+living+there+since+2001.

ちなみに、URL パラメータ内の txt の値は、実際にテキスト解析したい内容(この例では "John Smith lives in New York, and he has been living there since 2001.")を URL エンコードしたものになります。それ以外のパラメータでは sid で英語文書であること、rt で結果フォーマットを XML にするよう指定しています。


実際にアクセスすると、ユーザー名とパスワードを聞かれるので上記で取得した値を入れます:
2015010802


成功すると、以下の様な XML テキストが返され、ブラウザ画面内に表示されるはずです(Firefox での例です):
2015010803


この中身については別途紹介するつもりですが、とりあえず挙動は分かったと思います。後はこれをコードにするだけです。Java のスタンドアロンアプリケーションで、取得結果を画面に出力するだけであればこんな感じですかね:
import java.net.URLEncoder;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;

public class Test1 {
  static String bre_server = "gateway.watsonplatform.net";
  static String bre_path = "laser/service/api/v1/sire/XXXXXXXXXX";
  static String bre_username = "USERNAME";
  static String bre_password = "PASSWORD";
  static String bre_sid = "ie-en-news";
	
  public static void main(String[] args) {
    try{
      String txt = "John Smith lives in New York, and he has been living there since 2001.";
			
      String auth = bre_username + ":" + bre_password;
      String req_body = "sid=" + bre_sid + "&rt=xml&txt=" + URLEncoder.encode( txt, "utf-8" );
			
      String bre_url = "https://" + auth + "@" + bre_server + "/" + bre_path + "?" + req_body;

      HttpClient client = new HttpClient();
      client.getState().setCredentials( 
        new AuthScope( "gateway.watsonplatform.net", 443 ), 
        new UsernamePasswordCredentials( bre_username, bre_password ) );
      GetMethod method = new GetMethod( bre_url );
      method.setDoAuthentication( true );

      int res_sc = client.executeMethod( method );
      String res_body = method.getResponseBodyAsString();
      System.out.println( res_body );
    }catch( Exception e ){
      e.printStackTrace();
    }
  }
}

実際には取得した XML をそのまま出力するのではなく、その内容をパースして取り出して・・・という処理をすることになると思います。またスタンドアロンアプリで使うことは稀で、実際はサーブレットの中などで使うことになると思いますが、そこは目的に応じて、ということで。


では、この出力結果にはどのような情報が含まれているのか、その内容は長くなりそうなので別のエントリにします(苦笑)。

(2015.01.09 追記)
続きはこちら