Amazon Web Services ブログ

Amazon Textractによるテーブル抽出機能の強化

(訳者注)Amazon Textract はブログ公開の時点では日本語に対応しておりませんのでご注意ください。

Amazon Textractは、あらゆる文書や画像からテキスト、手書き文字、データを自動的に抽出する機械学習(ML)サービスです。Amazon Textractには、あらゆるドキュメントから表構造を自動的に抽出する機能を提供するAnalyzeDocument API内のTables機能があります。この投稿では、Tables機能に加えられた改良点と、様々な文書からテーブル構造の情報を簡単に抽出する方法について説明します。

財務報告書、給与明細書、分析証明書ファイルなどの文書に含まれる表構造は、多くの場合、情報を容易に解釈できるようにフォーマットされています。また、読みやすく整理しやすいように、テーブルのタイトル、テーブルのフッター、セクションのタイトル、サマリー行などの情報が表構造内に含まれていることもよくあります。今回の機能強化以前では、同様の文書においてAnalyzeDocumentのTables機能はこれらの要素をセルとして識別し、テーブルの境界の外側に存在するタイトルやフッターを抽出しませんでした。そのためこのようなケースでは、それらの情報を識別したり、APIのJSON出力から個別に抽出したりするための後処理の仕組みをカスタムで用意する必要がありました。今回のテーブル機能の強化の発表により、表形式データの様々な側面の抽出がよりシンプルになります。

2023年4月、Amazon Textractは、Tables機能によってドキュメントに存在するタイトル、フッター、セクションタイトル、サマリー行を自動的に検出する機能を導入しました。この投稿では、これらの機能強化について説明し、ドキュメント処理のワークフローで理解し使用するのに役立つ例を紹介します。また、APIを使用し、Amazon Textract Textractorライブラリでレスポンスを処理するコードの例を通して、これらの改良を利用する方法を説明します。

ソリューション概要

次の画像は、更新されたモデルが、ドキュメント内のテーブルだけでなく、すべてのテーブルのヘッダーとフッターも識別していることを示しています。このサンプルの財務報告書には、テーブルのタイトル、フッター、セクションタイトル、サマリーが含まれています。

テーブル機能の強化により、APIレスポンスに4つの新しい要素が追加され、それぞれのテーブル要素を簡単に抽出できるようになり、さらにテーブルの種類を区別する機能も追加されました。

テーブル要素

Amazon Textractは、テーブルセルやマージセルなど、テーブルのいくつかのコンポーネントを識別することができます。Blockオブジェクトとして知られるこれらのコンポーネントは、境界ジオメトリ、関係性、信頼スコアなど、コンポーネントに関連する詳細を内包しています。Blockは、 文書内で互いに近接したピクセル群の中で認識される項目を表します。今回の機能強化で導入された新しいテーブルのBlocksを以下に示します:

  • テーブルのタイトルTABLE_TITLEという新しいBlockタイプが追加され、指定したテーブルのタイトルを識別できるようになりました。タイトルは、1行または複数行にすることができ、通常、テーブルの上にあるか、テーブル内のセルとして埋め込まれています。
  • テーブルのフッターTABLE_FOOTERという新しいBlockタイプが追加され、指定したテーブルのフッターを識別できるようになりました。フッターは、1行または複数行にすることができ、通常、テーブルの下にあるか、テーブル内のセルとして埋め込まれています。
  • セクションタイトルTABLE_SECTION_TITLEという新しいBlockタイプが追加され、検出されたセルがセクションタイトルかどうかを識別できるようになりました。
  • 要約セルTABLE_SUMMARYという新しいBlockタイプが追加され、検出されたセルが給与明細の合計のような要約セルかどうかを識別できるようになりました。

テーブルのタイプ

AmazonTextractは文書内のテーブルを特定すると、そのテーブルの詳細をすべてTABLEというトップレベルのBlockタイプに抽出します。テーブルにはさまざまな形や大きさがあります。たとえば、文書にはテーブルが含まれていることがよくありますが、そのテーブルにはテーブルヘッダーがあることもないこともあります。こうした種類のテーブルを区別しやすくするために、TABLE Blockに2種類の新しいエンティティタイプを追加しました:SEMI_STRUCTURED_TABLESTRUCTURED_TABLEです。これらのエンティティタイプは、構造化テーブルと半構造化テーブルを区別するのに役立ちます。

