IBM Bluemix から提供されている各種サービスについて、開発者視点から実際の使い方を紹介してみようと思います。

ここで紹介するサンプルを開発する時に使う言語は迷いましたが、PHP を使うことにします。
最初にお断りしておくと、IBM Bluemix の API サービスは REST で提供されているものがほとんどで、原則的には(Get や Post などの HTTP アクセスが記述できれば)どの言語でも実現できます。ただ PHP だと(Java でいうところの JAR ファイルとか)拡張ライブラリなどが不要で素のまま HTTP アクセスが使えるということと、取得した結果の JSON テキストも素の PHP のままでデコードして使えるということと、実際にプログラミングとして記述した時に非常にシンプルに書ける、というメリットがあります。 といった観点で PHP を使って紹介しますが、(HTTP アクセスして、結果を取得して、JSON をデコードして、、という)同様の処理を実装すれば他の言語にも応用できるはずです。参考程度ですが、自分が業務用のデモを作る時はほぼ Java で書いてます。


記念すべき第一回目のテーマは IBM Insights for Twitter サービスにします:
https://www.ng.bluemix.net/docs/#services/Twitter/index.html#twitter

IBM が Twitter 社との提携によって decahose と呼ばれるツイート情報を提供されるようになりました。そのツイート情報に IBM のインサイトを加えてデータベース化した上で検索 API を提供しているのが、このサービスです。

このサービスを実際に使って動くデモアプリがこちらに用意されています:
https://cdetestapp.mybluemix.net/
2015060201


テキストフィールドに検索キーワードを入れて "Twitter Search" ボタンをクリックすると、そのキーワードで Twitter の検索(正確には Twitter から提供された情報を元に作られた IBM のデータベース内の検索)結果が表示されます。この例では "IBM" という検索キーワードに対して 333957 件ヒットし、その一部が画面に表示されています。ぶっちゃけ、ここまでは普通の Twitter API でもできることです:
2015060202


次に検索キーワードに "IBM sentiment:positive" と入力してみます。これは「IBM というキーワードを含み、かつ内容がポジティブなもの」を検索しています。結果として 53199 件見つかり、その一部が表示されています:
2015060203


この「内容がポジティブなもの」という検索方法に注目してください。少なくとも Twitter の標準 API ではこのような検索はできません。

IBM が Twitter からツイートの情報を提供されていることは上記で述べましたが、IBM はその内容を自分達のデータベースとして保存する際にストリーミング処理を施し、ツイートの内容やツイートの作者の情報に基づいた情報を独自に付加してデータベース化しています。その付加情報の中に内容のネガ・ポジ情報も含まれているため、このような検索が可能になっています。同様にして「IBM というキーワードを含み、かつ内容がネガティブなもの」という検索("IBM sentiment:negative")も可能です:
2015060204


ネガ・ポジ以外の付加情報も検索キーとして使えます。例えばこの例では「IBM というキーワードを含み、かつ内容がネガティブで、かつ子供がいる人からツイート」という検索("IBM sentiment:negative has:children")をして、その結果を表示しています。なんとなく推測できたかもしれませんが、スペースを付けて複数の条件を指定するとアンド検索になります:
2015060205


なお、検索はここのツイート情報まで表示させることもできますが、単にヒット数だけを調べることもできます。"Twitter Search" ボタンではなく "Twitter Count" ボタンで検索すると、個々のツイート情報は取得せず、数だけを調べることができます。当然ですがこちらの方が軽く動作します:
2015060206



以上、ざっくりとして紹介でしたがなんとなく使い道がわかったでしょうか? 繰り返しますが、IBM Insights for Twitter サービスはこのデモサイトのことではなく、あくまで「このデモサイトの実装に使われている APIです。極端な言い方をすれば、皆さんがこのデモサイトと同じようなサービスを作ることも可能な、そんな REST API が IBM Insights for Twitter サービスです。なお、この API サービスの関数リファレンスについてはこちらを参照ください。ま、要は「一定のルールで書かれた検索文字列を渡せば、その結果を JSON で返してくれる」というウェブ API です:
https://cdeservice.mybluemix.net/rest-api/#!/ibm_twitter_insights


では、実際にこのサービスを PHP から使って、プログラムを作ってみましょう! IBM Bluemix にログインし、(PHP でもそれ以外でもいいのですが)ランタイムを1つ作成します。ここまでの手順がよく分からない場合はこのエントリ等を参考にしてください:
http://dotnsf.blog.jp/archives/1000961115.html

