UiPath Document Understanding 第1回 基礎編 複数種類のドキュメントからデータ抽出しよう

# 1. UiPath Document Understanding って何？

UiPath Document Understandingとは、**様々なドキュメントから情報抽出・解釈するドキュメント処理のフレームワーク(機能群)** です。


以下のように**Document Processing,AI,RPAの三つが重なる部分** にDocument Understandingがあります。

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/eee00be1-c751-280c-ac07-e15fe23dd864.png">

UiPath Document Understandingに関するより詳細な情報、以下の記事をご参照ください。

https://www.uipath.com/ja/product/document-understanding


https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/introduction


# 2. UiPath Document Understanding 処理の流れ

本例では、以下の手順を利用して、一番簡単なUiPath Document Understanding 処理を構築します。

```mermaid
graph LR
  Start([開始])-->1.タクソノミー
　1.タクソノミー-->2.デジタル化
　2.デジタル化-->3.分類
3.分類-->4.抽出
4.抽出-->5.エクスポート
5.エクスポート-->End([終了])
```
上記1-5までの役割は以下の通り。
1. タクソノミー：処理対象ドキュメントのタイプ・フィールドを定義
1. デジタル化：OCRを使用してドキュメントをデジタル化
1. 分類：ファイルをドキュメントタイプに分類
1. 抽出：タクソノミーの定義を元にドキュメントから情報を抽出
1. エクスポート：別プロセスと連携するため、抽出したデータをエクスポート

# 3. ドキュメントからデータ抽出しよう
以下の処理で、２種類(InvoiceとW-9 Form)のPDFファイルから必要な情報をExcelファイルにエクスポートします。PDFサンプルファイルは[**こちら**](https://drive.google.com/drive/folders/1ikN6TFA7mEOVFJ0ALdnKZD3y2uLwyqjI?usp=share_link)からダウンロードしてください。

それでは、手元のUiPath Studioを起動して始めましょう！

:::note info
以下の例で利用しているUiPath StudioがStudio 2023.4.0 Community Editionです。関連アクティビティのUiPath.System.Activitiesが22.10.4のを利用しています。
:::

## 3.1 空のプロセスを作成する

- UiPath Studio を起動します。
- **[ホーム]** の Backstage ビューで **[プロセス]** をクリックして、新しいプロジェクトを作成します。
- **[新しい空のプロセス]** ウィンドウが表示されます。このウィンドウで、新しいプロジェクトの名前を入力します。プロジェクトを簡単に見つけられるように、必要に応じてプロジェクトの説明を追加することもできます。
- **[作成]** をクリックします。新しいプロジェクトが Studio で開きます。

## 3.2 必要なアクティビティ パッケージをインストールする

既定でプロジェクトに追加されるコア アクティビティ パッケージ に加えて、リボンの **[パッケージを管理]** ボタンから、次のアクティビティ パッケージをインストールします。
- UiPath.DocumentUnderstanding.ML.Activities v1.18.0
- UiPath.IntelligentOCR.Activities v6.6.0

必要なパッケージがインストールされたら、DU関連アクティビテやデザインのリボン欄にタクソノミーマネージャーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/3536772f-a596-d278-c610-91d1fa0e61e2.png)

## 3.3 タクソノミー_タイプとフィールド定義

タクソノミーマネージャを使って、請求書のドキュメントタイプを定義します。

**手順**：
- Studio のリボンメニューから **[タクソノミーマネージャー]** をクリックします。
-  **[新しいドキュメントの種類を追加]** をクリックします。
- **[新しい名前]** で名前を入力して、保存します。

本例では、次のInvoiceとW-9 Formの二つドキュメントタイプを定義します。

- ドキュメントの種類名：Invoice の定義

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/d7f015f7-c4a9-fe81-7a31-1a398bad800c.png)

上の図のように、Invoiceから必要な情報を抽出するので、必要なフィールドを定義します。

| No | フィールド名 | 種類 | 列-フィールド名 | 列-種類 |
|:-:|:-:|:-:|:-:|:-:|
|  1 | Company Name  | Name  |   |   |
|  2 |Invoice Number  | Text  |   |   |
|  3 | Date  | Date  |   |   |
|  4 | Items  | Table  |   |   |
|  4.1 |   |   | Description  |Text   |
|  4.2 |   |   | Total  | Number  |
|  5 | Total  | Number  |   |   |


