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

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

タグ:nlc

IBM Watson から提供されている AI 系 API の中で、自然言語テキストを分類する機能を持った NLC(Natural Language Classifier) の提供が終了することがアナウンスされました。2021年9月9日までは新規インスタンスの作成が可能ですが、それ以降の新規作成はできません。また既存インスタンスは2022年8月8日まで利用できますが、それまでに移行先を決め、その移行作業を済ませておく必要があります:
https://cloud.ibm.com/docs/natural-language-classifier?topic=natural-language-classifier-migrating


NLC は個人的にも IBM Watson を使い始めるきっかけになった API で、思い入れの深いサービスだったりします。NLC を使って作った多くのデモアプリは WordCamp Tokyo や特定のお客様向けに作ったものを含めて多くの場で紹介させていただきました。感慨深いものがあります。


上記アナウンス内で、公式な移行先として同じ IBM Watson の NLU(Natural Language Understandings) が紹介されています。が、具体的な移行手順や方法に関する情報が少ないこともあり、実際に自分が NLC API を使って開発したアプリケーションをどのように NLU に移行すればよいかがわかりにくいように感じました。 自分自身の場合は普段 Node.js を使ってアプリケーションを開発しているのですが、Node.js の場合は具体的にどのようにすれば NLC から NLU へ移行できるか? という調査をしてみました。実際に Node.js でプログラムを書き、具体的にはまず NLC API を使って、
 ・認証
 ・日本語データ学習
 ・学習状況確認
 ・問い合わせ(分類)
 ・学習の削除
といった5種類のオペレーションを行えるようなアプリケーションを作りました。 そしてそのアプリケーションを NLC から NLU へ実際に移植する、といった作業を行ってみました。結論として上記5種類のオペレーションは NLU でも NLC 同様に行うことができました。ただ API には互換性はなく、ソースコードレベルではそれなりに変更が必要になるため、どの程度の変更が必要になるのか、という調査の意味も含めて作業した様子を以下に紹介します。

なお、NLC は IBM Cloud の(無料版の)ライトアカウント向けには提供されていない API である点に注意してください。ライトアカウントの状態で NLC の新規インスタンスを作成することは(9月9日以前であっても)できません。ベーシック以上の(有償の)アカウントであれば無料枠含めて提供されている API です。 一方の NLU はライトアカウントでも利用することが可能ですが、ライトアカウントの場合はライトプラン(無料)の NLU を1インスタンスのみ作成でき、1インスタンスにつき1モデルだけ学習で作成できます(要は複数の学習モデルを作成するにはベーシック以上のアカウントで、有料プランを選択する必要があります)。
2021082200



【サンプルコードのダウンロード】
以下で紹介する一連の手順を行うための Node.js 用サンプルコードを作って公開しました:
https://github.com/dotnsf/nlc2nlu

git clone するかコードをダウンロード&展開してください。以下の3つのフォルダが含まれています:
|- csvtool
|- nlc
|- nlu

