BluemixのDocumentConversionとRetrieve&Rankを連携

#DocumentConversionとは
Bluemixでは様々なWatson APIが使えるようになっているが、**DocumentConversion**(DC)というAPIが**試験サービス(Bluemix Labs)**という位置づけで出ている。
このAPIは、HTMLやDoc、PDFを入力にして、Retrieve&Rank(RR)で使うためのドキュメントデータを出力してくれる便利なAPIという位置づけ・・・だと思っていたけど、どうやらDCの出力はRRと全く一致しないのでそのままでは使えない。なんじゃこりゃー。

ということで、DocumentConversionの生成データを、Retrieve&Rankの入力データに変換する方法を考えてみた。

#DocumentConversionはどこにある？
最初は探すのに苦労しました。BluemixのカタログからWatsonカテゴリーを選んでも出てこない。
実はカタログ画面の一番下にある試験サービスのリンク「Bluemix Labs Catalog」から表示できる。

![2015-12-01 20_04_30-カタログ - IBM Bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/102519/1a80518b-64f4-606b-9c40-f452592aa07a.png)

その中のWatsonカテゴリーを見ると・・・

![2015-12-01 20_07_10-カタログ - IBM Bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/102519/6504f3d2-15e3-d7ab-a4b0-2260fb98dcc2.png)

あった！
ここからサービス追加ができる。