- ドキュメントの種類名：W-9 Form の定義

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/cdf8ebb3-4f0c-50b5-8cb2-f4fd673b6307.png)

上の図のように、W-9 Formから必要な情報を抽出するので、必要なフィールドを定義します。

| No | フィールド名 | 種類 |
|:-:|:-:|:-:|
| 1  | Person Name  | Name  |
| 2 | Business Name  | Name  |
| 3  | Address  | Address  |
| 4  | Signature  | Boolean  |

タクソノミーマネージャーで、２種類のドキュメントの定義が以下のようなイメージです：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/fee96c81-cc8a-d062-bf90-342f761b87db.png)

タクソノミーマネージャーで上記２種類ドキュメントの定義：ドキュメントタイプの定義が完了したら、ワークフローのプロジェクトフォルダ内に、**[DocumentProcessing\taxonomy.json]** の定義ファイルが作成されます。

## 3.4 タクソノミー_タクソノミーを読み込み

次は、先程作成したタクソノミーファイルを利用するため、タクソノミーを読み込みアクティビティをWorkflowに追加します。

**手順**：
- **Main.xaml** を開きます。
- アクティビティ検索欄に **Load Taxonomy**を検索します。
- **タクソノミーを読み込み アクティビティ**を Main.xaml にドロップします。
- **出力設定**：
    - タクソノミー：taxonomy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/a0cf6da1-16c2-3554-73af-1bb0389abd33.png)

## 3.5 デジタル化_OCRエンジンでPDFをデジタル化

デジタル化する必要があるファイルを読み込んでから、OCRエンジンを使って、イメージデータ（JPEG、PDFなど）からデジタルデータを読み出します。

### ① デジタル化するファイルの読み込み

デジタル化する必要があるファイルを読み込みます。

**手順**：
- アクティビティ検索欄に**ForEachFile**を検索します。
- **繰り返し (フォルダー内の各ファイル) アクティビティ**を タクソノミーを読み込みアクティビテの下にドロップします。
- **入力設定**：
    - フォルダ内：デジタル化ファイルの保存フォルダのパス


### ② デジタルデータの読み出し

OCRを使って、イメージデータ（JPEG、PDFなど）からデジタルデータを読み出します。

**手順**：
- アクティビティ検索欄に**Digitalize Document**を検索します。
- **ドキュメントをデジタル化 アクティビティ**を繰り返し (フォルダー内の各ファイル) アクティビテの中にドロップします。
- **入力設定**：
    - PDFにOCRを適用：ApplyOcrOnPdfArgument.Auto
    - ドキュメント パス : CurrentFile.FullName
- **出力設定**：
    - ドキュメント オブジェクト モデル : dom
    - ドキュメント テキスト: strDocumentText


:::note info
ドキュメントをデジタル化アクティビティの詳細は[**ドキュメントをデジタル化**](https://docs.uipath.com/ja/activities/other/latest/user-guide/digitize-document)をご参照ください。
:::

:::note info
**補足：**
処理の進捗を把握するために、メッセージをログアクティビテを利用して、進捗をログに出力するのがおすすめです。
ログメッセージ例：`"ドキュメントのデジタル化処理が開始しました："　+ CurrentFile.Name`
:::

### ③ UiPath ドキュメントOCRの設定

UiPath ドキュメントOCRがドキュメントをデジタル化 アクティビティのデフォルトOCRです。UiPath StudioがUiPath Cloudと接続している場合には、APIキーが自動的設定されます。

エンドポイントに`https://du.uipath.com/ocr`を設定してください。

:::note info
全てのパブリックエンドポイントは[**パブリック エンドポイント**](https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/public-endpoints)をご参照ください。
:::

:::note info
本例では、APIキーをワークフローにハードコーディングしていますが、Orchestratorのアセットに保存するのがおすすめです。
:::

### ④ デジタル化結果の確認

デジタル化した結果を一旦確認してみましょう。

**手順**：
- メッセージボックスアクティビテを利用して、デジタル化した結果のstrDocumentText 変数を出力して確認します。
- 確認したら、メッセージボックスアクティビテを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/3fb9e757-34a0-5c2c-0809-4be2645767d3.png)

## 3.6 分類_ファイルをドキュメントタイプに分類