csvtool は実際に NLC や NLU で使うサンプルの学習データを作成するツールです。NLC や NLU を既に使っていて、どのような学習データを用意すればよいかわかっている場合は、ご自身で学習データ(CSV ファイル)を用意いただいてもかまいませんが、そうでない人向けに Yahoo! ニュースの RSS(https://news.yahoo.co.jp/rss) を使って、その場で学習データを作成できるようにしたものです。

nlc と nlu は名前の通りで、学習データを学習させて、学習状況を確認しながら学習が完了したら、実際に適当な日本語テキストを送信して、学習データに基づくテキスト分類を実施します。また実施後に学習データを削除する、といった操作も可能です。これらの内容を NLC および NLU それぞれで行えるようにしたツールが含まれています。

ではそれぞれのフォルダの使い方を説明します。


【csvtool : 学習データの用意】
csvtool/csvgenerator.jsYahoo! ニュース RSS から学習データとしての CSV ファイルを作成します。NLC / NLU とも学習データは以下のフォーマットの CSV ファイルを用意します※:
テキスト,このテキストが属するカテゴリー
テキスト,このテキストが属するカテゴリー
テキスト,このテキストが属するカテゴリー
  :

※ NLU は JSON フォーマットでも学習データを準備して読み込むことが可能ですが、NLC からの移植を考えると NLC と同じ条件で学習データを用意するべきと考え、同じ CSV ファイルを学習データとして使うことにします。

このような(NLC 向けの)学習データを既にお持ちであればそれを使って後述の作業を続けていただいてもかまいませんが、多くの人はそのような学習データを持っていないと思うので、新たに用意することにします。その場合は csvtool/csvgenerator.js を使います。

実行方法は単純で、csvtool フォルダに移動し、まず普通に $ npm install を実行して依存ライブラリを導入します:
$ cd csvtool

$ npm install

その後、node コマンドでこのファイルを実行します。実行コマンドの最後に出力先 CSV ファイル名を指定します(以下の例だと同一フォルダ内の csvfile.csv):
$ node csvgenerator csvfile.csv

実行したタイミングで Yahoo! ニュースの RSS を参照して、その時点のニュースを取得して CSV ファイルに書き出します。なお、このツールでは「経済」、「IT」、「エンタメ」、「科学」、「スポーツ」の5つのカテゴリーのニュースを収集します。 ツールの実行が完了すると、指定した CSV ファイルが以下のような内容で生成されます:
RSS から取り出したニュース内容,このニュースのカテゴリー
RSS から取り出したニュース内容,このニュースのカテゴリー
RSS から取り出したニュース内容,このニュースのカテゴリー
   :

ここまでできれば学習データの準備は完了です。ではこのデータを NLC と NLU それぞれで学習させて問い合わせる、という作業をこれ以降で行っていきましょう。


【nlc : NLC で操作】
まずは NLC API を使って開発したアプリでこのデータを学習させ、NLC API を使って問い合わせを行ってみましょう。先ほどダウンロードしたソースコードの nlc フォルダ内にある nlc/nlc.js ファイルを使って操作します(このコードの内容については後述します)。まずは csvgenerator.js の時と同様に  $ npm install を実行して依存ライブラリを導入します:
$ cd nlc

$ npm install

その後、node コマンドでこのファイルを実行します。この nlc.js はコマンドラインアプリケーションで、その実行時パラメータによって「データ学習」、「学習状況確認」、「問い合わせ(分類)」、「学習データ削除」の4つを行うことができます:
$ node nlc create [csvfilename]  ・・・データ学習

$ node nlc status  ・・・学習状況確認

$ node nlc classify [日本語テキスト] [classifier_id]  ・・・問い合わせ(分類)

$ node nlc delete [classifier_id]  ・・・学習データ削除

では実際に nlc ツールを使いながら操作を確認してみましょう。まずは IBM Cloud にウェブブラウザでログインして、NLC インスタンスを作成し、「サービス資格情報」(を必要であれば作成して)の内容を確認します:
2021082201


この中に apikey 属性値と url 属性値が含まれているので、それらの値を nlc/settings.js ファイル内の exports.nlc_apiKey 値および exports.nlc_url 値にそれぞれコピーして保存します:
exports.nlc_apiKey = 'サービス資格情報内の apikey 属性値';
exports.nlc_url = 'サービス資格情報内の url 属性値';
exports.nlc_name = 'nlc2nlu';
exports.nlc_language = 'ja';

これで実行前の準備は完了しました。早速「データ学習」を実行してみます。「データ学習」は(前述の作業で用意した)学習データ CSV ファイルを指定して、$ node nlc create [csvfilename] を実行します。先ほどの手順で ../csvtool/csvfile.csv というファイルが作られている場合は以下のように指定して実行します:
$ node nlc create ../csvtool/csvfile.csv

これで指定した CSV ファイルを元にする学習が開始されます。この学習が完了すると問い合わせ(分類)ができるようになりますが、完了しているかどうかを確認するには以下のコマンドを実行します:
$ node nlc status

実行結果は以下のような JSON が表示されますが、この中の status 欄が "available" となっていれば学習は完了しています(データ量にもよりますが、自分が試した時はこうなるまでおよそ 10 分程度かかりました)。同時に表示されている classifier_id の値はこの後で使うので合わせてメモしておきましょう:
{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "content-type": "application/json",
    "x-xss-protection": "1",
    "content-security-policy": "default-src 'none'",
    "x-content-type-options": "nosniff",
    "cache-control": "no-cache, no-store",
    "pragma": "no-cache",
    "expires": "0",
    "content-length": "428",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-dp-watson-tran-id": "e6168d25-5640-4790-a1f1-02ff089dd869",
    "x-request-id": "e6168d25-5640-4790-a1f1-02ff089dd869",
    "x-global-transaction-id": "e6168d25-5640-4790-a1f1-02ff089dd869",
    "server": "watson-gateway",
    "x-edgeconnect-midmile-rtt": "7",
    "x-edgeconnect-origin-mex-latency": "22",
    "date": "Tue, 24 Aug 2021 05:48:32 GMT",
    "connection": "close"
  },
  "result": {
    "classifier_id": "e87efex297-nlc-650",
    "name": "nlc2nlu",
    "language": "ja",
    "created": "2021-08-24T05:45:20.090Z",
    "url": "https://api.jp-tok.natural-language-classifier.watson.cloud.ibm.com/instances/f738a110-248b-419c-b771-8e6cbd45ee93/v1/classifiers/e87efex297-nlc-650",
    "status_description": "The classifier instance is now available and is ready to take classifier requests.",
    "status": "Available"
  }
}


学習が完了したら改めて日本語テキストを指定して、その内容がどのカテゴリーに属しているのかを分類してみましょう。日本語テキストと上述で確認した classifier_id 値を指定して、以下のようなコマンドを実行します:
$ node nlc classify [日本語テキスト] [classifier_id]

