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

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

2016/06

(注 ノーツ9の FP8 を適用することで、この記事のままでも正しく動くようになりました)

注 この記事の内容は作成当初の状況から変化があり、サンプルが正しく動かなくなっています
   新しい記事はこちらです http://dotnsf.blog.jp/archives/1062359514.html 



全国のノーツファンの皆様、こんにちは。そしてご無沙汰しております。

この度 IBM ノーツクライアントを使って、IBM Watson の学習機能や問い合わせ機能を体験できるサンプル NSF ファイルを作って公開してみました:

(注 動くように変更したサンプルはこちらです)



最初にお断りを。このデータベースで実際に Watson を動かして利用するには IBM Bluemix のアカウントが必要です。アカウント作成から30日間は無料で利用できたり、無料期間終了後にも無料枠が用意されていたりします。まだお持ちでない場合はぜひこの機会にアカウントを作成してみてください:
https://console.ng.bluemix.net/registration/


加えて、この記事で提供しているノーツのサンプルデータベースは(当たり前といえば当たり前ですが)ノーツクライアントがないと開くことはできません。ノーツクライアントをお持ちでない場合は、こちらのリンクなどからトライアル版をダウンロード&インストールするなどしてご用意ください。

以下、有効な IBM Bluemix アカウントをお持ちで、かつノーツクライアント導入済みであるという前提で紹介します。


利用にあたっては上記 URL からファイルをダウンロード&展開して、nlcdemo.nsf ファイルをノーツ9クライアントで開いてください(ノーツ9で動作確認してます)。なお ACL はデフォルトで管理者にしているので Domino Designer でも開けるはずです。設計に興味ある方は色々調べてください。改変上等!

使い方は NSF ファイル内の「アプリケーションの使い方」にも記載していますが、一応簡単にこちらでも概要と併せて紹介しておきます。

このノーツデータベースは「Watson NLC のデモ」を目的に作成しました。NLC は Natural Language Classifier の略で、IBM Bluemix を通じて提供している Watson API の1つです:
2016061001


NLC はその名が示す通り「自然言語(Natural Language)分類(Classify)」の API です。自然言語のテキスト文書を与えると、あらかじめ学習させた内容に基いたカテゴリに分類し、その結果を確信度合いの数値と共にアウトプットする、というものです。もちろん日本語に対応しています。この API の資料や価格情報などは以下を参照ください:
https://console.ng.bluemix.net/catalog/services/natural-language-classifier/

2016061002


実際にノーツのサンプルデータベースを使うには NLC の接続情報(インスタンスに接続するためのユーザー名とパスワード)が必要になります。ノーツクライアントで「アプリケーションの使い方」を開いて、NLC のインスタンスを作成し、その作成したインスタンスに接続するための username と password を確認してください:
2016061201


一方、ノーツのデータベース、特に「カテゴリビュー」と呼ばれる見出しで分類された一覧を持つデータベースはノーツで多く使われています。上記のサンプル NSF の CatView ビューでは IT 関連の日本語テキスト文書が約 700 件登録されており、それぞれの内容が7つのカテゴリに分類されて表示されているはずです:
2016061202

※ちなみにこのデータベースの中身は IBM developerWorks の技術カテゴリと文書をインポートして使っています


今回はこのカテゴリビューの内容をそのまま NLC に学習させます。例えば "Cloud" のカテゴリに分類されている約100件の文書の本文を使って "Cloud" というものを教えます。同様に "Java" カテゴリの文書を使って "Java" を教え、"Linux" カテゴリの文書を使って "Linux" を教え、・・・ といった具合です。

ここで重要なことは「一般論を教えるのではなく、あくまでこのデータベース内の(カテゴリビューの)情報だけを元に各用語を学習させる」ということです。なので NLC が例えば "Cloud" をどう解釈するのかは、このビュー内の "Cloud" カテゴリに属している文章の本文の内容と量、そして質にかかってきます。他の用語についても同様です。