複数種類のドキュメントが存在する場合には、分類器を利用してドキュメントを分ける必要があります。
<img width="560" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/6bf0ff42-80e4-9404-76b3-15c05f27d3b0.png">


本例では、InvoiceとW-9 Formの２種類のドキュメントがありますので、**今処理しているのはどんなタイプのドキュメントなのか**、ドキュメント分類子（Document Classifier）を使って、ドキュメントを分類する必要があります。

こちらで**インティジェントキーワード分類器**を利用して分類します。

### ① 分類スコープの追加
ドキュメント分類器を追加する前に、ドキュメント分類スコープを追加します。

**手順**：
- アクティビティ検索欄に**Classify Document Scope**を検索します。
- **ドキュメント分類スコープ**をドキュメントをデジタル化の下にドロップします。
- **入力設定**：
    - タクソノミー：taxonomy
    - ドキュメント オブジェクト モデル：dom
    - ドキュメント テキスト：strDocumentText
    - ドキュメントパス：CurrentFile.FullName
- **出力設定**：
    - 分類結果：classficationResults
   
### ② インティジェントキーワード分類器の設定

**手順**：
- アクティビティ検索欄に**Intelligent Keyword**を検索します。
- **インティジェントキーワード分類器**アクティビティをドキュメント分類スコープの中に配置します。

上記 _3.5 デジタル化_OCRエンジンでPDFをデジタル化の③ UiPath ドキュメントOCRの設定_ と同様に、APIキーとエンドポイントが自動的設定されます。

学習したデータを保存するために、`classifierLearning.json`という名前の空ファイルを作成して保存します。保存したら、**インティジェントキーワード分類器**アクティビティの入力を設定します：
- ラーニングファイルのパス：上記`classifierLearning.json`ファイルの保存パス

### ③ ドキュメント分類器の事前学習

ドキュメント分類器の事前学習の設定方法です。

**手順(Invoice)**：
- インティジェントキーワード分類器の**学習を管理**をクリックします。
- Invoiceの**トレーニング開始…** を押して、次に**分類器をトレーニング** のウィンドウが表示さます。
- **トレーニング用に設定されたファイル**にデジタル化必要なファイル(例：Invoice.pdf,Invoice1.pdf)を選択します。
- その以外の設定(エンドポイント、APIキー、タイムアウト、PDFにOCRを適用)が**デフォルトのまま**で変更しません。
- **トレーニングを開始**をクリックします。

**W-9 Form**も上記同様な手順で実施してください。

InvoiceとW-9 Form両方学習ができたら、保存をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/c4f03d0f-23db-92dd-1ce7-f02bbd3fb363.png)

学習が完了したら、先程作成した空ファイルの`classifierLearning.json`に、学習したデータが保存されます。

```json:classifierLearning.json
[{"DocumentKeywordVectors":[{"TotalDocumentLength":1240,"PageCount":1,"FirstPageVector":
{"VectorId":"NoGroup.NoCategory.Invoice_1.FirstPage","DocumentCount":2,"TermsWithScores":
[{"Score":1.45,"Term":"invoice","LastUpdated":"2023-04-02T21:35:36.285069+09:00"},
{"Score":0.93,"Term":"fee","LastUpdated":"2023-04-02T21:35:36.2850732+09:00"},{"省略","省略"}
]
```

### ④ 分類器を設定

分類子スコープの分類子設定はどのドキュメントをどの分類子を使えるかを設定できます。
**手順**：
- ドキュメント分類スコープアクティビティの一番下の**分類器を設定**をクリックします。
- **分類器を設定**画面に、インティジェントキーワード分類器をチェックし保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/ba5a9b87-caf4-038c-7bfb-5c25b5fdef85.png)

:::note info
本例では、インティジェントキーワード分類器の一種類を利用していますが、ドキュメントタイプによって複数の分類器を設定することが可能です。
分類器に関する詳細な説明は[**ドキュメント分類関連のアクティビティ**](https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/document-classification-related-activities)をご参照ください。
:::

## 3.7 抽出_定義した項目の情報の抽出

ドキュメントの分類ができたら、抽出器使って、**タクソノミーマネージャで定義した項目**の情報を抽出します。
**ルールベース抽出器**と**モデルベース抽出器**を組み合わせて、情報を抽出することができます。