すると以下のような結果が表示されます。指定した日本語テキスト(「パッキャオがんばれ」)を学習データに含まれていたカテゴリー(今回作ったものだと「経済」、「IT」、「エンタメ」、「科学」、「スポーツ」)のどれに相当するものかを識別して、その可能性の高い順に結果を返しています。この例では「スポーツ」の可能性が 50% 強である、と判断されているようです:
$ node nlc classify パッキャオがんばれ e87efex297-nlc-650
{ "status": 200, "statusText": "OK", "headers": { "content-type": "application/json", "x-xss-protection": "1", "content-security-policy": "default-src 'none'", "x-content-type-options": "nosniff", "cache-control": "no-cache, no-store", "pragma": "no-cache", "expires": "0", "content-length": "679", "strict-transport-security": "max-age=31536000; includeSubDomains;", "x-dp-watson-tran-id": "102350df-e1d0-4568-ae10-6e72ba1b44b0", "x-request-id": "102350df-e1d0-4568-ae10-6e72ba1b44b0", "x-global-transaction-id": "102350df-e1d0-4568-ae10-6e72ba1b44b0", "server": "watson-gateway", "x-edgeconnect-midmile-rtt": "7", "x-edgeconnect-origin-mex-latency": "43", "date": "Tue, 24 Aug 2021 05:51:22 GMT", "connection": "close" }, "result": { "classifier_id": "e87efex297-nlc-650", "url": "https://api.jp-tok.natural-language-classifier.watson.cloud.ibm.com/instances/f738a110-248b-419c-b771-8e6cbd45ee93/v1/classifiers/e87efex297-nlc-650", "text": "パッキャオがんばれ", "top_class": "スポーツ", "classes": [ { "class_name": "スポーツ", "confidence": 0.5022989563107099 }, { "class_name": "エンタメ", "confidence": 0.20692538301831817 }, { "class_name": "経済", "confidence": 0.1200947580342344 }, { "class_name": "科学", "confidence": 0.11456564859743573 }, { "class_name": "IT", "confidence": 0.05611525403930185 } ] } }


作成した学習データを IBM Watson NLC から削除するには以下のコマンドを実行します:
$ node nlc delete [classifier_id]

ここまでのオペレーションで「データ学習」、「学習状況確認」、「問い合わせ(分類)」、「学習データ削除」の4つを NLC API を使って実現し、そのアプリケーションを実行する方法を紹介しました。


【nlu : NLU で操作】
では改めてこの nlc アプリケーションを NLU API で作り直し、同じ4つのオペレーションができることを確認してみます。先ほどダウンロードしたソースコードの nlu フォルダ内にある nlu/nlu.js ファイルを使って操作します(このコードの内容については後述します)。まずは csvgenerator.js の時と同様に  $ npm install を実行して依存ライブラリを導入します:
$ cd nlc

$ npm install

その後、node コマンドでこのファイルを実行します。この nlu.js もコマンドラインアプリケーションで、その実行時パラメータによって「データ学習」、「学習状況確認」、「問い合わせ(分類)」、「学習データ削除」の4つを行うことができます:
$ node nlu create [csvfilename]  ・・・データ学習

$ node nlu status  ・・・学習状況確認

$ node nlu analyze [日本語テキスト] [model_id]  ・・・問い合わせ(分類)

$ node nlu delete [model_id]  ・・・学習データ削除

※前述の NLC では問い合わせ時に "classify(分類)" という命令を指定していましたが、NLU では同じ作業を "analyze(解析)" と表現しているようです。またパラメータとして指定する ID も NLC では "classifier_id(分類ID)" だったのですが、NLU では "model_id(モデルID)" という表現になっていました。

では実際に nlu ツールを使いながら操作を確認してみましょう。まずは IBM Cloud にウェブブラウザでログインして、NLU インスタンスを作成し、「サービス資格情報」(を必要であれば作成して)の内容を確認します:
2021082401


この中に apikey 属性値と url 属性値が含まれているので、それらの値を nlu/settings.js ファイル内の exports.nlc_apiKey 値および exports.nlc_url 値にそれぞれコピーして保存します:
exports.nlu_apiKey = 'サービス資格情報内の apikey 属性値';
exports.nlu_url = 'サービス資格情報内の url 属性値';
exports.nlu_name = 'nlc2nlu';
exports.nlu_language = 'ja';

これで実行前の準備は完了しました。早速「データ学習」を実行してみます。「データ学習」は(前述の作業で用意した)学習データ CSV ファイルを指定して、$ node nlu create [csvfilename] を実行します。先ほどの手順で ../csvtool/csvfile.csv というファイルが作られている場合は以下のように指定して実行します:
$ node nlu create ../csvtool/csvfile.csv

これで指定した CSV ファイルを元にする学習が開始されます。この学習が完了すると問い合わせ(分類)ができるようになりますが、完了しているかどうかを確認するには以下のコマンドを実行します:
$ node nlu status