ノーツは社内システムで使われることが多いため、社内業務の情報がまとまっているものです。場合によってはいわゆる「社内用語」の情報もカテゴライズされてまとまっていることもあると思います。そういった社内業務や社内用語を Watson NLC に覚えさせる、ということをイメージしてます。



この学習の際に IBM Bluemix のアカウントが必要です。上記の手順で確認した Watson NLC の接続情報としての username と password を、ノーツデータベース内の CatConfigView ビュー内にあるプロファイル文書に設定する必要があります。この辺りの手順は同DB内の「アプリケーションの使い方」を参照ください。
2016061203


Watson NLC の接続情報が設定できれば、CatView 内の文書をカテゴリごとに学習する準備が整ったことになります。同ビュー内の文書やカテゴリを編集してからでもいいのですが、変更しなくても学習は可能です。
なお、同ビューの内容やカテゴリを変更したり新しい文書を作成する場合は、必ずカテゴリを入力してから保存(編集モードで ESC キー)してしてください。カテゴリが入力されていない状態で保存すると、Watson への問い合わせが実行されるようにサンプルを作っているためです:
2016061204


Watson NLC への学習はノーツの「アクション」メニューから行います。まずは念のため学習状態をリセットしておきましょう。同データベースを開いている状態でメニューから アクション - LearningClear を実行して Watson NLC をリセットします:
2016061201


では実際に CatView の内容をそっくりそのまま Watson NLC に学習させてみます。メニューから アクション - LearningUpdate を実行します。これで CatView の全カテゴリの内容を、そこに属している文書の内容を使って学習します:
2016061202


Watson NLC の学習には少し時間がかかります(環境や状況にもよりますが30分弱)。学習状態を確認する方法を紹介します。まずメニューから ツール - Java デバッグコンソールの表示 を選んで、Java コンソールを表示します:
2016061203


Java コンソールはこのように表示されます。画面内をクリアにするには "Clear" を、コンソールを非表示にするには "Close" をクリックします:
2016061206


Java コンソールが表示されている状態でメニューから アクション - LearningStatus を実行します:
2016061205


すると Watson NLC に学習させた内容が現在どのようなステータスか(まだ学習途中なのか、既に学習済みで問い合わせ可能な状態になっているのか)を知ることができます。色々表示されますが、下図のように status = Available という表示になっていれば学習は完了し、問い合わせができるようになっていることを示しています(学習中の場合は status = Training と表示されます):
2016061204


学習が完了したことが確認できたら、今度は問い合わせを行います。学習に使っていない新しい文書を作った時に、その文書がどのカテゴリに属するのがふさわしいのかを人間が判断して入力するのではなく、学習した Watson NLC に問い合わせて(自動的に)判断させた上で保存する、という機能も実装しています。要は本文だけを入力すれば自動的に(既存データを使って学習した内容を元に)カテゴリを判断して決めてくれる、ということが可能になります。社内データを元に学習させているので、そのカテゴリが社内用語のように一般的には知られていないような用語であっても自動分類が可能です。


試しにこのような文書を CatView 内に新規に作成してみます。本文には「RedHat だけじゃなく、Ubuntu も勉強しないとね」という内容を入れ、カテゴリをわざと空にしています。この状態で ESC キーを押して保存すると、学習済みの Watson NLC に対して問い合わせが行われて、既に学習されている7つのカテゴリのどこに属するのがふさわしいのかを自動で判断させてみます:
2016061201


実際に保存すると(問い合わせをしているので少し時間がかかりますが)、文書が保存されます。(ビューが更新されてないので)おそらく一番下に(カテゴリ無し)として保存されていますが、実際の文書を確認すると "Linux" カテゴリに属していることが分かります。つまりこの内容は "Linux" の文書だと判断された、ということです。本文の中には一言も "Linux" という単語は含まれていなかったのですが、これまでに学習した内容から「これは Linux の文書だ」と判断された、ということを意味しています(なおビューを更新すると、この文書は Linux カテゴリの最後尾に移動するはずです):
2016061202


