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

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

タグ:nsf

この記事の最新版です:
ノーツでワトソンを体験!

上記記事は「IBM ノーツのデータベースコンテンツを IBM Watson の NLC(Natural Language Classifier)に学習させた上で問い合わせを行う」という内容でした。アクセスログを見る限り、そこそこの反響があったブログエントリでした。

が、ある時を境にして、この記事で提供していたサンプルが動かなくなってしまいました。直接の原因は別のブログエントリでも紹介した IBM Watson 側のセキュリティ仕様変更でした:
"javax.net.ssl.SSLException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 64" エラー


上記記事でも紹介していますが、この回避策の1つがプロクシー的なサービスを作る、というものでした。今回、そのプロクシーサービスを IBM Bluemix 上に作った上でサンプルを改良しました。
2016111101

新しいサンプルはこちらです。使い方は変わっていません:
http://dotnsf.blog.jp/nlcdemo.zip

参考程度に、以前のサンプルはこちらです(注 現在は正しく動きません)
http://dotnsf.blog.jp/nlcdemo.old.zip



新しい nlcdemo.nsf では、リクエストを全て http://watsonapiproxy.mybluemix.net/nlcproxy 経由で Watson に送信するようにしています。この方法で JDK 1.6 からの HTTPS リクエストをエラーなく実行できるようにしています。




自分はエンジニアのキャリアの中でエクセルではない某表計算ソフトの開発に携わる機会がありました。そんなわけで、どちらかというとアンチ・エクセル派だったりします:
2016082100


また一部の人には公にしていますが、その後ノーツ/ドミノのエンジニアも担当させていただく機会もありました。ノーツは大好きです、.NSF 万歳!


だからというわけではないのですが、そんなバックグラウンドを持つ自分がエクセルデータファイル(*.xls や *.xlsx)をノーツデータベース(*.nsf)化するツールを作ってみました。これで幸せになれる人がいたら使ってほしいです(笑)。

ちなみに OpenNTF.org を探してみると、この逆(ノーツをエクセル化)を実現するようなものは(自分が動かしてみたわけではありませんが)見つかります。が「エクセルをノーツ化」という変態的のはさすがになさそうだったので、技術的挑戦も兼ねて作ってみました。正直かなり手間取りましたが、当初考えていた最低限の挙動はできるようになったので、一旦公開して、紹介します。実体はノーツの NTF および NSF ですが、ACL は誰でも開いてみれるようになっているはずなので、興味ある人は中身を確認したり、もう少し便利に作りなおしたりしてみてください。

まず仕様のおさらいの意味で、どんなインプットに対して、どんなアウトプットができるようになるのか、という点を紹介します。用意する必要があるのはエクセルシートファイルです:
2016081901


このエクセルファイルには複数のシートが存在していることを想定します。そして各シート毎になんらかのデータが格納されているものとします。この例ではシートは3つあり、1枚目(Sheet1)にはこんな感じで、7行5列のデータが入ってます(ちなみに E 列の値は同じ行の C 列の値を2倍したものになるような計算結果として定義されています):
2016082001


一方、2枚目のシート(Sheet2)には10行3列のこんなデータが入っているものとします。シートごとに列数や行数が全く異なるデータが入っていることを想定しています:
2016082002


3枚目のシート(Sheet3)には変換対象範囲を理解する上で役立つシートにしました。シート内のセルが虫食い状態のようにところどころに空白のセルがあるものです。ちなみにこの例では5行3列(A1 セルから C5 セルまでの矩形部分)を変換対象にするような仕様にしています(E2 セルにデータは存在していますが、D 列に全くデータがないので対象外と判定する仕様です):
2016082003


このデータをノーツ化するにあたり、以下の様なルールで変換(というかインポート)します:
  • 1つのエクセルシートの内容を1つのビューとして変換する
  • なので、3つのシートを持つエクセルファイルは3つのビューをもつノーツデータベースに変換される
  • ノーツを使いつつ、見栄えはなるべく表計算っぽくする

実際の作業は以下のようになります。まず今回用意したノーツデータベース "XLS2NSF" (リンクは後述)をノーツクライアントから開きます:
2016081902