構造化テーブルとは、明確に定義された列ヘッダを持つテーブルです。しかし半構造化テーブルでは、データは厳密な構造に従っていない場合があります。たとえば、ヘッダーが定義されたテーブルではない表構造のデータです。新しいエンティティタイプは、後処理でどのテーブルを残すか削除するかを柔軟に選択できます。次の画像は、STRUCTURED_TABLESEMI_STRUCTURED_TABLEの例です。

APIの出力を分析する

このセクションでは、Tables機能強化によるAnalyzeDocumentのAPI出力を後処理するために、Amazon Textract Textractorライブラリを使用する方法を探ります。これにより、テーブルから関連する情報を抽出することができます。

Textractorは、Amazon TextractのAPIやユーティリティとシームレスに動作し、APIから返されたJSONレスポンスをプログラム可能なオブジェクトに変換するために作成されたライブラリです。また、ドキュメント上のエンティティを視覚化し、カンマ区切り値(CSV)ファイルなどの形式でデータをエクスポートするために使用することもできます。これは、Amazon Textractのお客様が後処理パイプラインを設定しやすくすることを目的としています。

今回の例では、10-K SECファイリングドキュメントの次のサンプルページを使用しています。

このあと出てくるコードはこちらのGitHubリポジトリで参照できます。このドキュメントを処理するために、Textractorライブラリを利用し、API出力を後処理してデータを可視化するためにインポートしています。

pip install amazon-textract-textractor

最初のステップは、テーブル情報を抽出するために、features=[TextractFeatures.TABLES]パラメータで示される Amazon TextractのテーブルのAnalyzeDocument 機能を呼び出すことです。このメソッドは、リアルタイム(または同期的)にAnalyzeDocument APIを呼び出し、それは単一ページのドキュメントを処理することに注意してください。しかし、非同期StartDocumentAnalysis APIを使えば、複数ページ文書(最大3,000ページ)を処理することができます。

from PIL import Image
from textractor import Textractor
from textractor.visualizers.entitylist import EntityList
from textractor.data.constants import TextractFeatures, Direction, DirectionalFinderType
image = Image.open("sec_filing.png") # Pillowによって文書画像を読み込む
extractor = Textractor(region_name="us-east-1") # textractorクライアントの初期化、必要に応じてリージョンを書き換えてください
document = extractor.analyze_document(
    file_source=image,
    features=[TextractFeatures.TABLES],
    save_image=True
)

このdocumentオブジェクトには、確認可能なドキュメントに関するメタデータが含まれています。ドキュメント内の他のエンティティとともに、ドキュメント内の1つのテーブルを認識していることに注目してください。

This document holds the following data:
Pages - 1
Words - 658
Lines - 122
Key-values - 0
Checkboxes - 0
Tables - 1
Queries - 0
Signatures - 0
Identity Documents - 0
Expense Documents – 0

テーブル情報を含むAPI出力が得られたので、前述したレスポンス構造を使ってテーブルのさまざまな要素を視覚化します。

table = EntityList(document.tables[0])
document.tables[0].visualize()

Textractor ライブラリは、検出されたテーブル内の様々なエンティティを、テーブル要素ごとに異なるカラーコードでハイライトします。各要素をどのように抽出できるか、さらに深く掘り下げてみましょう。次のコードスニペットは、テーブルのタイトルを抽出するデモです。

table_title = table[0].title.text
table_title

'The following table summarizes, by major security type, our cash, cash equivalents, restricted cash, and marketable securities that are measured at fair value on a recurring basis and are categorized using the fair value hierarchy (in millions):'

同様に、以下のコードを使ってテーブルのフッターを抽出することができる。table_footersはリストであることに注意してください。これは、テーブルに関連付けられたフッターが1つ以上存在する可能性があることを意味します。次のコード・スニペットに示すように、出力には3つのフッターが表示されます。

table_footers = table[0].footers
for footers in table_footers:
    print (footers.text)

(1) The related unrealized gain (loss) recorded in "Other income (expense), net" was $(116) million and $1.0 billion in Q3 2021 and Q3 2022, and $6 million and $(11.3) billion for the nine months ended September 30, 2021 and 2022.