またこの時に Java コンソールを開いていると、実際に問い合わせしている様子を確認することができます。コンソールの最後の部分を見ると、この内容では 93.5% の確率で Linux だ、と判断されていたことが分かります。以下2位が約 1.7% で XML 、約 1.3 % で Web、といった感じで分類されていたことがわかります:
2016061203


これが Watson NLC の問い合わせ結果です。Watson NLC はあくまで与えられたテキストを学習済みのエンジンに対して問い合わせし、その結果を数値根拠と併せて返す、という機能だけを持っています。なのでその結果の1位だけを採用するのか、2位までを採用するのか、数値結果が特定の閾値を越えたもの全て採用するのか、・・・といった実際のアプリケーション挙動に関しては、開発者側で決めて実装することができるというものです。


以上がサンプル NSF ファイルの使い方の紹介でした。まずは Watson を体験する意味でもノーツユーザー様には一度使ってみていただきたいです。そして僕からもう2点お願いがあります。

まず1点目、今回提供したサンプル NSF ファイルはそのまま使っていただいても動くものを用意しています。ただし一般的に利用できるようにするため、分類の用語も "Cloud" や "Java" など一般的な IT 用語を使っています。でも上述のように Watson NLC が本当に威力を発揮するのは一般用語を学習させた場合ではなく、社内業務や社内用語を学習させて、社内システムのサポートができるようになった場合だと思っています。ある程度のデータの量がないと精度も上がらないのですが、サンプル NSF 内の文書やカテゴリを書き換えて(作り変えて)、独自のデータ文書の集まりにした場合でもこのサンプルは(その独自データを学習して動くように)作ってあるので、是非データをカスタマイズして動かしてみてほしいです。

次に、一応このサンプル NSF ファイルだけで学習から問い合わせまでの、Watson NLC の一通りの機能を体験することができるものになっています。でも Watson の本当の魅力とは、使い続けてデータを増やして、更に再学習させて、更に賢くして、また使ってデータを増やして、・・というサイクルにあると思っています。現役で使い続けているようなデータベースはもちろんですが、あまり使わなくなってしまったような業務データベースを、Watson の力で再活性化するような、そんな仕組みの一環としてこのサンプルが役立つことができたら本当に嬉しいです。



業務に関係して、ちょっとした画像アップローダーが欲しくなったので、IBM Bluemix でも動くようなものを作って一般化したものを公開します:
https://github.com/dotnsf/ImgUploader


PHP + MySQL + HTTP サーバー環境で動きます。Bluemix であれば PHP ランタイムClearDB試験提供の MySQL サービスを組み合わせた環境を想定しています:
2016061000


中身は非常にシンプルで、画像をアップロードして一覧で表示したり、プレビューしたり、というものです。画像データは BLOB 型にして MySQL 内に格納しているので、MySQL のバックアップを取ると画像データがバックアップされます。ここにアップロードした画像は URL でアクセスできるようになります。

アップロードに際しては PHP 設定の制約などを受けます。Bluemix 環境であれば最大 2MB です。PHP の設定を変更するなどしてください。必要に応じて認証を付けて運用してください。

その他、シンプルなので普通に使えると思っていますが、詳しくは GitHub の README を参照ください。


IBM Bluemix を使って DR(Disaster Recovery) 対応のシステムを作る場合、特にデータの保護を意識すると複数の異なるリージョンにデータベースを作り、それらが互いに複製されるような仕組みを用意しておくことになります。その仕組みを Cloudant で実現する場合の設定手順を紹介します。

まず、今回紹介する複製環境は US-SOUTH データセンターと GB-LONDON データセンター間での複製を作るものとします(異なる2点間でも、3点間の場合でも設定の考え方は同様です)。