実行結果は以下のような JSON が表示されますが、この中の status 欄が "available" となっていれば学習は完了しています。同時に表示されている model_id の値はこの後で使うので合わせてメモしておきましょう。この辺りまでは前述の NLC の時とほぼ同様ですね:
{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "x-powered-by": "Express",
    "content-type": "application/json; charset=utf-8",
    "content-length": "401",
    "etag": "W/\"191-CBnewThU0u/CjNzD01hil1wp9qo\"",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-dp-watson-tran-id": "15b238e1-d074-438d-8de5-44fcdfc163de",
    "x-request-id": "15b238e1-d074-438d-8de5-44fcdfc163de",
    "x-global-transaction-id": "15b238e1-d074-438d-8de5-44fcdfc163de",
    "server": "watson-gateway",
    "x-edgeconnect-midmile-rtt": "7",
    "x-edgeconnect-origin-mex-latency": "228",
    "date": "Tue, 24 Aug 2021 05:54:08 GMT",
    "connection": "close"
  },
  "result": {
    "models": [
      {
        "name": "nlc2nlu",
        "user_metadata": null,
        "language": "ja",
        "description": null,
        "model_version": "1.0.0",
        "version": "1.0.0",
        "workspace_id": null,
        "version_description": null,
        "status": "available",
        "notices": [],
        "model_id": "619ad785-0b0c-4981-8217-bd51064896a3",
        "features": [
          "classifications"
        ],
        "created": "2021-08-24T05:43:32Z",
        "last_trained": "2021-08-24T05:43:32Z",
        "last_deployed": "2021-08-24T05:50:10Z"
      }
    ]
  }
}

学習が完了したら改めて日本語テキストを指定して、その内容がどのカテゴリーに属しているのかを分類してみましょう。NLC では "classify" と指定していた部分は NLU では "analyze" となる点に注意してください。日本語テキストと上述で確認した model_id 値を指定して、以下のようなコマンドを実行します:
$ node nlu analyze [日本語テキスト] [model_id]

すると以下のような結果が表示されます。指定した日本語テキストを学習データに含まれていたカテゴリー(今回作ったものだと「経済」、「IT」、「エンタメ」、「科学」、「スポーツ」)のどれに相当するものかを識別して、その可能性の高い順に結果を返しています。同じ学習データで同じ問い合わせをして、こちらでも「スポーツ」の可能性が高いと判定されていますが、その確率や2位以下の結果には違いがあることがわかります:
$ node nlu analyze パッキャオがんばれ 619ad785-0b0c-4981-8217-bd51064896a3

{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "server": "watson-gateway",
    "content-length": "499",
    "content-type": "application/json; charset=utf-8",
    "cache-control": "no-cache, no-store",
    "x-dp-watson-tran-id": "93978bcf-c49e-41e9-ad00-7f0000a34e15, 93978bcf-c49e-41e9-ad00-7f0000a34e15",
    "content-security-policy": "default-src 'none'",
    "pragma": "no-cache",
    "x-content-type-options": "nosniff",
    "x-frame-options": "DENY",
    "x-xss-protection": "1; mode=block",
    "strict-transport-security": "max-age=31536000; includeSubDomains;",
    "x-request-id": "93978bcf-c49e-41e9-ad00-7f0000a34e15",
    "x-global-transaction-id": "93978bcf-c49e-41e9-ad00-7f0000a34e15",
    "x-edgeconnect-midmile-rtt": "10",
    "x-edgeconnect-origin-mex-latency": "354",
    "date": "Tue, 24 Aug 2021 05:56:16 GMT",
    "connection": "close"
  },
  "result": {
    "usage": {
      "text_units": 1,
      "text_characters": 9,
      "features": 1
    },
    "language": "ja",
    "classifications": [
      {
        "confidence": 0.402721,
        "class_name": "スポーツ"
      },
      {
        "confidence": 0.326038,
        "class_name": "経済"
      },
      {
        "confidence": 0.314985,
        "class_name": "IT"
      },
      {
        "confidence": 0.255796,
        "class_name": "エンタメ"
      },
      {
        "confidence": 0.21978,
        "class_name": "科学"
      }
    ]
  }
}


作成した学習データを IBM Watson NLU から削除するには以下のコマンドを実行します:
$ node nlu delete [model_id]

ここまでのオペレーションで NLC 同様に NLU でも「データ学習」、「学習状況確認」、「問い合わせ(分類)」、「学習データ削除」の4つを API で実現し、そのアプリケーションを実行する方法を紹介しました。とりあえず、この4つのオペレーションについては NLC から NLU へ移行することはできそうだ、という感触が持てる結果になりました。


【API レベルの移行作業】
同じオペレーションを行う NLC のツールと NLU のツールを実際に Node.js + IBM Watson SDK で開発してわかったことを記載しておきます。

まず API に互換性はありません。IAM を使った認証部分についてはほぼ同じなのですが、今回行った4つのオペレーションを実現するためのそれぞれの API は NLC のものと NLU のものは全く異なります:
NLC の関数 オペレーションの種類 NLU の関数
IamAuthenticator() 認証 IamAuthenticator()
createClassifier() 分類器/モデルの作成 createClassificationModel()
listClassifiers() 作成した分類器/モデルの参照 listClassificationModels()
classify() 分類/解析 analyze()
deleteClassifier() 分類器/モデルの削除 deleteClassificationModel()


