【開発Tips】UiPath Document Understanding の抽出・データ操作編

# はじめに

- 本記事では、Document Understanding の抽出器で取得したデータの操作テクニックなどを紹介します。読者の方は Studio 開発の中級者以上を想定しています。前提知識の補足等は記載しないため、初学者の方にはわかりにくいかもしれませんがご容赦ください。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.4 バージョンで構成しています。

# DU開発Tips ~ 抽出・データ操作編 ~

```
# 1）半角スペースの除去
# 2）ズーム率の違いは元画像をサイズ変更
# 3）表示位置の誤差はアンカーで対処
# 4）OCR信頼度の確認
# 5) 特定条件下でのテンプレート分け
```

## 半角スペースの除去

![開発Tips.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3c144821-b506-1d46-126b-4420f589dd29.jpeg)
OCRの日本語読み取りは、CJK-OCRも単語認識がまだできません。***漢字・ひらがな・カタカナ、いずれも1文字ずつ認識して、半角スペース込みで返してきます。***
UiPath ではワークフローの処理の中で値操作が簡単にできるので、アウトプットに対して半角スペースを除去するのは朝飯前なのですが、この***除去するタイミングは人間が確認する前がいい***ですよね。
なので、以下に***検証バリデーションを表示する前に抽出データを操作するテクニック***を記載します↓↓
![開発Tips2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0d2d4e12-45b0-1363-a37a-1f208cb10d11.jpeg)
![開発Tips3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/69f1d4b0-5f50-aa3d-511e-d76a43cc7d02.jpeg)
繰り返し（コレクションの各要素）を配置し、入力に ***「自動抽出結果.ResultsDocument.Fields」*** を指定、データ型に ***「UiPath.DocumentProcessing.Contracts.Results.ResultsDataPoint」*** を指定します。
代入を配置し、左辺に ***「currentItem.Values(0).Value」*** 、右辺に ***「currentItem.Values(0).Value.ToString.Replace(" ","")」*** を指定します。
なお、キャプチャの例では ***「currentItem.FieldName = "自由記述欄"」***　と記述することで半角スペースを除去する項目を絞っています。
![開発Tips.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3c144821-b506-1d46-126b-4420f589dd29.jpeg)
こうするだけで、検証バリデーションに半角スペース除去済みの値を表示することができます。↓↓↓
![開発Tips4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d0d71948-6d67-5de6-47b4-e6e2e2b51d47.jpeg)
![開発Tips5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7da7fd79-8d8d-cacc-6c87-0ca47f187d76.jpeg)

## ズーム率の違いは元画像をサイズ変更

![開発Tips6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/26b8bc0e-edf5-58ab-1da1-845a1bbdf48f.jpeg)
同じドキュメントも、***異なるズーム倍率で画像化された場合、画像データの縦横の Pixel（ピクセル）が変わります。***(上のキャプチャは、「はい」「いいえ」のチェック欄の左斜め下に読み取り領域がズレているのを示す例です。)
フォーム抽出器でカスタム領域を指定した場合、 Pixel ベースの座標データで設定を保持するため、 ***サイズが異なると読み取る位置も変わってしまいます。***
単純にキャプチャする位置が少し違うだけであれば後述のアンカーを指定してあげれば値抽出できますが、表示倍率が違うので、読み取り範囲が大きすぎたり小さすぎるなどの問題が発生します。
そこで、前処理として画像データの縮尺を整えるサンプルコードを以下に↓↓
![開発Tips8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/fbdeb6a9-459f-6ea7-7bbe-d1e811d910d2.png)
引数は「pathImage（文字列型の入力引数）」「thumbnailWidth（整数型の入力引数）」「returnImage（Image型の出力引数）」の3つ用意し、「コードを呼び出し」アクティビティでVBのコードを記述します。
![開発Tips9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a0914366-17fd-c259-9f7f-fc763599b151.png)

```
'画像ファイルを読み込んで、Bitmapオブジェクトを作成
Dim bmp As New Bitmap(pathImage)
'画像の縮尺率を計算
Dim scale = CType(thumbnailWidth / bmp.Width, Double)
Dim w = thumbnailWidth
Dim h = CType(bmp.Height * scale, Integer)
'bmpを任意幅に縮小したBitmapオブジェクトを作成
Dim small As New Bitmap(bmp,w,h)
'出力引数に small を代入
returnImage = small
```