この例では "dotnsf-twitter" という名前の PHP ランタイムを1つ作成しています。ここで「サービスまたは API の追加」をクリックします:
2015060207


サービスの一覧が表示されます。非常に多くのサービスが並んでいますが、「ビッグデータ」カテゴリ内に今回の目的である "Insights for Twitter" サービスが見つかります。これをクリックします:
2015060208



サービス内容を確認します(無料利用の条件などが書かれています)。そして「作成」ボタンをクリックすると、PHP ランタイムにこのサービスを追加します。更に再ステージングについて問われたら「再ステージ」を選択:
2015060209


これで PHP ランタイムに IBM Insights for Twitter サービスがバインドされました。これで API を利用するための情報が確認できます。API 利用情報を確認するには Insights for Twitter サービスアイコンの「資格情報の表示」と書かれた部分をクリックします:
2015060210

 
このような情報が出力されます:
2015060211

 
このような JSON フォーマットのテキストが書かれているはずです。ここに API を実行するために不可欠な情報(特に赤字部分)が書かれています。なお username と password はこの API を実行する際に指定するユーザー名とパスワードで、実際にはランダムに生成された文字列になっています:
{
  "twitterinsights": [
    {
      "name": "Insights for Twitter-8p",
      "label": "twitterinsights",
      "plan": "Free",
      "credentials": {
        "port": "433",
        "username": "(username)",
        "host": "cdeservice.mybluemix.net",
        "password": "(password)",
        "url": "https://(username):(password)@cdeservice.mybluemix.net"
      }
    }
  ]
}

この url の情報と、上記の API リファレンスを組み合わせると API が実行できます。例えば上記デモサイトでも行った「"IBM" というキーワードでツイートを検索」を API で問い合わせる場合を調べてみます。

リファレンスによると "/v1/messages/search" という関数が目的の検索機能であり、ここに "q=IBM" といった具合でパラメータを付与して GET メソッドで実行すればいい、ということが書かれています:
2015060212


これに上記 JSON に書かれたホスト名とユーザー名、パスワードを使って、試しにブラウザでアクセスしてみます。url 値は "https://(username):(password)@cdeservice.mybluemix.net" でした。API は /api パス以下にあるので、ウェブブラウザのアドレス欄に
 https://(username):(password)@cdeservice.mybluemix.net/api/v1/messages/search?q=IBM
と入力してみます(username と password は実際に JSON に書かれているものを指定してください):
2015060213

