Retrieve and Rank をトレーニングしテストする

Retrieve and Rank に関する環境構築の手順を紹介します。事前にBluemix のアカウント作成、Retrieve and Rankサービスの作成が必要です。

スポンサーリンク

参考:Overview of the Retrieve and Rank service http://www.ibm.com/watson/developercloud/doc/retrieve-rank/

Solrクラスタ作成を作成する

solr クラスタを作成します。以下のコマンドを時刻します。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************

C:\>curl -k -X POST -u "%USERNAME%":"%PASSWORD%" "%APIURL%/v1/solr_clusters"
成功すると以下のような結果が表示されます。ただし作成にはしばらく時間がかかります。
よってコマンド実行直後は以下のように"NOT_AVAILABLE"と表示され、まだ作成中であることが分かります。
{"solr_cluster_id":"**********_****_****_****_************","cluster_name":"","cluster_size":"","solr_cluster_status":"NOT_AVAILABLE"}
以下は状態を確認するコマンドです。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>curl -k -G -u "%USERNAME%":"%PASSWORD%" %APIURL%
以下のように READY と表示されれば準備完了です。
{"clusters":[{"solr_cluster_id":"**********_****_****_****_************","cluster_name":"","cluster_size":"","solr_cluster_status":"READY"}

Solr クラスタのconfig ファイルをアップロードする

Solr の config ファイルをいきなり作成するのは大変です。よってこのページでは IBM 社がサンプルとして提供している config ファイルをサンプルとして使用します。
参考URL:Using the Retrieve and Rank Web Interface
https://www.ibm.com/watson/developercloud/doc/retrieve-rank/ranker_tooling.shtml
使用する confog は以下のファイルです。
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/retrieve-rank/resources/cranfield_solr_config.zip
以下のコマンドでアップロードします。config ファイルは c:\temp\cranfield_solr_config.zip にあるので、異なる場合には読み替えてください。
また sampleconfig という名前にしているため、必要に応じて変更してください。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************

C:\>curl -u "%USERNAME%":"%PASSWORD%" -k -X POST -H "Content-Type: application/zip" --data-binary @c:\temp\cranfield_solr_config.zip "%APIURL%/%SOLR_CLUSTER_ID%/config/sampleconfig"
以下のような結果が出力されれば成功です。
{"message":"WRRCSR026: Successfully uploaded named config [sampleconfig] for Solr cluster [**********_****_****_****_************].","statusCode":200}
以下のコマンドにより再度正常にconfig がアップロードされていることを確認します。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************

C:\>curl -k -X GET -u "%USERNAME%":"%PASSWORD%" "%APIURL%/%SOLR_CLUSTER_ID%/config"
以下のような応答が返れば成功です。sampleconfig は前のコマンドで指定したconfig名であり、環境により異なります。
{"solr_configs":["sampleconfig"]}

Solr コレクションを作成する

作成したSolr cluster 内にコレクションを生成するコマンドは以下の通りです。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set CONFIGNAME=sampleconfig
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************
C:\>set COLLECTION_NAME=example_collection

C:\>curl -k -X POST -u "%USERNAME%":"%PASSWORD%" -d "action=CREATE&name=%COLLECTION_NAME%&collection.configName=%CONFIGNAME%" "%APIURL%/%SOLR_CLUSTER_ID%/solr/admin/collections"
以下のような応答があれば成功です。
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">12211</int></lst><lst name="success"><lst name="*.*.*.*:5464_solr"><lst name="responseHeader"><int name="status">0</int><int name="QTime">2547</int></lst><str name="core">example_collection_shard1_replica2</str></lst><lst name="*.*.*.*:5689_solr"><lst name="responseHeader"><int name="status">0</int><int name="QTime">2929</int></lst><str name="core">example_collection_shard1_replica1</str></lst></lst>
作成したコレクション名を確認するコマンドは以下の通りです。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************

C:\>curl -k -s -X GET -u "%USERNAME%":"%PASSWORD%" "%APIURL%/%SOLR_CLUSTER_ID%/solr/admin/collections?action=LIST"
以下のような応答があれば成功です。表示されるコレクション名が正しいことを確認してください。
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">0</int></lst><arr name="collections"><str>example_collection</str></arr>
</response>

文書をSolrにアップロードする

作成したSolr内のコレクションに文書をアップロードする手順を紹介します。
ここでは以下の文献一覧のようなサンプルを使用します。
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/retrieve-rank/resources/cranfield_data.json
このサンプル文書がc:\temp\cranfield_data.jsonに保存されている場合、以下のコマンドでアップロードが可能です。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************
C:\>set COLLECTION_NAME=example_collection

C:\>curl -k -X POST -u "%USERNAME%":"%PASSWORD%" -H "Content-Type: application/json" --data-binary @c:\temp\cranfield_data.json "%APIURL%/%SOLR_CLUSTER_ID%/solr/%COLLECTION_NAME%/update"
以下のような応答があれば成功です。
{"responseHeader":{"status":0,"QTime":1618}}
テストとして検索してみます。ただし現在は「Retrieve and Rank」の「Retrieve」だけであるため、検索結果が表示されるだけでどの結果が重要かは表示されません。
文書内で "wing" という文字を検索しています。あまり意味のない検索ですが、テストとして実行します。
C:\>set APIURL=https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************
C:\>set COLLECTION_NAME=example_collection

C:\>curl -k -X GET -u "%USERNAME%":"%PASSWORD%" "%APIURL%/%SOLR_CLUSTER_ID%/solr/%COLLECTION_NAME%/select?q=wing&wt=json&fl=id,title"
以下のような結果が表示されます。
{"responseHeader":{"status":0,"QTime":40,"params":{"q":"wing","fl":"id,title","wt":"json"}},"response":{"numFound":226,"start":0,"docs":[{"id":"433","title":["application of two dimensional vortex theory to the prediction of flow fields behind wings of wing-body combinations at subsonic and supersonic speeds ."]},{"id":"432","title":["theoretical damping in roll and rolling moment due to differential wing incidence for slender cruciform wings and wing-body combinations ."]},{"id":"924","title":["a method for calculating the lift and centre of pressure of wing-body-tail combinations at subsonic, transonic speeds ."]},{"id":"1075","title":["an experimental and theoretical investigation of second-order supersonic wing-body interference, for a non-lifting body with wings at incidence ."]},{"id":"696","title":["pressure loads produced on a flat-plate wing by rocket jets exhausting in a spanwise direction below the wing and perpendicular to a free-stream flow of mach number 2.0 ."]},{"id":"1239","title":["body under lifting wing ."]},{"id":"699","title":["approximate indical lift functions for several wings of finite span in incompressible flow as obtained from oscillatory lift coefficients ."]},{"id":"673","title":["investigation of full scale split trailing edge wing flaps with various chords and hinge locations ."]},{"id":"712","title":["low-speed longitudinal aerodynamic characteristics associated with a series of low-aspect ratio wings having variations in leading-edge contour ."]},{"id":"1092","title":["wing-nacelle-propeller interference for wings of various spans . force and pressure distribution tests ."]}]}}
(注意)コレクション名に不正な文字 (ハイフンなど)を指定しているとここで検索にヒットしません。しかも不正な文字を使用していもここまでエラーも出力されなかったので原因が分かりません。

グランドトゥルースによる学習

グランドトゥルースのトレーニングデータ生成、アップロード、学習を行います。
「トレーニングデーターの生成」「アップロード」はローカルより実行するようです。学習に関しては、Blumix 上で実行するようです。
以下が前述で使用した文書に対するグランドトゥルース用のサンプルデータです。
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/retrieve-rank/resources/cranfield_gt.csv
アップロードツール(Python)は以下より入手します。
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/retrieve-rank/resources/train.py
実行には Python が必要です。次からダウンロードが可能です。
Python ダウンロード
以下はcranfield_gt.csvよりトレーニングデータを生成し、Bluemix にアップロードするコマンドです。python は C:\Python27\python.exe に存在する想定となっております。
C:\>set USERNAME=********-****-****-****-**************
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************
C:\>set COLLECTION_NAME=example_collection

C:\>C:\Python27\python c:\temp\train.py -u "%USERNAME%":"%PASSWORD%" -i c:\temp\cranfield_gt.csv -c %SOLR_CLUSTER_ID% -x %COLLECTION_NAME% -n example_ranker
以下のような応答が戻れば成功です。処理には数分かかります。カレントディレクトリには trainingdata.txt (ファイル名固定) のトレーニングデータが生成されます。
"The ranker instance is in its training phase, not yet ready to accept rank requests"と記載されているとおり、コマンド実行直後はトレーニング中のステータスとなり、すぐには使えないことが分かります。以下の赤字の部分のようにranker_idが出力されます。
Solr cluster is ***********_****_****_****_************
Solr collection is example_collection
Ranker name is example_ranker
Rows per query 10
Generating training data...
Generating training data complete.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 305k 0 317 100 305k 130 126k 0:00:02 0:00:02 --:--:-- 126k
{"ranker_id":"******x**-rank-***","name":"example_ranker","created":"2017-02-01T01:00:00.000","
url":"https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers/******x**-rank-***","status":"Training","status_description":"The ranker instance is in its training phase, not yet ready to accept rank requests"}
ステータスを確認するには以下のコマンドを実行します。前のコマンドで取得したRANKER_IDを使用しています。
C:\>set APIURL2=https://gateway.watsonplatform.net/retrieve-and-rank/api
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************
C:\>set RANKER_ID=*********-rank-***

C:\>curl -k -u "%USERNAME%":"%PASSWORD%" "%APIURL2%/v1/rankers/%RANKER_ID%"
以下のような応答が返れば成功です。"The ranker instance is now available and is ready to take ranker requests"と表示されれば準備完了であることが分かります。
{"ranker_id":"*********-rank-***","name":"example_ranker","created":"2017-02-01T01:00:00.000",
"url":"https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers/*********-rank-***","status":"Available","status_description":"The ranker instance is now available and is ready to take ranker requests."}

スポンサーリンク

問い合わせしてみる

準備がすべて整ったため問い合わせしてみます。質問をコマンドに含める例と外部ファイルに保存する2通りの方法を紹介します。
以下は質問である"is there acoustic wave propagation document?"を本文に含める場合です。(ただしWindows環境で日本語を含める場合は、Shift-Jisとしてencodeされてしまうので、この方法は失敗する可能性があります。その場合は後述の質問を外部ファイルに保存する方法で試してみます。
fl=id,title で戻されるデータの項目を指定します。指定しないと全量返されデータが大きくなります。
C:\>set APIURL2=https://gateway.watsonplatform.net/retrieve-and-rank/api
C:\>set PASSWORD=************
C:\>set SOLR_CLUSTER_ID=**********_****_****_****_************
C:\>set COLLECTION_NAME=example_collection

C:\>curl -G -k -X GET -u "%USERNAME%":"%PASSWORD%" "%APIURL2%/v1/solr_clusters/%SOLR_CLUSTER_ID%/solr/%COLLECTION_NAME%/select?wt=json&fl=id,title" --data-urlencode "q=is there acoustic wave propagation document?"
(*) -G はURLにデータを付加するのに必要なオプション
以下のような応答があります。
{"responseHeader":{"status":0,"QTime":1,"params":{"q":"is there acoustic wave propagation document?","fl":"id,title","wt":"json"}},"response":{"numFound":226,"start":0,"docs":[{"id":"1244","title":["on the aerodynamic noise of a turbulent jet ."]},{"id":"1203","title":["the propagation of a nonuniform magnetohydrodynamic shock wave into a moving monatomic fluid ."]},{"id":"724","title":["structural acoustic proof testing ."]},{"id":"654","title":["on the propagation and structure of the blast wave . part 1."]},{"id":"1327","title":["on the propagation and structure of the blast wave ."]},{"id":"1389","title":["numerical construction of detached shock waves ."]},{"id":"1208","title":["a linearized analysis of the forces exerted on a rigid wing by a shock wave ."]},{"id":"132","title":["viscosity effects in sound waves of finite amplitude: in survey in mechanics ."]},{"id":"319","title":["propagation of weak disturbances in a gas subject to relaxation effects ."]},{"id":"75","title":["studies of structural failure due to acoustic loading ."]}]}}
エラーが返される、あるいは応答が全く戻らない場合は、-verbose オプションを使用してパラメータを確認してください。パラメータの組み立てに誤りがあると応答が戻らないようです。(特に q= の部分に誤りがあろうと応答が戻らないようです。)
質問文を外部ファイルに保存するコマンドは以下の通りです。この例ではc:\temp\question.txtに質問を保管しています。質問文は UTF-8 で保存します。
C:\>curl -G -k -X GET -u "%USERNAME%":"%PASSWORD%" "%APIURL2%/v1/solr_clusters/%SOLR_CLUSTER_ID%/solr/%COLLECTION_NAME%/select?wt=json&fl=id,title" --data-urlencode q@c:\temp\question.txt
(*) -G はURLにデータを付加するのに必要なオプション

スポンサーリンク

[Retrieve and Rankに戻る]