## 表示位置の誤差はアンカーで対処

画像データの場合、起点が上下左右で多少ズレることがありますよね。
***カスタム領域でクリッピング領域を指定する場合、画像サイズや表示位置のズレは考慮されません。***
このため、PDFではない画像データからの読み取りをフォーム抽出器でおこなう場合などは ***アンカー
で設定することをお勧めします。***
![開発Tips11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8aea344e-582c-27ad-e8de-9a17be9cc44a.jpeg)
![開発Tips10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/6e951964-cd9b-9284-8f86-c36f8aecb18d.jpeg)
最初に選択する青枠の領域がターゲットで、次に指定する緑枠の領域がアンカー項目です。Ctrlキーを押しながら複数の文字を選択できます。アンカーが一意となるよう指定しましょう。

## OCR信頼度の確認

![開発Tips12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7ebf0593-447c-779d-60a9-5b8cf09258e7.png)
***「自動抽出結果.Serialize」*** と記述することで、抽出結果から信頼度の情報を出力することができます。
（自動抽出結果.ResultsDocument.Field で繰り返し（コレクションの各要素）＞ ***item.Value(0).Confidence*** からも出力可）
この信頼度（抽出結果の信頼度）は、設定したルールや、UiPath の各抽出器のロジック（公式ガイドで説明がない）が影響するため、どうしても ***信頼度と結果がミスマッチするケース*** は発生します。
このため、抽出器の信頼度（Confidence）をもとにし自動処理は組みにくいのが実情かとおもいますが、 ***「OCRの信頼度」*** についてはルールがシンプルなため利用しやすいのでは？とおもいます。
フィールド名は ***「OcrConfidence」*** です。
 ***「OcrConfidence」*** は事前定義された文字と光学認識文字のマッチング度合いでしかないため、読みやすい一般的な文字であれば信頼度はおよそ 98% を超えてきます。つぶれた文字や特殊文字などで、人間でも読み間違える可能性のある文字だと相応に信頼度が低くなるため、確認対象を選り分ける際の参考値としては有効ではないかと考えます。

::: note
抽出結果の ResultsTableValue クラスの仕様は以下で確認できます。
https://docs.uipath.com/ja/activities/other/latest/document-understanding/229-resultstablevalue-class
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/79252350-f504-7ad8-7fc6-12db99df27f0.png)
:::

## 特定条件下でのテンプレート分け

署名フィールドのオプションをつけても、マシンラーニングでも、何故か期待結果を得られないケースもあるかとおもいます。
期待結果を得られないのが、特定項目やとある条件下だけといったケースであれば、前述の半角スペース除去と同様に ***取得値を確認して抽出方法を変える*** のもご検討ください。
例えば、とある項目だけ☑の結果が毎回期待値と異なる場合、あえて文字列として抽出するフォームを利用しワークフロー内で独自で判定する等。
![開発Tips13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/31cbf479-f758-1bd8-b4e7-2dedecfc6f2d.jpeg)
抽出対象のドキュメント種類は直接指定が可能です。（黄色でマーカーした「ドキュメントの種類のID」を指定）
![開発Tips14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/acd5f2af-e3b4-023d-341d-f6248acd40d5.jpeg)
「ドキュメントの種類のID」は ***タクソノミーマネジャーのドキュメントの種類名の右隣に表示されている値*** です。
![開発Tips15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/79584d51-0311-8454-a585-8051734bfc6c.jpeg)

# おわりに

いかがでしたでしょうか。読んでいただいた方が少しでも使えそうなネタであったなら幸いです。
最新の 23.4 バージョンでは、 ***タクソノミーマネジャーで項目ベースの値チェックも設定できる*** ようになりました(∩´∀｀)∩
下は、OCRが認識した文字は「☑」で、チェック内容が「☒を含む」の例です。
![開発Tips16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/1f8366ca-4848-c308-aeb8-7bffd64607e9.jpeg)
![開発Tips17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8c84b346-db3f-341c-6209-a75d0a30b521.jpeg)
また役に立つかもしれないテクニックをみつけた際は記事書きます。
最後までお読みいただきありがとうございます！