UiPath Document Understanding 第2回 基礎編 分類結果と抽出した結果を検証しよう

# 1. なぜ検証と再学習が必要なの？

前回の記事[UiPath Document Understanding 第1回 基礎編 複数種類のドキュメントからデータ抽出しよう](https://qiita.com/utanesuke/items/8cdcd1276fe248fafea7)では、複数のドキュメントから定義された情報を抽出することができました。
しかし、データの抽出精度が100％であることは保証されていません。そのため、必要に応じて**人間による検証を行い**、**その結果を元に再学習**することで、後続の**分類と抽出のパフォーマンスを向上**させます。

UiPath Document Understandingで提供されている分類器と抽出器の関連アクティビティには、検証したデータに基づいて**自己学習することができるアルゴリズム**があります。**ユーザーは既存のワークフローを更新する必要はありません**。

以下の処理フロー図のように、四つの処理を追加することで、分類結果と抽出した結果の確認・修正・再学習ができます。
- 人間による分類結果の検証
- 分類結果の再学習
- 人間による抽出結果の検証
- 抽出結果の再学習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/461618f5-5bf5-30f1-415e-29a9970279c3.png)

UiPath Document Understanding では、それぞれのアクティビティが用意され、結果の検証及び再学習をすることができます。


# 2. 有人オートメーションでの結果検証

UiPath Document Understanding では、分類ステーションと検証ステーションを利用することで、分類結果の検証と抽出結果の検証ができます。

分類ステーションと検証ステーションを利用する際には、有人オートメーションと無人オートメーションそれぞれの場合で利用するアクティビティが異なります。
それでは、まず有人オートメーションでの検証を確認しましょう！

第一回で作成したワークフローでは、複数のドキュメントを分類して、定義された情報の抽出ができました。
これから前回のワークフロー[DU_Basic_Sample.zip](https://drive.google.com/file/d/1q0qLxxgML3nDJGW5_aByIhjjqPBclKx8/view?usp=share_link)のベースで、分類結果の検証と抽出した結果の検証を追加します。

有人オートメーションの場合には、以下のようなアクティビティが利用されます：
- 分類結果の検証：[分類ステーションを提示] アクティビティ
- 抽出した結果の検証：[検証ステーションを提示] アクティビティ

## 2.1分類結果の検証

前回のワークフローを開いて、以下の手順通りで[分類ステーションを提示] アクティビティの追加と設定をします。

**手順**：

- アクティビティ検索欄に**PresentClassificationStation**を検索します。
- **分類ステーションを提示**アクティビティをドキュメント分類スコープアクティビティの下に配置します。
- **入力設定**：
    - タクソノミー：taxonomy
    - ドキュメント オブジェクトモデル：dom
    - ドキュメント テキスト：strDocumentText
    - ドキュメントパス：CurrentFile.FullName
    - 自動分類結果：classficationResults
- **出力設定**：
    - 検証済みの分類結果：classficationValidatedResults(変数新規作成)

上記の追加と設定をしたら、ワークフローを実行して、実行時にウィンドウ(以下の図)が開き、分類ステーションが表示されます。これにより、ユーザー側からの操作が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/2aab5304-6c50-d306-ecb0-12fd76b7e8d1.png)

人間が確認して、分類が間違っていれば、正しい種類を選択して、保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/d3a947b2-7253-3055-11d0-2b9f215cd706.png)

こちらで人間が修正した分類結果(出力変数の`classficationValidatedResults`)が、次の処理(データ抽出)に利用されます。

:::note info
こちらの分類ステーションで、故意に誤った種類を選択して保存したら、最終的にどんなデータが抽出されるかを確認してみてください。
:::

### データ抽出スコープでの分類結果変更

人間による検証済の分類結果を次の抽出スコープにも反映する必要がありますので、データ抽出スコープ アクティビティでの分類結果を変更します。
- 変更前：自動分類結果の「classficationResults」
- 変更後：検証済みの分類結果の「classficationValidatedResults」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/8a5fc526-6c57-47ff-eedb-d6af8e745ed6.png)


## 2.2 抽出した結果の検証

次は抽出器を通して抽出した結果の検証をします。以下の手順通りで[検証ステーションを提示] アクティビティの追加と設定をします。

**手順**：

- アクティビティ検索欄に**PresentValidationStation**を検索します。
- **検証ステーションを提示**アクティビティをデータ抽出スコープアクティビティの下に配置します。
- **入力設定**：
    - タクソノミー：taxonomy
    - ドキュメント オブジェクトモデル：dom
    - ドキュメント テキスト：strDocumentText
    - ドキュメントパス：CurrentFile.FullName
    - 自動抽出結果：extractionResults
- **出力設定**：
    - 検証済みの抽出結果：extractionValidatedResults(変数新規作成)