(2) We are required to pledge or otherwise restrict a portion of our cash, cash equivalents, and marketable fixed income securities primarily as collateral for real estate, amounts due to third-party sellers in certain jurisdictions, debt, and standby and trade letters of credit. We classify cash, cash equivalents, and marketable fixed income securities with use restrictions of less than twelve months as "Accounts receivable, net and other" and of twelve months or longer as non-current "Other assets" on our consolidated balance sheets. See "Note 4 - Commitments and Contingencies."

(3) Our equity investment in Rivian had a fair value of $15.6 billion and $5.2 billion as of December 31, 2021 and September 30, 2022, respectively. The investment was subject to regulatory sales restrictions resulting in a discount for lack of marketability of approximately $800 million as of December 31, 2021, which expired in Q1 2022.

下流のためのデータ生成

Textractorライブラリは、下流システムや他のワークフローへのテーブルデータの取り込みを簡素化するのにも役立ちます。たとえば、抽出したテーブルデータを、人間が読めるMicrosoftExcelファイルへ書き出すことができます。この記事を書いている時点では、マージされた表をサポートしている形式はこれだけです。

table[0].to_excel(filepath="sec_filing.xlsx")

また、Pandas DataFrameに変換することもできます。DataFrameは、PythonやRなどのプログラミング言語でのデータ操作、分析、可視化によく使われます。

Pythonでは、DataFrameはPandasライブラリの主要なデータ構造です。DataFrameは柔軟で強力であり、データ分析の専門家が様々なデータ分析やMLタスクのために最初に選択することがよくあります。以下のコードスニペットは、抽出されたテーブル情報を1行のコードでDataFrameに変換する方法を示しています。

df=table[0].to_pandas()
df

最後に、テーブルデータをCSVファイルに変換する。CSVファイルは、リレーショナルデータベースやデータウェアハウスにデータを取り込むためによく使われます。以下のコードを見てください。

table[0].to_csv()

',0,1,2,3,4,5\n0,,"December 31, 2021",,September,"30, 2022",\n1,,Total Estimated Fair Value,Cost or Amortized Cost,Gross Unrealized Gains,Gross Unrealized Losses,Total Estimated Fair Value\n2,Cash,"$ 10,942","$ 10,720",$ -,$ -,"$ 10,720"\n3,Level 1 securities:,,,,,\n4,Money market funds,"20,312","16,697",-,-,"16,697"\n5,Equity securities (1)(3),"1,646",,,,"5,988"\n6,Level 2 securities:,,,,,\n7,Foreign government and agency securities,181,141,-,(2),139\n8,U.S. government and agency securities,"4,300","2,301",-,(169),"2,132"\n9,Corporate debt securities,"35,764","20,229",-,(799),"19,430"\n10,Asset-backed securities,"6,738","3,578",-,(191),"3,387"\n11,Other fixed income securities,686,403,-,(22),381\n12,Equity securities (1)(3),"15,740",,,,19\n13,,"$ 96,309","$ 54,069",$ -,"$ (1,183)","$ 58,893"\n14,"Less: Restricted cash, cash equivalents, and marketable securities (2)",(260),,,,(231)\n15,"Total cash, cash equivalents, and marketable securities","$ 96,049",,,,"$ 58,662"\n'</p><h2> </h2>

結論

これらの新しいブロックとエンティティタイプ(TABLE_TITLE, TABLE_FOOTER, STRUCTURED_TABLE, SEMI_STRUCTURED_TABLE, TABLE_SECTION_TITLE, TABLE_FOOTER, TABLE_SUMMARY)の導入は、Amazon Textractによるドキュメントからの表構造の抽出の大きな進歩を意味します。

これらのツールは、構造化されたテーブルと半構造化されたテーブルの両方に対応し、ドキュメント内の位置に関係なく、重要なデータが見落とされないようにする、より繊細で柔軟なアプローチを提供します。

つまり、多様なデータタイプや表構造を、より高い効率性と正確さで扱えるようになったのです。ドキュメント処理のワークフローに自動化の力を取り入れ続ける中で、これらの機能強化が、より合理的なワークフロー、より高い生産性、より洞察力のあるデータ分析への道を開くことは間違いありません。AnalyzeDocumentとTables機能の詳細については、AnalyzeDocumentを参照してください。


翻訳はSolutions Architect 近藤が担当しました。原文はこちらです。