#とりあえずDCにWikipediaを食わせてみた
[WikipediaのAndroid](https://ja.wikipedia.org/wiki/Android)の項目をローカルに保存し、[DCのデモ](http://document-conversion-demo.mybluemix.net/)に食わせてみた。
その結果がこちら。

```json:wikipedia-android.json
{  "source_document_id":"",
  "timestamp":"2015-11-26T01:08:12.945Z",
  "metadata":[
    {
      "content":"text/html; charset=UTF-8",
      "httpEquiv":"content-type"
    },{
      "charset":"UTF-8"
    },{
      "name":"ResourceLoaderDynamicStyles"
    },{
      "name":"generator","content":"MediaWiki 1.27.0-wmf.7"
    }
  ],
  "answer_units":[
    {
      "id":"f2f58ec6-3c2a-4b27-a2a7-a3c5783e1323",
      "type":"h1",
      "parent_id":"",
      "title":"Android",
      "content":[
        {
          "media_type":"text/plain",
          "text":"出典: フリー百科事典『ウィキペディア（Wikipedia）』 移動先: 案内 、 検索 「 Android 」のその他の用法については「 アンドロイド 」をご覧ください。 Android Android Marshmallowのスクリーンショット 開発元企業 / 開発者 Google オープン・ハンドセット・アライアンス Android オープンソースプロジェクト (AOSP) 開発状況 開発中 ソースモデル FOSS 初リリース 2008年10月21日（7年前） （2008-10-21） 最新安定版リリース Android 6.0 Marshmallow / 2015年10月5日 （51日前） （2015-10-05） 対応プラットフォーム ARM , MIPS , x86 , x64 , Power (非公式) カーネル種別 モノリシックカーネル ライセンス Apache 2.0, GPL v2, LGPLなど ウェブサイト android .com テンプレートを表示 Android （アンドロイド）は、 Google によって スマートフォン や タブレット などの 携帯情報端末 を主なターゲットとして開発された プラットフォーム である。カスタマイズ版 Linuxカーネル 、ライブラリやフレームワークその他の ミドルウェア 、 ART仮想マシン 、主要な アプリケーション からなるソフトウェアスタック（集合）パッケージで構成されている。2015年現在、スマートフォン用のOSとしては、世界シェア1位である。"
        }
      ]
    },
    {
      "id":"9ceffc61-7f30-44b5-b9aa-36cce23abf92",
      "type":"h2",
      "parent_id":"f2f58ec6-3c2a-4b27-a2a7-a3c5783e1323",
      "title":"目次",
      "content":[
        {
          "media_type":"text/plain",
          "text":" [ 非表示 ]  1 概要 2 特徴 2.1 インターフェース 2.2 文字の入力 2.3 アプリケーション 3 構成 3.1 プログラミング言語 3.2 対応CPU 3.3 仮想マシン 3.4 ブートローダー 3.5 開発環境 3.6 Google Mobile Service 3.7 エミュレーション・モデル 4 バージョン 5 シェア 5.1 スマートフォン 5.2 タブレット 5.3 バージョン 6 ライセンス 7 歴史 7.1 2008年 7.2 2009年 7.3 2010年 7.4 2011年 7.5 2012年 7.6 2013年 7.7 2014年 7.8 2015年 8 世界での発売端末 9 セキュリティ 9.1 日本でのセキュリティ 10 組み込み用Android 11 個人情報収集問題 12 システム領域のカスタマイズ 12.1 root化 12.2 ブートローダーのアンロック 12.3 fastbootモード 13 イースターエッグ 14 脚注 15 出典 16 関連項目 17 外部リンク"
        }
      ]
    },
    {
      "id":"a4932d77-0069-42fd-beac-d16f94f385d3",
      "type":"h2",
      "parent_id":"f2f58ec6-3c2a-4b27-a2a7-a3c5783e1323",
      "title":"概要[ 編集]",
      "content":[
        {
          "media_type":"text/plain",
          "text":"2003年 に アンディ・ルービン 、リッチ ・マイナー、ニック・シアーズ、クリス・ホワイトがアメリカ カリフォルニア州 パロアルト に携帯電話向けソフトウェアプラットフォームを開発するAndroid社を設立した。 2005年 にGoogleがAndroid社を買収し、一時はGoogleが「gPhone」という独自の携帯電話端末の開発を進めているという憶測が流れた。 2007年11月5日 携帯電話用ソフトウェアのプラットフォームであるAndroidを、Google、米 クアルコム 、 独 通信キャリアの T-モバイル (T-Mobile International) などが中心となり設立した規格団体 「 Open Handset Alliance 」（オープン・ハンドセット・アライアンス、OHA）が発表した。 無償で誰にでも提供される オープンソース であり、 Apache v2ライセンス で配布される。2008年10月からは対応する携帯電話が多数販売されている。 Androidのロゴには緑色のロボットのキャラクターが使われている。このキャラクターには正式名称はなく、ユーザーによって様々な名前で呼ばれている。日本では「ドロイド君」と称されることが多い。 競合するモバイル向けプラットフォームは、 マイクロソフト の Windows Phone 、 アクセンチュア の Symbian OS 、 クアルコム のBrew MP、 アップル の iOS 、 ブラックベリー の BlackBerry 、 Linux Foundation の Tizen などがある。 Googleは スマートフォン ・ タブレット ・ 腕時計 以外にも ゲーム機 ・ 冷蔵庫 といった領域にもAndroidを搭載させる考えである。"
        }
      ]
    },{
      "id":"2fa00d5e-ae8f-4932-94d7-2c8c3b43d1e0",
      "type":"h2",
      "parent_id":"f2f58ec6-3c2a-4b27-a2a7-a3c5783e1323",
      "title":"特徴[ 編集]",
      "content":[
        {
          "media_type":"text/plain",
          "text":"通知バーは上部から下にスライドして展開する。それぞれの通知をタップすると、それらに最適なアプリが開くようになっている。それぞれの通知を左右にスライドして削除する。 この節では、Android Developers [1] から発表されている標準のAndroidについて記述する。 サードパーティ が独自に追加した機能は含まない。"
        }
      ]
    },
(略)
```

#DCのデータ構造
つまりDCによる出力の構成は、1エントリーあたりこんな感じになる(フィールドの説明はHTMLを食わせた場合の例)。DocやPDFを食わせても、出てくるフィールドは変わらなかった。

```json
{ 
  "id":"ドキュメントID",
  "type":"HTMLのヘッダータグの種類",
  "parent_id":"階層構造になっていたら親タグ",
  "title":"ヘッダータグの中身",
  "content":[ {
    "media_type":"text/plain",
    "text":"本文"
  } ]
}
```

#RRの入力データ構造
一方で、RRが期待するデータ構造はこうだ(RRのチュートリアルのcranfield_solr_config.zipに含まれるschema.xmlの場合)。

```json
{
  "id":"ドキュメントID",
  "title":"ドキュメントのタイトル",
  "author":"著者",
  "bibliography":"文献",
  "body":"本文" 
}
```

このフォーマットはschema.xml次第だが、最低でもidとbodyがあればRRで検索できた。さらにわかりやすくするためにtitleがあってもいいかもしれない。
またこれらの前後に"add"や"doc"、"commit"なども必要である。

#変換の方針
DC→RRの対応は以下のようにやることにする。

```
id　→　id
title → title
text　→　body
```

テキストエディタで置換するではうまく変換できるレベルではないので、変換するツールを作成してみた。JSON→JSONなので、node.jsで書いてローカルで実行することにした。他にいい方法があれば教えて欲しい。

#変換ツールの作成
ということで作ったツールがこちら。
DCの出力を `DC.json` とすると、 `node dc2rr.js DC.json RR.json` と実行することで、RR形式に変換したデータがRR.jsonに出力される仕組み。
ID部分は、「入力ファイル名-連番」としてみた。

```js:dc2rr.js
// 引数チェック
if (process.argv.length != 4){
    console.log("USAGE: node dc2rr <DC.json> <RR.json>");
    return 1;
}

// FileStream
var fs = require('fs');

// ファイルを同期読み込み
var text = fs.readFileSync(process.argv[2], 'utf-8');

// JSONをObjectに変換
var jsondata = JSON.parse(text);

// 1行目出力
fs.writeFileSync(process.argv[3],"{\n");

// 計式変換
var out_text = null;
for (var au in jsondata.answer_units) {
	out_text = "\"add\":{ \"doc\":{ \"id\":\"" + process.argv[2] + "-" + (parseInt(au)+1) + "\", \"title\", \"" + jsondata.answer_units[au].title + "\", \"body\":\"" + jsondata.answer_units[au].content[0].text + "\"}},\n";
	fs.appendFileSync(process.argv[3],out_text);
}

// 最後の2行出力
fs.appendFileSync(process.argv[3],"\"commit\": {}\n");
fs.appendFileSync(process.argv[3],"}\n");

console.log("TOTAL RECODES = " + (parseInt(au)+1));
```

こんな感じに出力される。

```json
{
"add":{ "doc":{ "id":"1", "title", "Android", "body":"出典: フリー百科事典『ウィキペディア（Wikipedia）』 移動先: 案内 、 検索 「 Android 」のその他の用法については「 アンドロイド 」をご覧ください。 Android Android Marshmallowのスクリーンショット 開発元企業 / 開発者 Google オープン・ハンドセット・アライアンス Android オープンソースプロジェクト (AOSP) 開発状況 開発中 ソースモデル FOSS 初リリース 2008年10月21日（7年前） （2008-10-21） 最新安定版リリース Android 6.0 Marshmallow / 2015年10月5日 （51日前） （2015-10-05） 対応プラットフォーム ARM , MIPS , x86 , x64 , Power (非公式) カーネル種別 モノリシックカーネル ライセンス Apache 2.0, GPL v2, LGPLなど ウェブサイト android .com テンプレートを表示 Android （アンドロイド）は、 Google によって スマートフォン や タブレット などの 携帯情報端末 を主なターゲットとして開発された プラットフォーム である。カスタマイズ版 Linuxカーネル 、ライブラリやフレームワークその他の ミドルウェア 、 ART仮想マシン 、主要な アプリケーション からなるソフトウェアスタック（集合）パッケージで構成されている。2015年現在、スマートフォン用のOSとしては、世界シェア1位である。"}},
"add":{ "doc":{ "id":"2", "title", "目次", "body":" [ 非表示 ]  1 概要 2 特徴 2.1 インターフェース 2.2 文字の入力 2.3 アプリケーション 3 構成 3.1 プログラミング言語 3.2 対応CPU 3.3 仮想マシン 3.4 ブートローダー 3.5 開発環境 3.6 Google Mobile Service 3.7 エミュレーション・モデル 4 バージョン 5 シェア 5.1 スマートフォン 5.2 タブレット 5.3 バージョン 6 ライセンス 7 歴史 7.1 2008年 7.2 2009年 7.3 2010年 7.4 2011年 7.5 2012年 7.6 2013年 7.7 2014年 7.8 2015年 8 世界での発売端末 9 セキュリティ 9.1 日本でのセキュリティ 10 組み込み用Android 11 個人情報収集問題 12 システム領域のカスタマイズ 12.1 root化 12.2 ブートローダーのアンロック 12.3 fastbootモード 13 イースターエッグ 14 脚注 15 出典 16 関連項目 17 外部リンク"}},
"add":{ "doc":{ "id":"3", "title", "概要[ 編集]", "body":"2003年 に アンディ・ルービン 、リッチ ・マイナー、ニック・シアーズ、クリス・ホワイトがアメリカ カリフォルニア州 パロアルト に携帯電話向けソフトウェアプラットフォームを開発するAndroid社を設立した。 2005年 にGoogleがAndroid社を買収し、一時はGoogleが「gPhone」という独自の携帯電話端末の開発を進めているという憶測が流れた。 2007年11月5日 携帯電話用ソフトウェアのプラットフォームであるAndroidを、Google、米 クアルコム 、 独 通信キャリアの T-モバイル (T-Mobile International) などが中心となり設立した規格団体 「 Open Handset Alliance 」（オープン・ハンドセット・アライアンス、OHA）が発表した。 無償で誰にでも提供される オープンソース であり、 Apache v2ライセンス で配布される。2008年10月からは対応する携帯電話が多数販売されている。 Androidのロゴには緑色のロボットのキャラクターが使われている。このキャラクターには正式名称はなく、ユーザーによって様々な名前で呼ばれている。日本では「ドロイド君」と称されることが多い。 競合するモバイル向けプラットフォームは、 マイクロソフト の Windows Phone 、 アクセンチュア の Symbian OS 、 クアルコム のBrew MP、 アップル の iOS 、 ブラックベリー の BlackBerry 、 Linux Foundation の Tizen などがある。 Googleは スマートフォン ・ タブレット ・ 腕時計 以外にも ゲーム機 ・ 冷蔵庫 といった領域にもAndroidを搭載させる考えである。"}},
"add":{ "doc":{ "id":"4", "title", "特徴[ 編集]", "body":"通知バーは上部から下にスライドして展開する。それぞれの通知をタップすると、それらに最適なアプリが開くようになっている。それぞれの通知を左右にスライドして削除する。 この節では、Android Developers [1] から発表されている標準のAndroidについて記述する。 サードパーティ が独自に追加した機能は含まない。"}},
(略)
"commit": {}
}
```

あとはこれをRRに回答候補のドキュメントとして入れればよい。

#おわりに
これでRRに入れるデータができたが、今回はもう時間切れ。
次はRRにデータを投入してRankerを作るところとか書きたいところ。