成功すると↑のような JSON テキストが取得できます。これが IBM での検索結果です。もう少し見やすい形に整形するとこのような結果になっていることが確認できます(赤字はコメント):
{
 "search":{
  "results":334805, ヒットしたレコード数
  "current":100
 },
 "tweets":[ 個別のレコード(配列)
  {
   "message":{ ツイッターからの情報は message として取得できる
    "body":"*******", 本文
    "favoritesCount":0, お気に入り登録数
    "link":"http://twitter.com/****", 個別ツイートへのリンク
    "retweetCount":1, リツイート回数
    "twitter_lang":"en",
    "postedTime":"2013-11-15T16:45:53.000Z",
    "provider":{ ***** },
    "actor":{ ***** },
      :
   },
   "cde":{ IBMが付加した情報は cde として取得できる
    "content":{
     "sentiment":{"polarity":"NEUTRAL", "evidence":[] } 感情情報
    },
    "author":{
     "location":{"state":"North Carolina","country":"United States","city":""},
     "parenthood":{"evidence":"","isParent":"unknown"}, 親かどうかの情報
     "gender":"male", 性別
     "marialStatus":{"isMarried":"unknown","evidence":""} 結婚しているかどうかの情報
    }
   }
  },
  {
   "message":{
      :
  }
 ],
 "related":{
"next":{"href":"https://cdeservice.mybluemix.net/api/v1/messages/search?q=IBM&from=100&size=100"}
} }

詳しくはリファレンス内を参照していただきたいのですが、上記のような JSON フォーマットで検索結果が取得できています。

ちなみに検索文字列を "IBM sentiment:positive" にする場合は URL エンコードする必要があるので、
 https://(username):(password)@cdeservice.mybluemix.net/api/v1/messages/search?q=IBM%20sentiment%3apositive
を指定することになります:
2015060201


余計な情報かもしれませんが、デフォルトではヒットしたレコードのうち、最初の100件だけを取り出します。この数を変えるには URL オプション size で指定します(例 size=200)。また100件目から150件目までの50件を取り出すには URL オプション from を使って from=100&size=50 のように指定します。

なお、個別のツイートは不要でヒットするレコード数だけを検索したい場合は search ではなく count を実行します:
 https://(username):(password)@cdeservice.mybluemix.net/api/v1/messages/search?q=IBM
2015060202


この場合の JSON はツイート情報を含まないため、かなりシンプルになります。こちらなら一見して分かりますね:
{
 "search":{"results":334805},
 "related":{"search":{"href":"https://cdeservice.mybluemix.net/api/v1/messages/search?q=IBM"}}
}


さて、ここまで分かれば後は今のオペレーションを PHP で(或いは別の言語で)実装するだけです。例えばこんな感じの内容(test1.php)にしてみます:
<html>
<head>
<title>Test 1</title>
</head>
<body>

<?php
// URLパラメータ q が指定されている場合のみ API を実行する if( isset( $_GET['q'] ) ){ $q = $_GET['q']; if( $q ){ ?> <h1><?php echo( $q ); ?></h1> <table border="1"> <tr> <th>Sentiment</th><th>Body</th><th>DateTime</th> </tr> <?php
// (username) と (password) は実際に有効なものを指定する $url = "https://(username):(password)@cdeservice.mybluemix.net/api/v1/messages/search?q=" . $q;
// PHP の file_get_contents 関数で実行
$text = file_get_contents( $url );
// JSON デコード $json = json_decode( $text ); $results = $json->search->results; // ヒット数 $tweets = $json->tweets;
// 各ツイート情報ごとにテーブルの1行を作る foreach( $tweets as $tweet ){ $message = $tweet->message; $cde = $tweet->cde; $body = $message->body; // 本文 $link = $message->link; // リンク $postedTime = $message->postedTime; // 日時 $polarity = $cde->content->sentiment->polarity; // 感情 ?> <tr> <td><?php echo( $polarity ); ?></td> <td><a target="_blank" href="<?php echo( $link ); ?>"><?php echo( $body ); ?></a></td> <td><?php echo( $postedTime ); ?></td> </tr> <?php } ?> </table> (#<?php echo( $results ); ?>) <?php } } ?> </body> </html>

これを動かしてみます。HTTP サーバー上にこのファイルを置いて、test1.php?q=IBM のような感じで、検索ワードを指定してアクセスすると、このような検索結果の画面になります。一列目に検索結果の各ツイートの感情が表示されます:
2015060203


一方、今度は指定したキーワードの感情ごとのヒット数を一覧にしてみます。以下の様な内容の test2.php を用意します:
<html>
<head>
<title>Test 2</title>
</head>
<body>

<?php
if( isset( $_GET['q'] ) ){
  $q = $_GET['q'];
  if( $q ){
?>
<h1><?php echo( $q ); ?></h1>
<table border="1">
 <tr>
  <th>Sentiment</th><th>#</th>
 </tr>
<?php
    $sentiments = array( 'positive', 'neutral', 'ambivalent', 'negative' );
    $url0 = "https://(username):(password)@cdeservice.mybluemix.net/api/v1/messages/count?q=" . $q . "%20sentiment%3a";
    foreach( $sentiments as $sentiment ){
      $url = $url0 . $sentiment;
      $text = file_get_contents( $url );
      $json = json_decode( $text );

      $results = $json->search->results;
?>
 <tr>
  <td><?php echo( $sentiment ); ?></td>
  <td><?php echo( $results ); ?></td>
 </tr>
<?php
    }
?>
</table>
<?php
  }
}
?>

</body>
</html>
これも動かしてみます。HTTP サーバー上にこのファイルを置いて、test2.php?q=IBM のような感じで、検索ワードを指定してアクセスすると、このキーワードを positive(ポジティブ) / neutral(中間) / ambivalent(混合) / negative(ネガティブ) の4つの感情ごとにヒット数を求めて、一覧表にして表示する、という内容になっています:

2015060204


このくらいになると「指定したキーワードが Twitter 上でどういう感情割合で使われているか」を調べるツールとして使えそうです。後はもう少し視覚的に工夫すれば、もう少し実用的になれそうですよね。


今回は PHP でのサンプルを紹介しました。とはいえ、PHP に依存しているのはこのエントリでも最後の部分だけです(PHP は file_get_contents 関数が使えるのですごく楽です)。他の言語でも同様の REST API を実行するだけですので、移植にも是非チャレンジしてみてください。