Ruby からの Watson Natural Language Classifier 利用例
Ruby用の gem watson-api-clientを使って、Watson のNatural Language Classifierの動作を確認してみました。
以下の記述はブログ記事「2016/09/15 Natural Language Classifier」の転載で、watson-api-client/examples/NaturalLanguageClassifier/README.mdの翻訳です。Watson Natural Language Classifier 側の変更により現時点では情報が古くなっている可能性がありますのでご留意ください。
watson-api-client はボランティアで公開していて動作確認での課金発生は最小限にしています。このためテストはなかなか行き届きません。Watson 側の動作の変化などお気づきになられましたら、ご連絡いただけるとありがたいです。
watson-api-client のインストール方法などは https://github.com/suchowan/watson-api-client をご覧ください。watson-api-client の背景については別記事をおこしました。
1.事前準備
###- VCAP_SERVICES
VCAP_SERVICES を設定して username, password が取得できるようにしておきます。
(あるいは examples/NaturalLanguageClassifier 配下のスクリプトの service 生成の際、new メソッドに user と password を指定する引数を加えます)
###- ブログ記事のアーカイブ
ブログ記事のアーカイブ(サンプル)をこちらからダウンロードして、examples/NaturalLanguageClassifier/blog_text 以下に解凍します。
2.トレーニング
###- classifier オブジェクトの生成
(例) $ ruby train.rb 2014 2015
この例では blog_text 以下のブログ記事から 2014年と2015年の記事を抽出し、train.csv に書き出します。次に NaturalLanguageClassifier のオブジェクトを生成して、この train.csv で トレーニングします。 2014 や 2015 などの引数がすべて省かれた場合は、すでに存在する train.csv をそのまま用います。(train.csv の生成処理はエレガントでないですが、まあサンプルですからご容赦ください。)
###- classifier オブジェクトの状態確認
$ ruby classify.rb
classify.rb を引数なしで呼ぶと生成した classifier オブジェクトの状態を読み出します。Status が 'Available' になるまでお待ちください。
3.分類の実行
(例) $ ruby classify.rb '2016/08/*'
この例では blog_text 以下のブログ記事から 2016年8月の記事を抽出し、その「テーマ」を問い合わせます。例えば8月11日の「山の日」の記事なら、
"top_class"=>"こよみ",
"classes"=>
[{"class_name"=>"こよみ", "confidence"=>0.4464514057553849},
{"class_name"=>"雑記", "confidence"=>0.31750749975306036},
...
というように、一番可能性の高い「テーマ」を top_class で示して、それに続けて、各テーマの一致度を返してくれます。
4.classifier オブジェクトの削除
$ ruby delete.rb
名前が“Blog thema”であるオブジェクトをすべて削除します。
引数として classifier_id が指定されていれば、その classifier_id のオブジェクトのみ削除します。
5.問題点
'Using your own data to train the Natural Language Classifier'によれば、1データは 1024 文字以内に制限されるとありますが、これは文字数ではなく(若干マージンを見越した)バイト数のようです。バイト数が1200~1300を超えると文字数制限内でも分類の実行時に 'Bad Request' が起こることがありました。