### ① データ抽出スコープの追加
抽出器を追加する前に、データ抽出スコープを追加します。

**手順：**
- アクティビティ検索欄に**DataExtraction**を検索します。
- **データ抽出スコープ**アクティビティをドキュメント分類スコープの下にドロップします。
- **入力設定**：
    - タクソノミー：taxonomy
    - ドキュメント オブジェクト モデル：dom
    - ドキュメント テキスト：strDocumentText
    - ドキュメント パス：CurrentFile.FullName
    - 分類結果：classficationResults(0) <sup>補足</sup>
- **出力設定**：
    - 抽出結果：extractionResults

:::note info
補足
`classficationResults`が「ドキュメント分類スコープ」アクティビティの出力です。一つのドキュメントには複数ページが存在されている場合あるので、`classficationResults`が配列型です。
本例でのInvoiceとW-9 Formドキュメントには１ページしかないので、1ページ目の分類結果`classficationResults(0)`を使います。
:::

### ② フォーム抽出器の追加と設定

**手順：**
- アクティビティ検索欄に**FormExtractor**を検索します。
- **フォーム抽出器**アクティビティをデータ抽出スコープの中にドロップします。
- StudioがUiPath AutomationCloudと接続されているので、**エンドポイント**と**API キー**が自動的に設定されます。
- 次は**テンプレートを管理**をクリックして、テンプレートマネージャーのウィンドウが表示されます。
- **テンプレートを作成**をクリックして、次に表示された**テンプレートを作成**で以下のように設定して、**設定**をクリックします：
    - ドキュメントの種類：W-9 Form
    - テンプレート名：W-9
    - テンプレート ドキュメント：W-9 FormのPDFを選択します（例：W9-Form_1.pdf）

次に表示された**テンプレート マネージャー W-9**に、**ページの一致情報**や**定義された情報**の指定を実施します。

- **ページ1の一致情報**の指定と抽出

こちらで、右のW-9 PDFから五つのW-9を特定できる識別情報を指定します。

1. 左側の**ページ1の一致情報**を選択します。
1. `Ctrl`キーを押しながら、右側のPDFから**五つのW-9識別情報を選択**します。
1. 選択が完了したら、左側**ページ1の一致情報**での**✙**をクリックして、値を抽出します。

詳細は以下の画像の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/c40e4575-d3f6-c6f1-c291-a186d64144b7.png)

- **Person Name**の指定と抽出
1. 左側の**Person Name**を選択します。
1. 右側のPDFでPerson Nameのエリアを選択して、**カスタム領域**<sup>参考図</sup>にします。
1. 選択が完了したら、左側**Person Name**での**＋**をクリックして、値を抽出します。

カスタム領域の選択参考図：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/02bc2d48-4c0d-6975-7362-f7e175020e87.png)


**その以外の定義された情報**(Business Name,Address,Signature)も上記のPerson Nameと同様な方法で指定と抽出をして、完了したら、**送信**ボタンをクリックします。

再度**テンプレートマネージャー**画面に戻ったら、以下のを設定して、**閉じる**をクリックします。
- 署名フィールド：Signature

### ③ マシン ラーニング抽出器の追加と設定

**手順：**
- アクティビティ検索欄に**MachineLearningExtractor**を検索します。
- **マシン ラーニング抽出器**アクティビティをデータ抽出スコープの中にドロップします。
- マシン ラーニング抽出器に以下の設定をします。
    - エンドポイント：`https://du.uipath.com/ie/invoices`
- **機能を取得**をクリックします。

:::note info
全てのパブリックエンドポイントは[**パブリック エンドポイント**](https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/public-endpoints)をご参照ください。
:::

### ④ 抽出器を設定

上記の②と③でフォーム抽出器とマシンラーニング抽出器の追加と設定をしましたので、次にどのタイプのドキュメントがどの抽出器を利用するのかを指定します。

**手順：**
- データ抽出スコープの**抽出器を設定**をクリックし、抽出器を設定ダイアログを開きます。
- W-9 Formが**定型のドキュメント**ですので、ルールベースのフォーム抽出器を利用します。**フォーム抽出器**欄での**▢**をチェックします。
- Invoiceが**非定型のドキュメント**ですので、モデルベースのマシンラーニング抽出器を利用します。Invoiceでの各フィールドごとに、マシンラーニング抽出器でのフィールドを指定します。
    - Company Name: name
    - Invoice Number: invoice-no
    - Date: date
    - Items: items
        - Description: description
        - Total: line-amount
    - Total: total