パラメータの指定方法など、詳しくはソースコード(nlc/nlc.js / nlu/nlu.js)を参照していただきたいのですが、大まかには上記表のような関数の違いがあります。特に Node.js + IBM Watson SDK を使っているアプリケーションにおいて NLC から NLU へ移植する場合は、表の左列にある関数を使っている箇所を右列の関数に置き換える、というのが大まかな流れになると思います(実際にはパラメータの指定方法だったり、返り値のフォーマットの違いもあったりするので、単なる文字列置換というわけにはいかないと思います)。また NLC では「分類器(Classifier)」と呼んでいたものが NLU だと「分類モデル(ClassficationModel)」と呼び名が変わっていたりもするので、資料を参照する場合の注意も必要だと思います。

加えて、上記のように NLC を使って問い合わせた結果と NLU に移植後に問い合わせた結果は必ずしも同じ結果とはいきません。このあたりの整合性についても移植の前後で意識しておく必要があります。

とはいえ、少なくとも API のレベルで NLC から NLU へアプリケーションを移植することは不可能ではなさそう、という感触も得ることができました。主要なオペレーションに関しては上述の表を使って関数を新しいものに置き換え、実行結果のフォーマットの違いをプログラミング内で吸収することができれば、ある程度の実現目途は立ちそうだと思っています。


今回の NLC のサービス終了自体は残念ではありますが、一方で見方を変えると、これまで有償サービスでしか提供されていなかった NLC の機能が、無料のライトプランで使える NLU でも利用できるようになった、とも言えます。API レベルでの互換性はありませんが、機能的には珍しくこれまでの機能の多くが移植されていて、「アプリケーションの作り変え」による対応が可能なレベルでマイグレーションができるようになっていると感じました。「料金的にも発展的なサービス統合」であると感じています。


Node.js 以外の開発言語での場合や、IBM Watson SDK の利用有無の違いをどこまで吸収できるかまでを調査したわけではないのですが、一部の言語については後述の参考資料の中でサンプルコードもあるようなので、別環境においてもぜひ挑戦していただき、情報が共有されていくことを願っています。



【参考資料】
https://cloud.ibm.com/docs/natural-language-classifier?topic=natural-language-classifier-migrating

https://cloud.ibm.com/apidocs/natural-language-understanding?code=node


IBM ワトソン対応の CMS である BlueCMS を公開しました。IBM Cloud を使ったセットアップ手順はこちらをご覧ください:
ワトソン対応の IBM Cloud 向き CMS "BlueCMS" を公開しました(セットアップ手順)


今回は初期セットアップ後の、実際の使い方を紹介します。


コンテンツタイトル等

初期セットアップの中で管理者権限を持った最初のユーザーを作っているので、このユーザーの ID とパスワードでログインします:
2018071001


管理コンソール画面が表示されます。管理コンソールにはコンテンツタイトルなどコンテンツ全体に関係する設定項目に続き、現在までに登録されている文書の一覧テーブルと、添付ファイルの一覧テーブルが表示されますが、ログインユーザーが管理者権限を持っている場合はコンテンツの設定項目の下にユーザー一覧テーブルも表示されます:
2018071101
(↑上からコンテンツ設定、ユーザー一覧)

2018071102
(↑上から文書一覧、添付ファイル一覧)

コンテンツ設定は以下のようになっています:
2018071103


これらは OGP(Open Graph Protocol) と言われる設定項目になっており、有名どころでは facebook で BlueCMS のトップページや各記事を共有した場合に表示される内容を定義します。

また title と desc は BlueCMS トップ画面の jumbotron の中で表示される内容でもあります。自分のブログのタイトルとその説明を記述するようにしてください。url はブログの URL、image_url は OGP イメージ画像の URL を指定します(指定していない場合は無視します)。

なお、現時点(2018/Jul/12)では個別ページの OGP を設定する機能がなく、個別ページをシェアするとトップページと同じ OGP が表示されます(リンク先の URL だけは個別ページになります)。この辺りは今後の機能拡張で対応したいと思っています。


ユーザー追加/管理

管理者権限を持ったユーザーはユーザー一覧テーブルで登録済みユーザーの一覧を確認したり、編集したり、削除したり、新規にユーザーを追加することができます:
2018071104


新規作成は一番下の編集行の各フィールドに入力して "update"、既存ユーザーの変更は右にある "edit" をクリックすると編集行に値がコピーされるので、ここで変更して "update"、ユーザーの削除は右にある "delete" をクリックします。

なおユーザー編集時には role の値に注意してください。この値が 0 のユーザーは管理者、1 のユーザーは編集者として扱われます。name は画面表示用の名称で、email はメールアドレスですが、これらは現時点では特に利用していません。


文書追加/管理

管理コンソールには現在までに登録されている文書の一覧も表示されます:
2018071105


