情報通信白書を題材に Think 2019 で聞いた Smart Document Understanding を使ってみた

#Think 2019 行ってきた！
2月12日から15日まで、サンフランシスコで開かれていた IBM のイベント、[Think 2019](https://www.ibm.com/ibm/jp/ja/think2019.html) に参加する機会を得ました。下記の方針でセッションを選定し、全部で29セッション聴講しました。

- 今後数年以内に必要になるであろう技術分野
- 日本では聞く機会が少ない（かった）分野

おかげさまで有意義なインプットの機会を得ることができましたので、差しさわりのない範囲でアウトプットしたく思います。この記事から3回連続で Watson Discovery の Smart Document Understanding を試してみます。

約2年と少し前の 2016年11月から、テキストマイニングを行うツール [Watson Explorer](https://www.ibm.com/jp-ja/products/watson-explorer) にかかわってきました。Watson Explorer は、オンプレミス環境にインストールするものです。一方で、[Watson API](https://www.ibm.com/watson/jp-ja/developercloud/services-catalog.html) には、ドキュメント検索に使用できるらしい [Watson Discovery](https://www.ibm.com/watson/jp-ja/developercloud/discovery.html) があります。気になって仕事の合間に少しだけ試してみたのですが使い方がよくわからずそのままになっていました。そこで Think 2019 参加の機会を活用して Watson Discovery に関連するセッションおよびハンズオンに参加しました。下記はその一部です。日時、タイトルの順に記載します。

- 2/12 16:30  Getting Smarter about Document Understanding with IBM Watson Discovery
- 2/13 12:30  Hands-On Lab: Discover Watson Discovery
- 2/14 12:30  Ten Things You Need for IBM Watson AI-Enabled Knowledge Discovery

2/12 および 2/14 のセッションでは、Watson Discovery で2019年2月にリリースされた新機能、[Smart Document Understanding](https://cloud.ibm.com/docs/services/discovery?topic=discovery-sdu#sdu)（略して SDU）の紹介に力を入れていました。SDU は、ドキュメントの中に含まれるヘッダー、フッター、Ｑ＆Ａ、テーブルなどをラベル付けできる機能です。Watson Discovery によるドキュメント分析に期待を持たせる内容でした。 

#素材として使わせていただいたもの
SDU を使うと何ができるのか試すため、総務省の [平成30年版情報通信白書](http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h30/pdf/index.html) の「第6章　ICT政策の動向」を使用することにしました。自分自身にとって身近な分野であること、世の中に広く公開されていて、二次使用の条件が明示されていることからこの情報通信白書を選定しました。
<img width="686" alt="24_soumu1.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/fd8097b7-fcb3-8d2d-3a9e-d2b4d38640f4.png">

<img width="168" alt="25_soumu2.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/321ec347-0aaa-27db-ac02-59730c72afb5.png">

#1つ目の文書を取り込んでみる
すでに Watson Discovery のプロビジョニングは完了しているところから進めます。矢印で示した Upload your own data ボタンを押して、専用のコレクションを作りましょう。
<img width="577" alt="20a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/6ce13845-a15e-1369-6137-b941278154d6.png">

コレクション名および言語を指定します。この例では、それぞれ hakusho および Japanese としました。
<img width="318" alt="21a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/08a70a7f-c4b1-e119-71fc-babd987e43e1.png">

雲のマークが現れました。何も取り込んでいない状態だと、SDU を使用するためのフィールド設定が行えません。少なくとも文書を1つ取り込む必要があります。矢印で示した箇所をクリックして文書を指定しましょう。
<img width="729" alt="22a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/2877804e-873c-c812-09d3-9359c9b41d3f.png">

この例では、第6章第1節「総合戦略の推進」のPDF を指定しました。
<img width="460" alt="23a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/201db8fd-99a7-697d-495c-62df1a32d6b0.png">

取り込み処理中の画像です。
<img width="407" alt="26a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/9e4a6c3f-dd3f-4529-2126-aaf2c8a5ef07.png">

取り込みが完了すると、下記のように表示されます。フィールドを設定するには、この画像の左側にある、Add fields リンクをクリックします。
<img width="888" alt="30a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/6cde150c-e9aa-e2ae-cbcf-494d8b50ab61.png">

##フィールド設定
元の文書と、認識したテキストを対比する画面が表示されます。
<img width="898" alt="31a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/11d5993d-d448-1675-ee1b-36ea83cd1687.png">

文書の上にあるノートみたいな記号をクリックすると、元の文書の上に認識したテキストを重ね合わせて表示することもできます。
<img width="372" alt="32a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/cd3a4f59-6760-429b-d241-e535b4545982.png">

- 余談ですが、その右隣にあるズームイン、ズームアウトの記号は、押しただけでは期待される動作をしません。 @ishida330 さんの [【2019/2月 全面更新!】Watson Discovery Serviceが日本語対応したので、触ってみた【SDUやってみた】編](https://qiita.com/ishida330/items/bb1bd4cf61da9b9c6da2) に「【ご参考】イメージはこうすれば拡大表示できます」というキャプションの動画が掲載されていますので参考にしてみてください。

右向き矢印で示した Field labels を使用して、ラベルを付けます。ラベル付けしたい種類を選択した後、認識されているテキストをクリックしたり、範囲指定したりします。この例では、Field labels のうち、緑色の枠で囲んだ合計5種類のラベルを使用しました。
なお、間違ってラベルを付けた場合は、Field labels の中から text を選んで修正したい箇所をクリックします。作業中のページで行った変更をすべてクリアするには、前述のズームイン、ズームアウトの記号の右横にある、丸で囲まれたＸ印をクリックします。
<img width="714" alt="33a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/3cb309a7-e774-6376-3d33-2bc60bdac81b.png">

なお、ラベルの使い分けは、[SDU についてのドキュメント](https://console.bluemix.net/docs/services/discovery/sdu.html) を参考にしながら下記のようにしてみました。

- 各ページの上部および左右の端にある文言を header 扱い
- 各ページの下部にある注釈、文書名、ページ番号などを footer 扱い
- 章の名前を title 扱い
- 第1節から第10節までの節の名前を subtitle 扱い
- 表形式のデータは table 扱い（詳しくは別の記事に分けます）
- 上記のいずれにも当てはまらないものは text 扱い

ちなみに title と subtitle についてドキュメントには「文書ごとに 1 回のみ使用してください」と書かれています。しかし、実際に試してみると各文書の中で複数回使えてしまいます。エラーチェックはしていないようです。

上記のフィールドのほかには、画像や一覧表の説明（キャプション）フィールドも欲しくなりますね。ライトプランから有償プランにアップグレードすると、カスタム・フィールドが作れるそうです。

さて、1ページ目のラベル付けが完了したら、文書の下の、左向き矢印で示した Submit page ボタンをクリックします。すると1ページ目のラベル付けを学習して次のページに移動します。次のページでは、1ページ目のラベル付けの学習をもとに、すでにある程度ラベル付けが行われた状態でページが表示されます。ラベル付けの過不足を修正します。

以降も同様に最後のページまで進めていきます。最後のページで Submit page ボタンをクリックしたら、画面右上にある Apply changes to collection ボタンを押しましょう。もしほかの文書も取り込み済の場合は、ほかの文書の1ページ目が表示されるようです。ただし、ほかの文書の中のどの文書が選ばれて表示されるのかロジックは不明です。この例では、最初に文書を一つだけ取り込んだ前提で進めます。
<img width="156" alt="40.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/87411473-8937-d2ac-37bd-de2f1353c9b4.png">

次の文書をアップロードするためのダイアログが表示されます。2つ目以降の文書をアップロードします。以降も同様に各文書のページをラベル付けします。
<img width="277" alt="41a.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/e11ee05c-e42d-821e-cc75-4ab403a94c24.png">

- 一番最後の文書を作業した後に表示されるダイアログでは、もうアップロードする文書がありません。Excel で dummy という文字列だけ書いて PDF 形式でエクスポートした dummy.pdf を用意してアップロードしました。
 - 後述の理由で誤解していたので、X印をクリックでOK です。 
- ~~既に取り込みが成功した文書は指定しないようにしました。既に取り込みが成功した文書を指定すると、左メニューの View data schema の Document View で、同一内容の文書が複数存在している、という状態になったことがあります。その状態になるのを避けるためです。~~
 - 2019/03/28 訂正。これは私の早とちりでした。Manage fields タブで Split document on each occurrence of にフィールドを指定すると文書を分割できます。分割した結果、同じ名前の文書が複数存在するようになります。それを見て誤解しました。

文書のラベル付け作業完了後に左のメニューから Manage Data をクリックすると、下記のように表示されます。
<img width="932" alt="42.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/43a29ff7-2ab0-8c81-d406-0c35d7dd825f.png">

10 documents が取り込まれ、1 documents failed と表示されています。参考までに、文書のうち、n6600000.pdf では下記のエラーが出ました。原因は特定できていません。何が原因でエラーが起きたのか自分自身で調査するうまい方法をご存知の方はぜひ教えてください！

- Failed to index the document because of an error processing the output from Smart Document Understanding. Please retry your document. If the problem persists, please contact support.

#エンリッチメントを追加
前述の画面では、画面中央部に enrichments（エンリッチメント）が表示されていました。[エンリッチメント](https://cloud.ibm.com/docs/services/discovery?topic=discovery-configservice&locale=ja#adding-enrichments)は、キーワード、関係、役割を抽出したり、概念をタグ付けしたり、感情分析したりする機能です。デフォルトでは、text としてラベル付けしたフィールド限定でエンリッチメントが行われます。

前述の画面の中央下部にある、Add enrichments リンクをクリックします。Enrich fields タブが表示され、現在の定義が表示されます。エンリッチメント対象を減らすだけなら下向き矢印で示したＸ印をクリックして行えます。増減両方をしたい場合は、右向き矢印で示した Add enrichments リンクをクリックします。
<img width="579" alt="72.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/b29df83c-1046-8ff5-8624-606b360f07ef.png">

ダイアログが表示されます。右向き矢印で示した２か所の Add ボタンを押して、Keyword Extraction（キーワード抽出）および Semantic Role Extraction（意味役割抽出）を追加してみましょう。最後に一番下の Done ボタンをクリックして Enrich fields タブに戻ります。
<img width="352" alt="73.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/1f99a1e7-a2e6-720d-5b55-c6ecc4f8996a.png">

ラベル付けしたことにより、text としてラベル付けしたフィールド以外に対しても個別にエンリッチメントを定義できるようになります。footer としてラベル付けした注釈などに対してエンリッチメントを定義してみましょう。左向き矢印で示した入力欄に footer と入力します。入力し始めても候補を表示してくれません。文字の大小を間違えてもそのまま入力できてしまいます。注意してください。text と footer のそれぞれに対して Add enrichments リンクがクリックできるようになります。
<img width="448" alt="74.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/34cd697f-be59-cdca-9a66-b2cf9c5c4050.png">

footer に対して表示された Add enrichments リンクをクリックしてダイアログを表示させます。右向き矢印で示した２か所にあった Add ボタンを押して、Keyword Extraction（キーワード抽出）および Entity Extraction（エンティティ抽出）を追加します。
<img width="346" alt="75.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/767a254e-d5fb-4d0d-4dc7-1c0bf5b1a37f.png">

エンリッチメントの追加が完了した状態の Enrich fields タブです。右上に右向き矢印で示したボタンを押して反映させます。ファイル・アップロード画面が表示されるので、取り込みに失敗した文書ファイルか、ダミーで用意したファイルを指定するとよいでしょう。この例では、前述の n6600000.pdf かまたは dummy.pdf を指定しました。
<img width="822" alt="76.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/61e60a1f-eecb-e2d3-dd02-a7b6ff72c7d8.png">

#クエリを実行してみる
左側のメニューから Build queries（丸１）を試してみましょう。この例では、右向き矢印（丸２）で候補として表示されたクエリの一部を下向き矢印（丸３）のように変更し実行しました。右側の丸４に組織名エンティティの件数、丸５にクエリ結果が表示されます。丸６で太字で表示された部分を見ると、団体・組織名などの英語名が該当することがわかります。
<img width="920" alt="77.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/23327ef1-4094-204b-6ec2-5c08a68bb94f.png">

下までスクロールすると、他にも該当するものがあることがわかります。そのほか、下向き矢印で示した footer には、URL の中に含まれている internet が該当することがわかります。もし footer というラベル付けをしなかったら、注釈に記載された URL も検索結果に含まれてしまいそうだ、ということがわかりますね。
<img width="274" alt="78.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/4abba718-c9bb-9a2a-4ef5-02153fd50a78.png">
 
ちなみに前述の丸２で候補として表示された一覧がこちらです。このうち、下向き矢印で示した候補を使用しました。この候補は、技術・コンピューター＞インターネット技術カテゴリーに分類された文書の中でトップで出現する People（人）を問い合わせるクエリです。前述の丸３では、People を Organization（組織・団体）に変更しました。
<img width="205" alt="79.png" src="https://qiita-image-store.s3.amazonaws.com/0/27855/e12c6f18-cab5-e9f5-361c-0487d734f218.png">

#まとめ
以上いかがでしたでしょうか。Smart Document Understanding（SDU）を使用すると、文書のなかのタイトル、注釈などを本文から分離して検索したり、本文とは別の種類のエンリッチメントを指定できるようになります。
ぜひいろいろと試してみてください。