- 最後に、**保存**をします。

参照画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/82aba828-d214-2969-b692-a7ba5181aef3.png)

上記の設定で、invoiceとW-9 Formドキュメントでの定義された情報を抽出して、抽出結果の変数 **extractionResults**に保存しました。

:::note info
抽出器に関する詳細な情報は[**データ抽出の概要**](https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/data-extraction-overview)をご参照ください。
:::

## 3.8 エクスポート_抽出したデータをExcelファイルにエクスポート

ドキュメントから必要な情報だけ抽出しデータをExcelファイルにエクスポートします。後続の処理にシームレスに連携が可能です。

先ずは抽出結果のオブジェクト(extractionResults)を複数の表を含むデータセット(dataset_extractions)にエクスポートします。

**手順：**
- アクティビティ検索欄に**ExportExtractionResults**を検索します。
- **抽出結果をエクスポート***アクティビテをデータ抽出スコープアクティビテの下に配置します。
- **入力設定：**
    - 抽出結果：extractionResults
- **出力設定：**
    - データセット：dataset_extractions

次は、繰り返しでデータセットでの表をExcelファイルに書き込みます。

**手順(繰り返し(コレクションの各要素))：**
- アクティビティ検索欄に**ForEach**を検索します。
- **繰り返し(コレクションの各要素)** アクティビテを抽出結果をエクスポートアクティビテの下に配置します。
- データセットに含まれているのは表ですので、**TypeArgument**を**System.Data.DataTable**に変更します。
- 命名を分かりやすくするため、繰り返し要素名の**currentItem**を**table**に変更します。
- **次のコレクション内の各要素**に変数の**dataset_extractions.Tables**を設定します。

**手順(範囲に書き込み(ワークブック))：**
- 次はアクティビティ検索欄に**WriteRange**を検索します。
- **範囲に書き込み(ワークブック)** アクティビテを繰り返し(コレクションの各要素)の中に配置します。
- **入力設定：**
    - データテーブル：table
    - ブックパス："Extractions\"+CurrentFile.Name + ".xlsx"
- **ターゲット設定：**
    - シート名：table.TableName

## 3.9 実行して結果確認

上記の3.1から3.8までの操作で、複数種類の画像ベースのドキュメントから必要な情報を抽出して、Excelファイルに書き込みできました。
該当ワークフローを実行して、結果を確認しましょう！
実行完了したら、上記のExcel書き込みで設定したフォルダ**Extractions**内に、複数のExcelファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/e25f4534-e804-b5ca-9e48-b690b1f78c76.png)

元のドキュメントInvoice.pdfを開いて、こちらの抽出結果と確認しましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/fda6a82b-435a-9a96-1066-716deee881ac.png)

上記の画像のように、各明細とも正しく抽出できました。

W-9 Formも開いて確認しましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/3ddadcc8-2fac-9cef-7840-ebbfde818563.png)

上記の画像のように、署名ありなしも含めて定義された情報が正しく抽出されました。

これで、一つ簡易なドキュメントから情報抽出のワークフローの構築ができました。

ご参考までに、上記のワークフローは[**こちら**](https://drive.google.com/drive/folders/1oaTZ6-FN9mKlX5Ff0jOpl0hmHNDkw3bZ?usp=sharing)です。

# 4. 検証ステーション

上記3.9での結果確認で、必要な情報が正しく抽出できましたが、全てが正しいとは限らないので、人間による抽出結果の確認・修正になるケースがあります。
UiPath Document Understandingには、検証ステーションの機能が用意され、分類や抽出結果の確認・修正ができます。
- 分類器の検証ステーションを使って、ドキュメントの分類結果を確認・修正します。
- 抽出器の検証ステーションを使って、抽出した情報を確認・修正します。

分類器と抽出器は、それぞれ分類ステーションと検証ステーションで補正・検証されたデータから、再教育することができます。 

検証ステーションの実装方法は[第二回の記事](https://qiita.com/utanesuke/items/95e49a3f21d81c4393a9)で詳しく説明します。

# 5. 参考情報

https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/quickstart-extracting-data-from-receipts

https://www.youtube.com/watch?v=d4qt5UvlZdM