Document AI テーブル抽出:ベストプラクティス¶
Document AI を使用すると、単一の値または値のリストの形式でエンティティから情報を抽出したり、指定した列のリストに基づいてテーブルから情報を抽出したりできます。Document AI インターフェースでのテーブル抽出の操作方法については、Document AI モデルビルドのための値の定義 をご参照ください。
このトピックでは、Document AI でテーブル抽出を操作する際のベストプラクティスを提供します。
エンティティ抽出とテーブル抽出の両方に1つのモデルビルドを使用する¶
エンティティ値とテーブル値の両方を抽出するには、モデルビルドの作成時に :ref:` テーブル抽出処理タイプ <label-document_ai_define_values>` を使用します。すべてのテーブルに対して値を定義し、その後、すべてのエンティティをグループ化する追加のテーブルを作成します。列名には、抽出されたエンティティの名前を使用します。結果を改善するにはトレーニングが必要になる場合があります。
特定の種類のドキュメントには1つのモデルビルドを使用する¶
各モデルビルドには同じ種類のドキュメントが含まれている必要があり、抽出するデータはほとんどのテーブルで類似している必要があります。ソースドキュメントの列数がドキュメントごとに異なっていても、すべてのドキュメントに抽出する列のサブセットが定義されており、共通の列の名前と場所が同じか類似している場合は、それらの共通の列を抽出できます。
たとえば、請求書にはさまざまなデータを含む異なる数の列がある場合がありますが、すべてのテーブルに同じ最初の3列がある場合 --- Item Description
、Quantity
、Price
---そのデータを抽出できます。
自然言語を使用して列名を定義する¶
ドキュメントから列名をコピーすると、完全に同じ名前にすることができます。たとえば、列名を product_code
や REPORT_DATE
ではなく、Product Code
や Report Date
にしてください。
レビューの際には、空の行を正しく指定してください¶
モデルから提供された回答をレビューする場合、空の行には各セルで None
ではなく -
を使用してください。各セルに None
を含む行は、トレーニング中にモデルによって無視されます。
ドキュメントに表示される順序で列を定義します¶
精度を改善させるために、ドキュメントに表示されるのと同じ順序で列を定義します。通常、列は左から右、または 転置されたテーブル の場合は上から下になります。順序を異なる方法で定義することを選択した場合は、トレーニングが必要になる可能性があります。
ただし、Invoice Number
や Invoice Date
など、複数の行をグループ化する列の場合は、先頭に列を追加します。例:
Invoice Number
Invoice Date
Item Code
Item Name
Quantity
ドキュメントの大文字と小文字を使用して値を定義する¶
可能であれば、ドキュメントの大文字と小文字を使用して値を定義します。ドキュメント内で大文字と小文字が異なる場合は、大文字を使用します。
必要な場合にのみロケーターフィールドを使用してください¶
ロケーターフィールド はオプションです。ほとんどの場合、入力する必要はありません。ただし、ドキュメントに複数の類似したテーブルがある場合、モデルは不正確な回答をする可能性があります。回答が予想とは異なるソーステーブルから取得される場合は、ロケーターフィールドを使用してみてください。テーブルのタイトルや番号など、モデルが正しいテーブルを識別するのに役立つ情報を追加します。
テーブルのレイアウトを説明するセクション列を追加する¶
テーブルが複数の名前付きセクションに分割されている場合は、セクション列を追加します。これにより、モデルはレイアウトをより適切に理解し、精度を改善させることができます。たとえば、列に Section
、Item section
、または Item category
という名前を付けることができます。セクションに2番目のレベルのネストがある場合は、Section
と Subsection
の2つの列を追加できます。
値をグループ化するには、追加の列を作成します¶
エンティティ抽出とテーブル抽出の両方に1つのモデルビルドを使用する で説明されているように、すべてのエンティティを格納するための追加のテーブルを追加できます。ただし、別のテーブルを作成する代わりに、既存のテーブルに列を追加することもできます。このようにして、ドキュメント全体の結果を1つのテーブルに結合することができます。例:
請求書番号 |
アイテムの詳細 |
アイテム価格 |
数量 |
---|---|---|---|
A |
アイテムA1 |
10.00 |
1 |
A |
アイテムA2 |
20.00 |
1 |
A |
アイテムA3 |
30.00 |
1 |
B |
アイテムB1 |
15.00 |
1 |
B |
アイテムB2 |
25.00 |
1 |
B |
アイテムB3 |
35.00 |
1 |
最初の列の値は、対応するアイテムに対して繰り返されていることに注意してください。
列を追加する場合、またはテーブルが大きい場合は、コストを最適化するために、(エンティティ抽出とテーブル抽出の両方に1つのモデルビルドを使用する セクションで説明されているように)1行の追加テーブルを作成することをSnowflakeは推奨します。
列名をドキュメント間で区別できるようにする¶
列を意味的に区別するようにしてください。col1
、val1
、item1
のような名前は使用しないでください。
特に行名がドキュメント間で相違しないか、わずかに異なり、限られた値の集合内に収まっている場合は、転置の方がうまく機能する場合もあります。
指定された列セットでトレーニングすると、結果が改善する可能性があります。
階層ヘッダーを扱う場合、親名をプレフィックスとして使用します¶
階層ヘッダーを持つテーブルから情報を抽出するには、各親名をプレフィックスとして使用してヘッダーパスを結合します。たとえば、次のテーブルの場合、列を次のように定義します。
Category A Type X Column 1
Category A Type Y Column 2
Category A Type Y Column 3
Category B Column 4
Category B Column 5

必要に応じてテーブルを転置する¶
ドキュメントのテーブルの最初の列の値を出力テーブルの列名として使用することで、転置されたテーブルから情報を抽出することができます。
たとえば、次のテーブルの場合、列に名前を付けます。
Type A: Item 1
Type A: Item 2
Type B: Item 3
Type B: Item 4

この例には、階層ヘッダー が含まれていることに注意してください。
大きなテーブルの場合、ドキュメントを分割します¶
テーブル抽出のモデルでは、最大2048トークンの長さの回答が返されます。これは、モデルがその制限に達すると抽出を停止することを意味します。これには次のような方法でアプローチできます。
テーブルが複数のページにまたがっている場合は、ドキュメントを複数の1ページのドキュメントに分割し、後処理で結果を結合します。
テーブルが密で、1つのページからでもデータを抽出できない場合は、テーブルを列ごとに分割します。
たとえば、テーブルに10列ある場合は、テーブルの左半分の5列と右半分の5列を使用して、2つの別々の値を定義してみてください。最良の結果を得るには、列の選択を試してみる必要がある場合があります。
ドキュメント内で名前のない列に名前を作成する¶
ドキュメントの最初の列に名前がない場合は、値を定義するときに自分でその名前を作成する必要があります。これは次の方法でアプローチできます。
テーブルのタイトルまたはタイトルの重要な部分を使用します。
列内のデータを表すわかりやすい名前を作成します例:
description
、type of asset
、year
、category
。
2つの異なる期間のデータを比較する¶
年間レポートなどの財務ドキュメントで、2023年と2024年など、2つの異なる期間のデータを比較する場合は、列の先頭に「現在」と「前回」を付けることができます。結果を改善するにはトレーニングが必要になる場合があります。