いわゆる「ポリシー文書」が開き、使い方などが確認できます。内容は確認いただくとして、すぐに試すには「エクセルファイル指定」と書かれたボタンをクリックします:
2016082101


ファイルダイアログが開くので、エクセルファイル(*.xls / *.xlsx)を指定します。ここでは上記で紹介した MyBook1.xls という3つのシートを持つファイルを指定しています:
2016081904


後は全自動でノーツDB化が実行されます。事実上エクセルファイルを指定するだけ、です。

全ての変換処理が完了すると、指定したファイル名と同じタイトルのノーツDB(ファイルパスはノーツデータディレクトリ直下、ファイル名はタイトルの最後に ".nsf" を加えたもの)がワークスペース上に追加されているはずです。これをクリックすると変換結果が参照できます:
2016081903


この作成されたデータベースをノーツで開いた様子がこちらです。元ファイルには3つのシートが存在していましたが、それぞれのシートがノーツのビューとしてナビゲータから切り替えて見ることができます。こちらは Sheet1 のもの。7行5列の表が中身も含めて再現されています。なお元ファイルでは E 列の中身は同じ行の C 列の2倍になるような計算式でしたが、変換後は固定値になっています:
2016082004


2つ目の Sheet2 に切り替えるとこのようになります。元のシート通り、10行3列の表ができているはずです:
2016082005


3つ目の Sheet3 はこちら。セルの虫食い状態も再現されています。また上記で紹介したように元のシートの A1 セルから C5 セルの部分が変換されているはずです:
2016082006



この変換後のノーツデータベース(のビュー)は ViewEdit モードを実装しているので、特定のセルをクリックすると、そのセルの値を書き換えることができます。以下の例では Sheet2 の C6 列(もともと "4" と入力されていた箇所)を編集して "123" にしている所です:
2016082007


Enter を押すと変更が確定して、元のビューに戻ります:
2016082008


と、まあこんな需要があるのかないのか分からないものを作ってみました。折角なので GitHub で公開しています:
https://github.com/dotnsf/xls2nsf

(注 .nsf や .ntf のノーツデータベースを Git で管理すべきではありません。良い子はマネしちゃだめ)


実際に試してみたい! という奇特な方は、上記 GitHub から "Clone or Download" - "Download ZIP" を選択してダウンロードし、展開して使ってください:
2016081902


また、このブログの中で紹介に使っているエクセルのサンプルファイル(MyBook1.xls)も併せて公開します。ぜひ手持ちのファイルで試していただきたいのですが、良さ気なのがない場合は使ってください:
http://dotnsf.blog.jp/MyBook1.xls


以下、2016/Aug/21 時点での制約です:
  • LotusScript で実装しています。エクセル読み取りは OLE を使っています。そのためノーツクライアントとエクセルがインストールされた Windows 環境でないと動かないと思います。
  • 変換の対象となる部分の計算方法が特殊です。現時点では各シートの A1 セルには必ず値が入っている必要があります。
  • また列は行、列ともに空セルしかない最初の行や列を探して、その内側を対象とみなしています。下の霊であれば、D列と 6 行目には空セルしかないので、その内側の A1 セルから C5 セルまでが対象です(E2 セルにデータがありますが、現在の仕様ではデータ変換の対象にはしません)。
2016082001


ノーツ化することで式による計算機能を失ってしまうわけですが(汗)、代わりに強力な ACL によるアクセス管理ができるようになります。この辺りは改善できればしたいなあ、と思っていますが、ノーツのビュー内の各エントリーの中身を式の結果にするというのは現時点では困難と思ってます。あと1行追加とか、1列追加とか、できそうで実装してない機能もありますが、その辺りは興味ある人に追加実装していただきたいです(手抜きともいう)。

ま、自分で作っておいてなんですが、「そこそこ動く MAD なツール」だと思いますw こういうのは我ながら嫌いじゃない。

(注 この記事の内容は作成当初の状況から変化があり、サンプルが正しく動かなくなっています
   新しい記事はこちらです 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 の力で再活性化するような、そんな仕組みの一環としてこのサンプルが役立つことができたら本当に嬉しいです。



このページのトップヘ