新規作成は一番下の編集行の各フィールドに入力して "update"、既存文書の変更は右にある "edit" をクリックすると編集行に値がコピーされるので、ここで変更して "update"、文書の削除は右にある "delete" をクリックします。

なお文書の status は 1 のものが公開、0 のものは非公開(ドラフト)となります。body は nicEdit を使ったリッチテキスト編集が可能です。category はカテゴリー文字列を直接指定して入力します(category と body の値は IBM ワトソン連携時に利用する値となります)。

body の入力が狭い nicEdit を使っている点が不便であると理解しています。この辺りも今後も機能拡張の対象と考えています。


添付ファイル追加/管理

管理コンソールには現在までに登録されている添付の一覧も表示されます:
2018071106


添付ファイルの新規作成はファイルを選択後、一番下の編集行の name フィールドに入力して "update"、添付ファイルの削除は右にある "delete" をクリックします。添付ファイルには編集機能はありません。


ワトソン連携

セットアップ時に IBM ワトソンの NLC(Natural Language Classifier) 連携も含めて行っている場合は、BlueCMS 内のコンテンツを NLC に学習させたり、学習結果を使って問い合わせを行うことができます:
2018071107


文書一覧の下に NLC 関連のボタンが3つあります。それぞれ以下のように使います:

- "update NLC" : 現在までに BlueCMS に格納された全文書を NLC のトレーニングデータとして学習を初期化&再学習します。学習時には各文書の body 値と category 値だけを取り出して、body 値の内容を category 値として学習します。これを全ての文書に対して行います。

- "NLC status" : 上記学習命令を発生した後の、ワトソンのトレーニングステータスを確認します。この実行結果が "Available" となれば学習準備は完了していて、後述の "classify" で問い合わせが可能になります。一方、実行結果が "Training" であればまだ学習中なので、いましばらくお待ち下さい。

- "classify" : 学習が済んだ後に問い合わせを実行します。具体的には編集行の body に何か文章を入力した後にこのボタンをクリックすると、上述で学習させたコーパスに対してこの body 内容を問い合わせ、「今までの学習データから、どのカテゴリーがふさわしいか」の結果を取得し、category フィールドを更新します。いわば「ワトソンがその内容に相応しいカテゴリーを自動的に決めてくれる」機能です。


現時点での制限事項等

このブログエントリを編集している 2018/Jul/12 時点での BlueCMS の機能と使い方を紹介しました。上述のように CMS として足りない機能や使いにくい部分も多くあり、ワードプレスなどと比較するとまだまだだと思っています。

一方で新しくスクラッチで開発したからこそできた挑戦的な機能もあります。特に標準で IBM ワトソンと連動する機能については BlueCMS の特徴の1つだと思っています。

自分でも少しずつ使っていきながら感じた機能を拡張させていく予定ですが、もしお試し程度でも使ってみていただける場合は、感想や希望を伝えていただければと思っています。


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

上記記事は「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

参考程度に、以前のサンプルはこちらです(注 現在は正しく動きません ノーツ9の FP8 を適用することで動くようになりました)
http://dotnsf.blog.jp/nlcdemo.old.zip



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




この記事の続きです:
Watson API Explorer の使いかた

上記記事で Watson API Explorer サービスの紹介をしました。今回はより実践的に Watson API を使ってみます。

今回対象にする Watson API は上記記事でも紹介した Natural Language Classifier (以下 NLC)とします。前回は学習前の(空の)データを確認しただけですが、今回は実際にデータを学習させた上で、学習データに対して問い合わせをする、という一連の機能を Watson API Explorer で確認する、という手順を行います。

この手順を紹介する上で、あらかじめ NLC サービスインスタンスを Bluemix 上に作成し、認証情報(username と password)を取得しておく必要があります。その手順については上記前回の記事を参照してください。

加えて今回はデータを学習させる手順が含まれるので、サンプルの学習用データを用意しました。以下のリンクをクリックして、nlc_api_training.zip をダウンロード&展開してください:
http://dotnsf.blog.jp/nlc_api_training.zip

展開すると2つのファイルが出来上がります。いずれもテキストファイル(JSON ファイルと CSV ファイル)なので、興味のある人はテキストエディタで中身を確認してみてください:
2016063001


では実際に Watson API Explorer で NLC を使ってみます。まずは NLC API のページに移動します:
https://watson-api-explorer.mybluemix.net/apis/natural-language-classifier-v1

そして取得済みの username と password を画面右上欄に入力します。これで準備完了:
2016063002


最初にデータを学習させてみますが、その前にまだ何も学習されていないことを確認しておきましょう。現在の状態を確認する API はリストの一番上にある GET /v1/classifiers です。ここをクリックして展開します:
2016063003


この API の説明やパラメータ、実行結果の意味などが表示されますが、この API はパラメータなしで実行するので、特に何も指定する項目はありません。そのまま "Try it out!" ボタンをクリックして実行します。するとこの API が実行され、その結果(Response Body)を見ると "classifiers" が空配列([])になっており、まだ何も学習されていないことがわかります:
2016063004