まずは複製を行うそれぞれのデータセンター(この場合は US-SOUTHGB-LONDON)に Cloudant のサービスインスタンスをそれぞれ作成します(このエントリでは区別しやすくするため US-SOUTH 側を赤GB-LONDON 側を青で記載します):

(US-SOUTH の Cloudant)
2016060201


(GB-LONDON の Cloudant)
2016060202


また、それぞれのデータセンター上の Cloudant の「サービス資格情報」を確認しておきます。特に credentials 内の username, password, url の値は後で使うことになるのでメモするなどしておきます:
2016060208


ここでは以下のような値が設定されていたと仮定して以下の説明を進めていきます。必要に応じて実際の値に読み替えて設定してください:
(US-SOUTH 側)
username: (US_USERNAME)
password: (US_PASSWORD)
url: https://(US_USERNAME):(US_PASSWORD)@(US_HOSTNAME)

(GB-LONDON 側)
username: (GB_USERNAME)
password: (GB_PASSWORD)
url: https://(GB_USERNAME):(GB_PASSWORD)@(GB_HOSTNAME)

次にそれぞれのデータセンター上の Cloudant に複製の対象となるデータベースを作ります。まずはUS-SOUTH 側に作ります。US-SOUTH 側の Cloudant 画面を開き、"LAUNCH" ボタンをクリックします:
2016060203


管理画面が開いたら "Databases" を選択して現在作成されているデータベースの一覧を確認します。そして "Create Database" をクリックして、新たにデータベースを作成します:
2016060204


US-SOUTH 側では mydb_us という名前でデータベースを作成することにします。この名称を入力し、"Create" ボタンをクリック:
2016060205


改めてデータベース一覧を確認し、mydb_us データベースが作成されていることを確認します:
2016060206


同様にして GB-LONDON データセンター側にも mydb_gb という名前のデータベースを作成します(必要であれば3つ目のデータベースも作っておきます)。ではこれからこれらのデータセンターの異なるデータベースが複製されるよう設定を加えていきます:
2016060207


まずは US-SOUTH 側の mydb_us に複製の設定を行います。US-SOUTH 側の Cloudant ダッシュボードのデータベース一覧から mydb_us を選択し、Permission をクリックします。すると現在のパーミッションの設定(作ったばかりなので自分以外のユーザーへのパーミッションが設定されていない状態の設定)が確認できます:
2016060201


この US-SOUTH 側のデータベースに GB-LONDON のユーザーが複製できるようにパーミッションを追加します。具体的な方法としては API KEY を使う方法もありますが、ここでは直接 username を指定してパーミッションの指定を行うことにします。"Grant database permissions to: " と書かれた箇所に GB-LONDON 側の username の値(上記例だと (GB-USERNAME))を指定し、"Grant Permissions" ボタンをクリックします:
2016060202


今追加したユーザーの行がパーミッションとして追加されたはずです。デフォルト状態では _reader 列にだけチェックが付いている状態だと思いますが、複製の権限を与えたいので _replicator 列にもチェックを追加します。これで US-SOUTH のデータベース: mydb_us に対して GB-LONDON のユーザーが複製する権限を持つことが設定できました:
2016060203


同様にして、今度は逆に GB-LONDON のデータベース: mydb_gb に対して US-SOUTH のユーザーが複製する権限を持てるよう設定します。mydb_gb の Permission 設定画面にて (US-USERNAME) ユーザーをリストに追加し、同様にして _replicator 権限を与えてあげます:
2016060204


なお、3箇所のデータセンターで複製を取る場合はそれぞれのデータベースに他の2つのデータベースからのユーザーが複製できるように、それぞれ2つのユーザーを登録して _replicator 権限を与えるようにします。

これで権限の設定は完了しました。次はいよいよ互いのデータベースを複製対象として登録する作業を行います。