上記の追加と設定をしたら、ワークフローを実行して、実行時にウィンドウ(以下の図)が開き、検証ステーションが表示されます。これにより、ユーザー側からの操作が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/7a5c810d-93af-3402-3720-9e1c103375c5.png)


抽出結果を確認して、抽出結果が間違っていれば修正して(例：上記画像での`456200-T231`から `456200-TZE1 `への修正)、送信してください。

こちらで人間が修正した抽出結果(出力変数の`extractionValidatedResults`)が、次の処理(抽出結果をエクスポート)に利用されます。

2.1と2.2を通して、分類結果と抽出した結果両方とも人間によるダブルチェックが完了したため、正しいデータを次の業務システムへ投入していることが保証できます。

ご参考までに、上記のワークフローはこちらの[DU_Basic_Sample_Validation_Attended_第二回.zip](https://drive.google.com/drive/folders/1oaTZ6-FN9mKlX5Ff0jOpl0hmHNDkw3bZ)です。

### 抽出結果をエクスポートでの抽出結果変更

上記の検証済分類結果と同じように、抽出結果をエクスポート アクティビティでの抽出結果を変更します。
- 変更前：自動抽出結果の「extractionResults」
- 変更後：検証済みの抽出結果の「extractionValidatedResults」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/a5083626-dc13-e8d8-715f-a4dae1a9fd8a.png)

# 3. 無人オートメーションでの結果検証

無人オートメーションは人間の監視や操作なしで実行されるオートメーションです。ロボット実行中にユーザーが途中結果の確認と修正ができないので、ロボットによって開始された Action Centerでのタスクを人間が完了することで、有人オートメーションを実現します。

:::note info
Action Centerに関する情報は、[Action Center(人間とロボットのコラボレーション)](https://www.uipath.com/ja/product/action-center)をご参照ください。
:::

Action Centerを利用した検証は、UiPath Automation CloudでのアクションのカタログやOrchestratorでのストレージバケットなども関連しています。
UiPath StudioでのDocument Understanding Processのテンプレートを利用して開発するのが便利ですので、[UiPath Document Understanding 第4回 基礎編 テンプレートを使おう](https://qiita.com/utanesuke/items/c59aaaa96db2f93bc83a)記事で解説しています。

# 4. 分類結果及び抽出結果の再学習

## 4.1 分類結果の再学習

上記の[2.1 分類結果の検証](#21-分類結果の検証)では、自動的な分類結果を人間に提示して、確認・修正の実装を行いました。こちらで、この修正した結果を再学習して、分類結果の精度を高められるように実装します。

まずは分類器トレーニング スコープ アクティビティの追加と設定をします。

**手順**：

- アクティビティ検索欄に**TrainClassifiersScope**を検索します。
- **分類器トレーニング スコープ** アクティビティを分類ステーション アクティビティを提示 の下に配置します。
- **入力設定**：
    - タクソノミー：taxonomy
    - ドキュメント オブジェクトモデル：dom
    - ドキュメント テキスト：strDocumentText
    - ドキュメントパス：CurrentFile.FullName
    - 人間が検証済みの分類データ：classficationValidatedResults

次はスコープに、インテリジェント キーワード分類器トレーナー アクティビティの設定をします。

**手順**：

- アクティビティ検索欄に**IntelligentKeyWordClassifierTrainer**を検索します。
- **インテリジェント キーワード分類器トレーナー** アクティビティを分類器トレーニング スコープ アクティビティの中に配置します。
- **入力設定**：
    - ラーニング ファイルのパス：作成したインテリジェントキーワード分類器jsonファイルのパス(例：[インティジェントキーワード分類器の設定](https://qiita.com/utanesuke/items/8cdcd1276fe248fafea7#-%E3%82%A4%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%AE%E8%A8%AD%E5%AE%9A)での`"DocumentProcessing\classifierLearning.json"`)

最後に分類器を設定します。

**手順**：

- 分類器トレーニング スコープアクティビティの一番下の**分類器を設定**をクリックします。
- 分類器を設定画面に、**インティジェントキーワード分類器トレーナー**をチェックし保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/bff6c1d6-6451-3769-b4d1-8348eab6dc53.png)

## 4.2 分類結果再学習の確認

上記の4.1で分類結果を再学習するために、必要な設定をしました。こちら、実行して再学習の効果を確認します。
Studioの実行ボタンをクリックして、実行します。
- **実行一回目**
一回目の実行で、該当Invoiceの分類信頼度が**73%** です。人間による確認して、これが間違いないので、手動でInvoiceを確認します。人間の確認があったので、信頼度が**100%**になって、下の**送信**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/e5fc1b8d-414c-f6f9-9b33-1cb8dc951195.png)

- **実行二回目**
二回目を実行する際に、信頼度が**73%** から **84%** まで上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/357ffb64-c1e4-aa6e-86ae-d9b14dc2b18f.png)

また、分類器のjsonファイル(`DocumentProcessing\classifierLearning.json`)も比較してみて、トレーニングが発生したら、このファイルの中身も更新されます。

:::note info
**補足**：
現在は自動分類結果の信頼度を見ずに、分類器の検証及び再学習を実施しています。信頼度を考慮して、検証及び再学習を実施するとしたら、分類結果の信頼度情報で判断する必要があります。
例：信頼度が80%以上かの判断が`classficationResults(0).Confidence < 0.8`
:::

## 4.3 抽出結果の再学習

分類結果の再学習と同じように、まずは抽出器トレーニング スコープ アクティビティの追加と設定をします。

**手順**：

- アクティビティ検索欄に**TrainExtractorsScope**を検索します。
- **抽出器トレーニング スコープ** アクティビティを検証ステーションを提示 アクティビティの下に配置します。
- **入力設定**：
    - ドキュメント オブジェクトモデル：dom
    - ドキュメント テキスト：strDocumentText
    - ドキュメントパス：CurrentFile.FullName
    - 人間が検証したデータ：extractionValidatedResults

次はスコープに、マシン ラーニング抽出器トレーナー アクティビティの設定をします。

**手順**：

- アクティビティ検索欄に**MachineLearningExtractorTrainer**を検索します。
- **マシン ラーニング抽出器トレーナー** アクティビティを抽出器トレーニング スコープ アクティビティの中に配置します。
- 表示された**マシン ラーニング抽出器**の**エンドポイント**に、`https://du.uipath.com/ie/invoices`を設定して、**機能を取得**ボタンをクリックします。
- プロジェクトフォルダの**Data**フォルダに、トレーニング済データの保存用フォルダとして**InvoiceTraining**フォルダを作成します。
- **ローカル ストレージ**：
    - 出力フォルダ："Data\InvoiceTraining" (上記作成したトレーニング済みデータ保存用フォルダ)

設定後のマシン ラーニング抽出器トレーナーが下記の通りです：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/ce02d93e-46ce-db01-ade3-2292ebc78158.png)

最後に抽出器を設定します。

**手順**：
- 抽出器トレーニング スコープ アクティビティの一番下の**抽出器を設定**をクリックします。
- 抽出器を設定画面に、Invoiceの**マシンラーニング抽出器トレーナー**をチェックし、以下のように各フィールドも選択して**保存**をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/af845b26-53df-9c31-b8be-a228b8aec35f.png)