なお、この上記画面内の "Request URL" を見ると、同じ処理を curl で実行する場合のコマンド内容を確認できます。また "Response Headers" には REST API 実行結果に含まれている HTTP ヘッダの内容を確認することもできます。

もしもこのコマンドの実行結果が空配列ではなく何か含まれていて、次の学習コマンドを実行する前に内容をリセットする場合は、API リストの下から2番目にある DELETE /v1/classifiers/{classifier_id} を実行して現在の学習内容を削除できます。その方法は最後に紹介しますが、ここでは現在は何も学習していない状態であるとして以下を紹介します。

では NLC に学習データを送信してみましょう。新しいデータを学習させる場合の API は上から2番目の POST /v1/classifiers を使います:
2016063005


パラメータの説明を見ると、この API の実行には2つの情報を(POST データとして)与える必要があると書かれています。1つは training_meta_data という名前の JSON データで、もう1つは training_data という名前の CSV データです。実はこれらのサンプルが上記でサンプル zip ファイルを展開した中に含まれていた2つのファイルです。

training_meta_data のサンプルが demo_metadata.json です。サンプルファイルの中身は以下のようになっているはずです:
{"language":"ja","name":"dotnsf_nlc_demo"}

非常にシンプルな内容の JSON テキストです。"language" はこの後の学習データに使われている言語(日本語なので "ja" を指定)、また "name" はこの学習データに付ける名前(この例では "dotnsf_nlc_demo")です。"name" の内容は適当に変更しても構いません。

もう1つの training_data のサンプルが dwj.csv です。 これが学習データに相当するもので、こちらもテキストエディタで開くとわかりますが、以下の様な内容の CSV ファイルです:
Bluemix の Auto-Scaling サービスは、ターゲット環境の・・・,cloud
この記事では、IBM DevOps Services で使用されるスプリント・・・,cloud
  :
  :
Java 8 には、より簡単にプログラムを作成できるように・・・,java
  :
  :
ほとんどの Linux システムでは、仮想マシン (VM) を作成およびサポートするための・・・,linux
  :
  :

CSV の1行は2つだけの列で構成されており、1つ目が本文、2つ目は本文のカテゴリーになっています。つまり「(カテゴリー)の例として(本文)がある」ということを学習データとして与えています。これを1つのカテゴリーについて充分な(この dwj.csv では1つのカテゴリーにつき約100個の)本文を与えて、それを元に学習させている、ということです。

もう少し細かく説明すると、与えた本文は(training_meta_data で指定した「日本語」のルールで)単語に区切られ、品詞に分類した上でその出現頻度や傾向などから「カテゴリ(例えば cloud)とは、こういう特徴を持ったものだ」ということを自分で判断・理解して学習させています。このような例をカテゴリごとに大量に用意して、(上記サンプルでは)cloud とはこういうもの、java とはこういうもの、linux とはこういうもの、・・・といった内容を学習させる、そのための学習元データになっています。

したがって、上記の dwj.csv ファイルはそのままでも動くサンプルですが、新しい情報を書き加えたり、新しいカテゴリのデータを加えて与えたりしても動きます(更新後の内容を学習します)。興味があれば自分なりにカスタマイズしてみてください。


改めて、この2つのサンプルファイルを使って NLC の学習 API を実行してみます。Watson API Explorer のリスト上から2番目の POST /v1/classifiers を展開し、training_meta_data に demo_metadata.json を、training_data に dwj.csv を指定して、"Try it out!" をクリックします:
2016070101


すると指定した2つのファイルがアップロードされ、学習用の分類器(classifier)が新たに1つ生成されて学習が開始されます。"Response Body" にはこの新たに作成された分類器を識別するための ID("classifier_id"、以下の例では "2374f9x69-nlc-8772") が含まれているのでメモしておきましょう。また現時点では "status" が "Training" となっていることもわかります。これは「この分類器はまだ学習が終わっていない状態である(問い合わせできる状態にはなっていない)」ことを意味しています。なので学習が完了するまではしばらく待つ必要があります:
2016070101


なお上記の curl コマンドを見ると、2つのファイルが multipart/form-data 形式でアップロードされていることがわかります。実際にこの部分を REST API で作る際には multipart/form-data で POST するように実装する必要がある、ということもわかります。またメタデータで指定した "name" ("dotnsf_nlc_demo")はこの API の実行結果に現れていることもわかりますね。


特定の分類器の学習が完了しているかどうかを確認するための API も用意されています。リストの1番下にある GET /v1/classifier/{classifier_id} という API です。この API を展開し、パラメータの classifier_id 欄に先程作成した分類器の classifier_id(この例では "2374f9x69-nlc-8772") を指定して "Try it out!" ボタンをクリックします:
2016070102


実行結果の "Response Body" を確認します。下の結果ではまだ "status" が "Training" となっていて、学習が完了していないことがわかります:
2016070103


しばらく(ケースバイケースですが、15~30分程度)待って、この API を実行し、"status" が "Available" となっていれば与えたデータの学習が完了したことになります。こうなると学習済みの分類器に対する問い合わせが可能になります:
2016070105