ここは最初に US-SOUTH 側の複製設定を追加することにします。US-SOUTH 側の Cloudant ダッシュボードを開き、"Replication" メニューを選択します(最初から "New Replication" が選択された状態になっているはずですが、もし選択されていなかったら "New Replication" をクリックします):
2016060201


US-SOUTH 側の New Replication 画面の各フィールドを以下のように埋めていきます:
 _id: "from_gb"(任意の文字列)
 Source Database: (後述)
 Target Database: "Existing Database" - "My Database" を選び、テキスト欄に "mydb_us" を指定

なお、Source Database ですが、"Remote Database" を選んでテキスト欄に GB-LONDON 側のサービス資格情報に書かれていた url の値に "/mydb_gb" を足したもの(具体的には "https://(GB_USERNAME):(GB_PASSWORD)@(GB_HOSTNAME)/mydb_gb")を指定します。そして "Mark this replication continuous" にチェックを入れて、最後に "Replica Data" をクリックします:
2016060202


複製設定を追加するにはパスワードの入力が求められます。US-SOUTH 側のサービス資格情報に書かれていた password の値(上記例だと US_PASSWORD)を指定して "Continue Replication" ボタンをクリックします:
2016060203


すると入力した内容で Replication 設定文書が作成され、画面に表示されます。これで GB-LONDON から US-SOUTH への複製の設定が完了しました:
2016060204


同様にして逆方向の複製設定を行います。今度は GB-LONDON 側の Cloudant ダッシュボードを開き、"Replication" メニューから新規複製設定文書を作成します。_id には "from_us" 、Source Database は "Remote Database" の US-SOUTH 側のサービス資格情報に書かれていた url の値に "/mydb_us" を足したもの(具体的には "https://(US_USERNAME):(US_PASSWORD)@(US_HOSTNAME)/mydb_us")を指定します。Target Database 欄は "Existing Database" - "My Databases" の "mydb_gb" を、そして "Mark this replication continuous" にチェックを入れて、最後に "Replica Data" をクリックし、GB-LONDON 側のパスワードを入力します:
2016060205


すると GB-LONDON 側にも Replication 文書が作成され、US-SOUTH から GB-LONDON への複製の設定も完了しました。これで双方向に複製が行えます:
2016060206


では最後に実際に片方のデータベースに作った文書がもう片方に複製されるかどうかを確認してみましょう。まず US-SOUTH 側 Cloudant ダッシュボードを開き、mydb_us データベースに文書が格納されていない(# of Docs が 0 件になっている)ことを確認します:
2016060301


次に GB-LONDON 側の Cloudant ダッシュボードを開き、mydb_gb データベースにも文書が格納されていないことを確認した上で、このデータベースを選択して開きます:
2016060302


mydb_gb の All Documents の横にある + 印を選択し、"New Doc" を選んで新しい文書を追加します:
2016060303


新しい文書の中身を JSON フォーマットで適当に編集します。下の例では "name1" 変数の値を"value1"、"name2" 変数の値を 12345 になるよう追加しました("_id" は消さないでください)。編集が済んだら "Create Document" をクリックして、この文書を保存します:
2016060304


これで GB-LONDON 側の mydb_gb データベースには文書が1つ追加されたことになります。mydb_gb の画面からも文書が追加されたことが確認できます。
2016060305


ではこの追加された文書が US-SOUTH 側の mydb_us データベースに複製されていることを確認しましょう。US-SOUTH 側のダッシュボードから mydb_us データベースを選択すると、(複製の設定が正しく行われていれば)直前までは文書は存在していなかったはずなのに1つの文書が追加されていることを確認できるはずです:
2016060306


画面右上の鉛筆マークをクリックすると実際のデータを確認できます。この文書のデータに GB-LONDON 側で作成した時の変数と値が正しく格納されていること(つまりこのデータは GB-LONDON からやってきたこと)が確認できるはずです:
2016060307


同様にして逆方向のデータ複製もできるはずです。これで大西洋をまたいだ Cloudant のデータベース複製が実現できました。


このページのトップヘ