## 4.4 抽出結果再学習の確認

上記の4.3で抽出結果を再学習するために、必要な設定をしました。こちら、実行して再学習の効果を確認します。
Studioの実行ボタンをクリックして、実行します。

- **実行一回目**
一回目の実行で、以下の図で示したような信頼度でデータが抽出されました。確認して問題なければチェックをして送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/35b38644-335c-5c2e-42c2-84ed502fe7cf.png)

- **実行二回目**
2回目を実行して、一回目と同じ信頼度でデータが抽出されます。

マシン ラーニング抽出器トレーナーの実行で、`Data\InvoiceTraining`フォルダに以下のようなファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/d8e301a4-f8aa-8a5c-f7a0-47bcd07d94d4.png)
これが収集された人間検証後のデータです。このデータを利用して、マシンラーニングのモデルを再トレーニングします。

### **なぜ二回目抽出の信頼度が上がらなかったのか？**

現在のマシン ラーニング抽出器トレーナーでは、出力フォルダしか設定していないので、再学習用の検証後データを収集しているだけです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/f90dcb1d-3154-8df2-15d4-e70962e30ff2.png" width=360>
マシンラーニング抽出器の信頼度を高めるために、収集したデータをマシンラーニング抽出器でのML モデルを再トレーニングする必要があります。
この再トレーニングを実施するため、UiPath AI Centerを利用する必要があるので、別の記事で解説します。

# 最後に

実装済のサンプルワークフローは[こちら(DU_Basic_Sample_Validation_Training_APIキー消した_2回目_検証済データ)](https://drive.google.com/file/d/1qJ0g4UX3Yx6oVJfKLn3R85CEt7ajss-a/view?usp=drive_link)です。ご参照ください。

#  参考情報

- ドキュメント分類の検証

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

- データ抽出の検証

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


- ドキュメント分類トレーニング関連のアクティビティ

https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/document-classification-training-related-activities

- 抽出器トレーニング スコープ

https://docs.uipath.com/ja/activities/other/latest/user-guide/train-extractors-scope

- データ抽出トレーニングの概要

https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/data-extraction-training-overview

- 優れたパフォーマンスのモデルをトレーニングする

https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/machine-learning-extractor-trainer

- マシン ラーニング抽出器トレーナー

https://docs.uipath.com/ja/activities/other/latest/user-guide/machine-learning-extractor-trainer