はじめに

  • 本記事では、DUのオリジナル分類器の実装サンプルを紹介します。
  • 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
  • 製品仕様や参考画像は 23.10 バージョンのもので構成しています。
 

オリジナル分類器の実装サンプル

💡なぜ、オリジナル分類器をつくろうとおもったのか?

UiPath Document Understanding では、次の分類器が用意されています↓↓

 

◆1. キーワード分類器(無料)

 

 

◆2. インテリジェントキーワード分類器(コスト:極小)

 

 

◆3. マシンラーニング分類器(コスト:小)

 

 

いずれも、キーワードを手動で設定するか、学習用のドキュメントを読み込ませるだけで利用可能(※)なので、設定作業のハードルは低い。
※3番のマシンラーニング分類器はトレーニングとデプロイが別途必要。
ただ、1番のキーワード分類をのぞき、判定ロジックがブラックボックスで不明なため、期待する精度が得られなかった際のチューニングが難しいケースが出てきます。

 

たとえば、2番と3番はドキュメントを読み込み、単語ベクトルなるものを学習させることで分類精度を上げる訳ですが、決算帳票のサンプルでいえば出現位置の早い「決算短信」などのキーワードのスコアがものすごく高くなり、その他の帳票固有のキーワードが活きないケースが出てきます。
次の決算書でいえば『連結財務諸表』というキーワードで判定できるとよい訳ですが、『財務諸表』を別のドキュメントで管理している場合、財務諸表に分類される確率が高くなります。

 

(例)某自動車メーカー様の決算短信

 

この場合、本来は 『連結財務諸表』というキーワードがきた際は、必ず連結財務諸表に分類する、または 『連結』というキーワードを含む場合は単体の財務諸表では”ない” と判定できるような重みづけができればよいのです。

キーワード分類では実現できないのか?

1つ2つのキーワードで判定できる場合は有効です。
ただ、上の例の様に同じ様なキーワードを多く含むドキュメントを分類するのは難しいでしょう。

 

キーワード分類の 比較仕様が、”完全一致” のため、PDF内のテキストデータの成り立ちやOCRの返却文字列の影響も強く受けてしまいます。
(例)
キーワード分類器に「テスト」を設定
読み取った文字列:テスト → 分類される
PDFから読み取った文字列:テスト実行 → 分類されない
OCRから読み取った文字列:テ ス ト → 分類されない

 

実装サンプル(作り方)

タクソノミーマネジャーを起動し、ドキュメント種類IDを調べます。
値は「ドキュメントの種類名」の隣のボタンからコピーできます。

 

 

設定ファイルを用意します。
CSV形式で、ヘッダーは「DocumentId」「Value」「Score」とします。
先ほどコピーしたドキュメント種類IDを「DocumentId」列に、キーワードの値と重みを「Value」「Score」に指定します。

 

(例)

 

💡ポイント
Score列はDouble型として、マイナスを許容するようにします。
これにより、NGワードの判定を実現します。

 

作成したCSVを読み込む

 

 

入力ドキュメントに含まれていたキーワードを保管するための判定結果テーブルを構築

 

 

キーワードが一致したら判定結果テーブルに行追加
(条件式:ドキュメントテキスト.Contains(CurrentRow.item(1).ToString))

 

 

判定結果(ドキュメント種類IDとスコア)をログ

 

判定結果を格納するテーブル.AsEnumerable().GroupBy(Function(row) row.Field(Of String)("DocumentId")).Select(Function(Group) New With {.DocumentId = Group.Key, .TotalScore = Group.Sum(Function(row) row.Field(Of Double)("Score"))}).OrderByDescending(Function(x) x.TotalScore).First().ToString
 

 

 

(出力例)

 

判定結果(ドキュメント種類ID)の返却

 

判定結果を格納するテーブル.AsEnumerable().GroupBy(Function(row) row.Field(Of String)("DocumentId")).Select(Function(Group) New With {.Key = Group.Key, .TotalScore = Group.Sum(Function(row) row.Field(Of Double)("Score"))}).OrderByDescending(Function(x) x.TotalScore).First().Key
 

 

 

さいごに

いかがでしたでしょうか。
インテリジェントキーワード分類器で期待結果が得られなかった際は、「学習を管理」から単語ベクトルのデータを取得し、ご紹介したオリジナル分類器を作成・試してみるのをお勧めします。
(インテリジェントキーワード分類器で単語ベクトルを手動編集することはできません)

 

 

最後までお読みいただきありがとうございます(・ω・)ノ