(注 ノーツ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つです:
NLC はその名が示す通り「自然言語(Natural Language)分類(Classify)」の API です。自然言語のテキスト文書を与えると、あらかじめ学習させた内容に基いたカテゴリに分類し、その結果を確信度合いの数値と共にアウトプットする、というものです。もちろん日本語に対応しています。この API の資料や価格情報などは以下を参照ください:
https://console.ng.bluemix.net/catalog/services/natural-language-classifier/
実際にノーツのサンプルデータベースを使うには NLC の接続情報(インスタンスに接続するためのユーザー名とパスワード)が必要になります。ノーツクライアントで「アプリケーションの使い方」を開いて、NLC のインスタンスを作成し、その作成したインスタンスに接続するための username と password を確認してください:
一方、ノーツのデータベース、特に「カテゴリビュー」と呼ばれる見出しで分類された一覧を持つデータベースはノーツで多く使われています。上記のサンプル NSF の CatView ビューでは IT 関連の日本語テキスト文書が約 700 件登録されており、それぞれの内容が7つのカテゴリに分類されて表示されているはずです:
※ちなみにこのデータベースの中身は IBM developerWorks の技術カテゴリと文書をインポートして使っています
今回はこのカテゴリビューの内容をそのまま NLC に学習させます。例えば "Cloud" のカテゴリに分類されている約100件の文書の本文を使って "Cloud" というものを教えます。同様に "Java" カテゴリの文書を使って "Java" を教え、"Linux" カテゴリの文書を使って "Linux" を教え、・・・ といった具合です。
ここで重要なことは「一般論を教えるのではなく、あくまでこのデータベース内の(カテゴリビューの)情報だけを元に各用語を学習させる」ということです。なので NLC が例えば "Cloud" をどう解釈するのかは、このビュー内の "Cloud" カテゴリに属している文章の本文の内容と量、そして質にかかってきます。他の用語についても同様です。
ノーツは社内システムで使われることが多いため、社内業務の情報がまとまっているものです。場合によってはいわゆる「社内用語」の情報もカテゴライズされてまとまっていることもあると思います。そういった社内業務や社内用語を Watson NLC に覚えさせる、ということをイメージしてます。
この学習の際に IBM Bluemix のアカウントが必要です。上記の手順で確認した Watson NLC の接続情報としての username と password を、ノーツデータベース内の CatConfigView ビュー内にあるプロファイル文書に設定する必要があります。この辺りの手順は同DB内の「アプリケーションの使い方」を参照ください。
Watson NLC の接続情報が設定できれば、CatView 内の文書をカテゴリごとに学習する準備が整ったことになります。同ビュー内の文書やカテゴリを編集してからでもいいのですが、変更しなくても学習は可能です。
なお、同ビューの内容やカテゴリを変更したり新しい文書を作成する場合は、必ずカテゴリを入力してから保存(編集モードで ESC キー)してしてください。カテゴリが入力されていない状態で保存すると、Watson への問い合わせが実行されるようにサンプルを作っているためです:
Watson NLC への学習はノーツの「アクション」メニューから行います。まずは念のため学習状態をリセットしておきましょう。同データベースを開いている状態でメニューから アクション - LearningClear を実行して Watson NLC をリセットします:
では実際に CatView の内容をそっくりそのまま Watson NLC に学習させてみます。メニューから アクション - LearningUpdate を実行します。これで CatView の全カテゴリの内容を、そこに属している文書の内容を使って学習します:
Watson NLC の学習には少し時間がかかります(環境や状況にもよりますが30分弱)。学習状態を確認する方法を紹介します。まずメニューから ツール - Java デバッグコンソールの表示 を選んで、Java コンソールを表示します:
Java コンソールはこのように表示されます。画面内をクリアにするには "Clear" を、コンソールを非表示にするには "Close" をクリックします:
Java コンソールが表示されている状態でメニューから アクション - LearningStatus を実行します:
すると Watson NLC に学習させた内容が現在どのようなステータスか(まだ学習途中なのか、既に学習済みで問い合わせ可能な状態になっているのか)を知ることができます。色々表示されますが、下図のように status = Available という表示になっていれば学習は完了し、問い合わせができるようになっていることを示しています(学習中の場合は status = Training と表示されます):
学習が完了したことが確認できたら、今度は問い合わせを行います。学習に使っていない新しい文書を作った時に、その文書がどのカテゴリに属するのがふさわしいのかを人間が判断して入力するのではなく、学習した Watson NLC に問い合わせて(自動的に)判断させた上で保存する、という機能も実装しています。要は本文だけを入力すれば自動的に(既存データを使って学習した内容を元に)カテゴリを判断して決めてくれる、ということが可能になります。社内データを元に学習させているので、そのカテゴリが社内用語のように一般的には知られていないような用語であっても自動分類が可能です。
試しにこのような文書を CatView 内に新規に作成してみます。本文には「RedHat だけじゃなく、Ubuntu も勉強しないとね」という内容を入れ、カテゴリをわざと空にしています。この状態で ESC キーを押して保存すると、学習済みの Watson NLC に対して問い合わせが行われて、既に学習されている7つのカテゴリのどこに属するのがふさわしいのかを自動で判断させてみます:
実際に保存すると(問い合わせをしているので少し時間がかかりますが)、文書が保存されます。(ビューが更新されてないので)おそらく一番下に(カテゴリ無し)として保存されていますが、実際の文書を確認すると "Linux" カテゴリに属していることが分かります。つまりこの内容は "Linux" の文書だと判断された、ということです。本文の中には一言も "Linux" という単語は含まれていなかったのですが、これまでに学習した内容から「これは Linux の文書だ」と判断された、ということを意味しています(なおビューを更新すると、この文書は Linux カテゴリの最後尾に移動するはずです):
またこの時に Java コンソールを開いていると、実際に問い合わせしている様子を確認することができます。コンソールの最後の部分を見ると、この内容では 93.5% の確率で Linux だ、と判断されていたことが分かります。以下2位が約 1.7% で XML 、約 1.3 % で Web、といった感じで分類されていたことがわかります:
これが Watson NLC の問い合わせ結果です。Watson NLC はあくまで与えられたテキストを学習済みのエンジンに対して問い合わせし、その結果を数値根拠と併せて返す、という機能だけを持っています。なのでその結果の1位だけを採用するのか、2位までを採用するのか、数値結果が特定の閾値を越えたもの全て採用するのか、・・・といった実際のアプリケーション挙動に関しては、開発者側で決めて実装することができるというものです。
以上がサンプル NSF ファイルの使い方の紹介でした。まずは Watson を体験する意味でもノーツユーザー様には一度使ってみていただきたいです。そして僕からもう2点お願いがあります。
まず1点目、今回提供したサンプル NSF ファイルはそのまま使っていただいても動くものを用意しています。ただし一般的に利用できるようにするため、分類の用語も "Cloud" や "Java" など一般的な IT 用語を使っています。でも上述のように Watson NLC が本当に威力を発揮するのは一般用語を学習させた場合ではなく、社内業務や社内用語を学習させて、社内システムのサポートができるようになった場合だと思っています。ある程度のデータの量がないと精度も上がらないのですが、サンプル NSF 内の文書やカテゴリを書き換えて(作り変えて)、独自のデータ文書の集まりにした場合でもこのサンプルは(その独自データを学習して動くように)作ってあるので、是非データをカスタマイズして動かしてみてほしいです。
次に、一応このサンプル NSF ファイルだけで学習から問い合わせまでの、Watson NLC の一通りの機能を体験することができるものになっています。でも Watson の本当の魅力とは、使い続けてデータを増やして、更に再学習させて、更に賢くして、また使ってデータを増やして、・・というサイクルにあると思っています。現役で使い続けているようなデータベースはもちろんですが、あまり使わなくなってしまったような業務データベースを、Watson の力で再活性化するような、そんな仕組みの一環としてこのサンプルが役立つことができたら本当に嬉しいです。
(
新しい記事はこちらです 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つです:
NLC はその名が示す通り「自然言語(Natural Language)分類(Classify)」の API です。自然言語のテキスト文書を与えると、あらかじめ学習させた内容に基いたカテゴリに分類し、その結果を確信度合いの数値と共にアウトプットする、というものです。もちろん日本語に対応しています。この API の資料や価格情報などは以下を参照ください:
https://console.ng.bluemix.net/catalog/services/natural-language-classifier/
実際にノーツのサンプルデータベースを使うには NLC の接続情報(インスタンスに接続するためのユーザー名とパスワード)が必要になります。ノーツクライアントで「アプリケーションの使い方」を開いて、NLC のインスタンスを作成し、その作成したインスタンスに接続するための username と password を確認してください:
一方、ノーツのデータベース、特に「カテゴリビュー」と呼ばれる見出しで分類された一覧を持つデータベースはノーツで多く使われています。上記のサンプル NSF の CatView ビューでは IT 関連の日本語テキスト文書が約 700 件登録されており、それぞれの内容が7つのカテゴリに分類されて表示されているはずです:
※ちなみにこのデータベースの中身は IBM developerWorks の技術カテゴリと文書をインポートして使っています
今回はこのカテゴリビューの内容をそのまま NLC に学習させます。例えば "Cloud" のカテゴリに分類されている約100件の文書の本文を使って "Cloud" というものを教えます。同様に "Java" カテゴリの文書を使って "Java" を教え、"Linux" カテゴリの文書を使って "Linux" を教え、・・・ といった具合です。
ここで重要なことは「一般論を教えるのではなく、あくまでこのデータベース内の(カテゴリビューの)情報だけを元に各用語を学習させる」ということです。なので NLC が例えば "Cloud" をどう解釈するのかは、このビュー内の "Cloud" カテゴリに属している文章の本文の内容と量、そして質にかかってきます。他の用語についても同様です。
ノーツは社内システムで使われることが多いため、社内業務の情報がまとまっているものです。場合によってはいわゆる「社内用語」の情報もカテゴライズされてまとまっていることもあると思います。そういった社内業務や社内用語を Watson NLC に覚えさせる、ということをイメージしてます。
この学習の際に IBM Bluemix のアカウントが必要です。上記の手順で確認した Watson NLC の接続情報としての username と password を、ノーツデータベース内の CatConfigView ビュー内にあるプロファイル文書に設定する必要があります。この辺りの手順は同DB内の「アプリケーションの使い方」を参照ください。
Watson NLC の接続情報が設定できれば、CatView 内の文書をカテゴリごとに学習する準備が整ったことになります。同ビュー内の文書やカテゴリを編集してからでもいいのですが、変更しなくても学習は可能です。
なお、同ビューの内容やカテゴリを変更したり新しい文書を作成する場合は、必ずカテゴリを入力してから保存(編集モードで ESC キー)してしてください。カテゴリが入力されていない状態で保存すると、Watson への問い合わせが実行されるようにサンプルを作っているためです:
Watson NLC への学習はノーツの「アクション」メニューから行います。まずは念のため学習状態をリセットしておきましょう。同データベースを開いている状態でメニューから アクション - LearningClear を実行して Watson NLC をリセットします:
では実際に CatView の内容をそっくりそのまま Watson NLC に学習させてみます。メニューから アクション - LearningUpdate を実行します。これで CatView の全カテゴリの内容を、そこに属している文書の内容を使って学習します:
Watson NLC の学習には少し時間がかかります(環境や状況にもよりますが30分弱)。学習状態を確認する方法を紹介します。まずメニューから ツール - Java デバッグコンソールの表示 を選んで、Java コンソールを表示します:
Java コンソールはこのように表示されます。画面内をクリアにするには "Clear" を、コンソールを非表示にするには "Close" をクリックします:
Java コンソールが表示されている状態でメニューから アクション - LearningStatus を実行します:
すると Watson NLC に学習させた内容が現在どのようなステータスか(まだ学習途中なのか、既に学習済みで問い合わせ可能な状態になっているのか)を知ることができます。色々表示されますが、下図のように status = Available という表示になっていれば学習は完了し、問い合わせができるようになっていることを示しています(学習中の場合は status = Training と表示されます):
学習が完了したことが確認できたら、今度は問い合わせを行います。学習に使っていない新しい文書を作った時に、その文書がどのカテゴリに属するのがふさわしいのかを人間が判断して入力するのではなく、学習した Watson NLC に問い合わせて(自動的に)判断させた上で保存する、という機能も実装しています。要は本文だけを入力すれば自動的に(既存データを使って学習した内容を元に)カテゴリを判断して決めてくれる、ということが可能になります。社内データを元に学習させているので、そのカテゴリが社内用語のように一般的には知られていないような用語であっても自動分類が可能です。
試しにこのような文書を CatView 内に新規に作成してみます。本文には「RedHat だけじゃなく、Ubuntu も勉強しないとね」という内容を入れ、カテゴリをわざと空にしています。この状態で ESC キーを押して保存すると、学習済みの Watson NLC に対して問い合わせが行われて、既に学習されている7つのカテゴリのどこに属するのがふさわしいのかを自動で判断させてみます:
実際に保存すると(問い合わせをしているので少し時間がかかりますが)、文書が保存されます。(ビューが更新されてないので)おそらく一番下に(カテゴリ無し)として保存されていますが、実際の文書を確認すると "Linux" カテゴリに属していることが分かります。つまりこの内容は "Linux" の文書だと判断された、ということです。本文の中には一言も "Linux" という単語は含まれていなかったのですが、これまでに学習した内容から「これは Linux の文書だ」と判断された、ということを意味しています(なおビューを更新すると、この文書は Linux カテゴリの最後尾に移動するはずです):
またこの時に Java コンソールを開いていると、実際に問い合わせしている様子を確認することができます。コンソールの最後の部分を見ると、この内容では 93.5% の確率で Linux だ、と判断されていたことが分かります。以下2位が約 1.7% で XML 、約 1.3 % で Web、といった感じで分類されていたことがわかります:
これが Watson NLC の問い合わせ結果です。Watson NLC はあくまで与えられたテキストを学習済みのエンジンに対して問い合わせし、その結果を数値根拠と併せて返す、という機能だけを持っています。なのでその結果の1位だけを採用するのか、2位までを採用するのか、数値結果が特定の閾値を越えたもの全て採用するのか、・・・といった実際のアプリケーション挙動に関しては、開発者側で決めて実装することができるというものです。
以上がサンプル NSF ファイルの使い方の紹介でした。まずは Watson を体験する意味でもノーツユーザー様には一度使ってみていただきたいです。そして僕からもう2点お願いがあります。
まず1点目、今回提供したサンプル NSF ファイルはそのまま使っていただいても動くものを用意しています。ただし一般的に利用できるようにするため、分類の用語も "Cloud" や "Java" など一般的な IT 用語を使っています。でも上述のように Watson NLC が本当に威力を発揮するのは一般用語を学習させた場合ではなく、社内業務や社内用語を学習させて、社内システムのサポートができるようになった場合だと思っています。ある程度のデータの量がないと精度も上がらないのですが、サンプル NSF 内の文書やカテゴリを書き換えて(作り変えて)、独自のデータ文書の集まりにした場合でもこのサンプルは(その独自データを学習して動くように)作ってあるので、是非データをカスタマイズして動かしてみてほしいです。
次に、一応このサンプル NSF ファイルだけで学習から問い合わせまでの、Watson NLC の一通りの機能を体験することができるものになっています。でも Watson の本当の魅力とは、使い続けてデータを増やして、更に再学習させて、更に賢くして、また使ってデータを増やして、・・というサイクルにあると思っています。現役で使い続けているようなデータベースはもちろんですが、あまり使わなくなってしまったような業務データベースを、Watson の力で再活性化するような、そんな仕組みの一環としてこのサンプルが役立つことができたら本当に嬉しいです。
コメント
コメント一覧 (5)
たくさんある添付ファイルを学習させたいのですが、できませんか?
https://www.ibm.com/watson/developercloud/nl-classifier.html?cm_mc_uid=43432325322014672555951&cm_mc_sid_50200000=1473304846
https://poi.apache.org/
Notes Client上で日本語での検索を試みましたが、どうやら文字化けが発生します。
検索するときに、日本語を入力するとコンソールで文字化けが確認されます。
(JSONに格納するときに、発生します。)
また、日本語で書かれたクラスを返すときも文字化けされます。
(UTF8→SJIS)
例、cloudをクラウドと変えたときに?????と変換されます。
この問題について、何か解決できることはないでしょうか?
よろしくおねがいします。
まず、そもそも日本語のクラス名って Watson API でサポートされてたかな・・・ ちゃんと調べてないけど、少なくとも以前はできなかったはずでした。仮に Watson API でサポートされていたとしても、僕の作ったサンプルコードではここが日本語になる前提ではテストもしてないです。それが原因だったらごめんなさい。。
あと文字化けって REST API のレベルで(つまり curl とかで実行しても)発生する話でしょうか? ノーツと Java コンソール前提での話だとすると、(僕もコンソール上では文字化けしてますが)ノーツのサポートをできる立場ではないので、ノーツの調査はどうにもならないのです・・・ ただ REST API でも再現する話であれば Watson 側の問題か、或いは僕のサンプルコードに問題があるのかもしれないです(ただ僕自身は REST API で文字化けしたことはないです)。
Notesとは別にCygwin上でcurlで実装しましたが、全く文字化けすることなく、queryできました。
Notesの文字化け原因について調べてみたところ以下のことがわかりました。
・queryでtextをJSONに入れるときは
SJIS→ISO-8859-JPとエンコードされます。
・classを返すときは
UTF-8→SJISとエンコードされるようです。
それぞれ化け方が異なるようで、中々興味深い結果となりました。
コードを何回か修正してみましたが、やはりうまくいきませんでした。
(Watson側というよりかは、java環境は文字コードがOSに依存したり、Notes上で予め設定された文字コードがあるみたいで、複雑に要因が絡み合っています。)
あと、サンプルコードに書かれてるBase64も少し気になったのですが、何か関係あるでしょうか?
長々と失礼しました。今後の改良のためにご参考になればと思います。