2020年も年の瀬が迫ってまいりました。
Qiita上のIQ Bot関係の記事も100トピックを超えてきましたが、まだまだ、書いたつもりで書いていないトピックがありますねー。
そのひとつが「段組みの表のマッピング」です。
IQ Botは段組みの表でも取得ができる
まずそもそもの話として、IQ Botは段組みの表でも取得ができます。
もちろん、取得には一定の条件があって、めちゃくちゃ複雑な構造の段組みでも無条件にとれるわけではありません。
上記の場合は、
- 明細の1行の高さが常に固定
- 規格・寸法が常に1段目
- 材質が常に2段目
という規則性があり、かつ画質も高めで構造が安定的にとれるので取得可能というわけです。
マッピングのやりかたは?
上記のサンプルを取得するマッピング方法は以下のとおりです。(得意のGIFアニメ!)
こんな表はどうする?
IQ Botが段組みの表を処理できることを知っている程度にはコアにIQ Botを触ってくれているお兄さんから先日、「こんな表もうまくとれますか?」と質問をいただきました。
結論から言うととれます。
ポイントは2つあって、
- 帳票上のラベルの名前に引きずられず、項目の意味を考えよう
- 同じラベルを複数の項目の取得に使いまわしても大丈夫
です。
いっこずつ解説。
1. 帳票上のラベルの名前に引きずられず、項目の意味を考えよう
上記の表なんですが、帳票上のラベル(列名)は「品名」としか書いていないですが、まず気づいてほしいのは「書いてある中身、品名だけじゃないじゃん!」ということです。
「品名」として書いてある表の中に、少なくとも型番、品名、日付の3つの項目が入っています。
なのでそもそもIQ Botのインスタンスを作るときに、上記の3つの中から必要な項目を取得項目として定義しておく必要があるということです。
ここでは、型番と品名と日付をそれぞれ全部取得したい、という前提で以下の解説を進めます。
その場合、型番、品名、日付をすべてインスタンス作成時に取得項目として定義しておく必要があります。
(もちろん作成後に追加してもOKです。)
※すみません、図中では型番を「品番」と表記しています。
2.同じラベルを複数の項目の取得に使いまわしても大丈夫
さて、品番や日付を取得項目に含めたはいいものの、品番と日付にはラベルがありません。
さぁ、どうマッピングしましょうか?
……というときに考えてほしいのは、「仮のラベルを使う」ということです。
「仮のラベル」の考え方については、こちらの記事で解説しています。
仮のラベルの考え方は、フィールド項目だけではなく、テーブル項目にも使えます。
そして、このケースでは「品名」のラベルを「品番」のラベルとしても、「日付」のラベルとしても使いまわします。
そんなわけで、やりかたはこんなかんじです。
注意点
表の抽出時にひとつのラベルを複数の項目に使いまわすやりかたは、OCRがGoogle Visionのときはうまくいかないようです。
まとめ
- IQ Botは段組みの表でも取得ができるよ
- 段組みの表を取得するには一定の条件があるよ(行の高さが固定、画質が安定しているなど)
- 帳票上に記載されたラベルに引きずられず、どんな項目を"出力"するべきかを意識して取得項目を定義しよう
- フィールド項目/テーブル項目ともに、ひとつのラベルを複数の項目のラベルとして使いまわせるよ
- ただし表のラベルを使いまわす方法は、OCRがGoogleVisionのときはうまくいかないよ