なお、この状態で再度最初の GET /v1/classifiers API を実行すると、(最初に実行した時の結果は空配列でしたが)先程新たに生成した分類器が実行結果に含まれて返ってくることがわかるはずです:
2016070104


さて、学習が完了したので、Watson NLC に問い合わせを実行してみましょう。リストの上から3番目の GET /v1/classifiers/{classifier_id}/classify か、または4番目の POST /v1/classifiers/{classifier_id}/classify を使って問い合わせを行います。この2つの違いは HTTP メソッド(GET か POST か)と、問い合わせテキストの送信方法(パラメータかリクエスト本文か)です。どちらでもいいのですが、今回は後者の POST /v1/classifiers/{classifier_id}/classify を使ってみましょう。

リスト内の POST /v1/classifiers/{classifier_id}/classify を選んで展開し、classifier_id に作成した分類器の classfier_id(この例では "2374f9x69-nlc-8772")を、body には Watson NLC に問い合わせさせたい日本語テキスト文書を、それぞれ入力します。

今回問い合わせるテキストは「RedHat だけでなく Ubuntu も勉強しないとね」というものにします(変更しても構いません)。この日本語の自然言語テキストを先程学習させた NLC に対して分類をリクエストし、学習時に与えたデータに基いて「学習データに使ったカテゴリでいえば、どのカテゴリに属するテキストであるか?そしてそれはどのくらいの確信度があるのか?」を問い合わせます。

なお body には JSON テキストを指定する必要があり、そのテンプレートが右側にあるので、その内容に沿って、以下のように body を用意する必要があることに注意してください:
{
  "text": "RedHat だけでなく Ubuntu も勉強しないとね"
}

2016070106


そして最後に "Try it out!" をクリックします。正しく実行されると、以下の様な JSON テキストが "Response Body" に返ってくるはずです:
2016070101


ちなみに "Response Body" の全文はこんな感じでした:
{
  "classifier_id": "2374f9x69-nlc-8772",
  "url": "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/2374f9x69-nlc-8772",
  "text": "RedHat だけでなく Ubuntu も勉強しないとね",
  "top_class": "linux",
  "classes": [
    {
      "class_name": "linux",
      "confidence": 0.5345447969025622
    },
    {
      "class_name": "xml",
      "confidence": 0.17404873174100038
    },
    {
      "class_name": "cloud",
      "confidence": 0.09516428245259624
    },
    {
      "class_name": "opensource",
      "confidence": 0.07239515901217708
    },
    {
      "class_name": "web",
      "confidence": 0.0611971709641311
    },
    {
      "class_name": "java",
      "confidence": 0.04321802457711143
    },
    {
      "class_name": "mobile",
      "confidence": 0.019431834350421725
    }
  ]
}

実行結果に相当するのは上記の赤字部分です。これを表形式でまとめると以下の様な結果だった、ということになります:
分類結果順位分類結果確信度(%)
1linux53.45447969025622
2xml17.404873174100038
3cloud9.516428245259624
4opensource7.239515901217708
5web6.11971709641311
6java4.321802457711143
7mobile1.9431834350421725


1位は約 53.45% という確信度を以っての "Linux" でした。7つのカテゴリからの選択で 50% 以上の確信があるということはかなり高いと言えます。また人間の普通の感覚としても「RedHat だけでなく Ubuntu も勉強しないとね」というテキストの分類結果が Linux というのは、自然な(正しい)結果であるように感じます。 改めて注目していただきたいのは、問い合わせ本文には一言も Linux という単語はなかったのに、Linux という分類結果が高い確信度と共に得られている、という点です。


最後に、滅多に使わないかもしれませんが、作成した分類器が不要になった場合に削除する方法も紹介しておきます。リストの下から2番目にある DELETE /v1/classifiers/{classifier_id} を展開し、classifier_id パラメータに自分の ID(この例では "2374f9x69-nlc-8772")を指定して "Try it out!" をクリックします:
2016070102


実行が成功しました。が、成功した場合は特に "Response Body" には削除されたかどうかがわかる情報は含まれてない感じ:
2016070103


本当に消えているかどうかは、一番最初のステータス確認 API を再度実行して、classifier_id が消えていることを確認する必要があります。↓こうなっていれば消えています:
2016070101


以上、Watson API Explorer を使って NLC を体験してみました。NLC がどんなものか、なんとなく理解できましたかね。

まあ、個人的には「curl でやっちまった方が早いじゃん」とも思ってますが、コマンドラインに慣れない人もいるだろうし、こういう Watson API Explorer のようなウェブインターフェースが用意された背景にはそれなりの需要があったのではないかと考えています。加えて、ドキュメントと動作確認機能が統合されているのは確かに便利ですよね。



なお、NLC の API そのものの詳細については以下のリファレンスを参照ください:
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/natural-language-classifier/api/v1/


 

(注 ノーツ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 の力で再活性化するような、そんな仕組みの一環としてこのサンプルが役立つことができたら本当に嬉しいです。



このページのトップヘ