Document AI とは何か
Document AI API は、ドキュメント、メールなどの非構造化データを対象に、データを簡単に理解、分析、利用できるようにする、ドキュメント理解ソリューションです。この API はコンテンツ分類、エンティティ抽出、検索オプションなどにより構造を提供します。
このチュートリアルでは、Python で Document AI API を使用する方法について学びます。このチュートリアルでは、シンプルな医療問診票を解析する方法を説明します。
ラボの内容
- Document AI API を有効にする方法
- API リクエストを認証する方法
- Python 用のクライアント ライブラリをインストールする方法
- スキャンされたフォームからデータを解析する方法
必要なもの
アンケート
このチュートリアルをどのように使用されますか?
Python のご利用についてどのように評価されますか?
Google Cloud サービスのご利用についてどのように評価されますか?
セルフペース型の環境設定
- Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します。(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトで一意の名前です。(上記の名前はすでに使用されているため使用できません)。この ID は後で PROJECT_ID
として指定する必要があります。
- 次に、Google Cloud リソースを使用するには、Cloud Console で課金を有効にする必要があります。
「クリーンアップ」セクションの指示に従います。このセクションでは、このチュートリアルでの課金が発生しないように、リソースをシャットダウンする方法について説明します。Google Cloud の新規ユーザーは $300 の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンから リモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする] をクリックします。
まだ Cloud Shell を起動したことがない場合は、その内容を説明する中間画面(スクロールしなければ見えない位置)が表示されます。その場合は、[続行] をクリックします(以後表示されなくなります)。1 回限りの画面は次のようになります。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
Cloud Shell では、クラウドでホストされている仮想マシンにターミナルでアクセスできます。この仮想マシンには、必要な開発ツールがすべて準備されています。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワーク パフォーマンスが充実しており認証もスムーズです。この Codelab での作業のほとんどは、ブラウザまたは Google Chromebook から実行できます。
Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の プロジェクト ID が設定されていることがわかります。
- Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
コマンド出力
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
コマンド出力
[core] project = <PROJECT_ID>
上記のようになっていない場合は、次のコマンドで設定できます。
gcloud config set project <PROJECT_ID>
コマンド出力
Updated property [core/project].
Document AI を使用する前に、API を有効にする必要があります。ブラウザで Cloud Console を開きます。
- ナビゲーション メニュー > [API とサービス] > [ライブラリ] をクリックします。
- 「Document AI API」を検索し、[有効にする] をクリックして Google Cloud プロジェクトで API を使用します
このチュートリアルでは最初に、Document AI Platform で使用する Form Parser プロセッサのインスタンスを作成する必要があります。
- コンソールで [Document AI Platform Overview] に移動します。
- [Create Processor] をクリックし、[Form Parser] を選択します。
- プロセッサ名を指定し、リストからリージョンを選択します。
- [作成] をクリックしてプロセッサを作成します。
- プロセッサ ID をコピーします。これは後でコード内で使用する必要があります。
(省略可)ドキュメントをアップロードして、コンソールでプロセッサをテストできます。[ドキュメントをアップロード] をクリックし、解析するフォームを選択します。このサンプルフォームがない場合は、ダウンロードして使用できます。
出力は次のようになります。
Document AI API にリクエストを送信するには、サービス アカウントを使用する必要があります。サービス アカウントはプロジェクトに属するもので、Google Client Python ライブラリを使用して API リクエストを行います。他のユーザー アカウントと同様に、サービス アカウントはメールアドレスで表されます。このセクションでは、Cloud SDK を使用してサービス アカウントを作成し、サービス アカウントとしての認証に必要な認証情報を作成します。
まず、この Codelab で使用する PROJECT_ID
で環境変数を設定します。
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
次に、以下を使用して、Document AI API にアクセスするための新しいサービス アカウントを作成します。
gcloud iam service-accounts create my-docai-sa \
--display-name "my-docai-service-account"
次に、Python コードで新しいサービス アカウントへのログインに使用する認証情報を作成します。次のコマンドを使用して認証情報を作成し、JSON ファイル「~/key.json」に保存します。
gcloud iam service-accounts keys create ~/key.json \
--iam-account my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
最後に、ライブラリが認証情報を見つけるための GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定します。このフォームの認証について詳しくは、ガイドをご覧ください。次のコマンドを使用して、作成した認証情報の JSON ファイルのフルパスを設定します。
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"
Google Cloud Storage に保存するためのサンプル フォームが用意されています。次のコマンドを使用して、作業ディレクトリにフォームをダウンロードします。
gsutil cp gs://cloud-samples-data/documentai/form.pdf .
次のコマンドを使用して、ファイルが Cloud Shell にダウンロードされていることを確認します。
ls -ltr form.pdf
クライアント ライブラリをインストールする
pip3 install --upgrade google-cloud-documentai pip3 install --upgrade google-cloud-storage
次のように表示されます。
... Installing collected packages: google-cloud-documentai Successfully installed google-cloud-documentai-0.3.0 . . Installing collected packages: google-cloud-storage Successfully installed google-cloud-storage-1.35.0
これで、Document AI API を使用する準備ができました。
インタラクティブ Python を開始する
このチュートリアルでは、IPython というインタラクティブ Python インタープリタを使用します。Cloud Shell で ipython
を実行してセッションを開始します。このコマンドは、インタラクティブ セッションで Python インタープリタを実行します。
ipython
次のように表示されます。
Python 3.7.3 (default, Jul 25 2020, 13:03:44) Type 'copyright', 'credits' or 'license' for more information IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
このステップでは、同期エンドポイントを使用してプロセス ドキュメントの呼び出しを行います。大量のドキュメントを一度に処理する場合は、非同期 API も使用できます。フォーム パーサー API の使用方法について詳しくは、こちらのガイドをご覧ください。
次のコードを iPython セッションにコピーします。
project_id= 'YOUR_PROJECT_ID'
location = 'YOUR_PROJECT_LOCATION' # Format is 'us' or 'eu'
processor_id = 'YOUR_PROCESSOR_ID' # Create processor in Cloud Console
file_path = 'form.pdf' # The local file in your current working directory
from google.cloud import documentai_v1beta3 as documentai
from google.cloud import storage
def process_document(
project_id=project_id, location=location, processor_id=processor_id, file_path=file_path
):
# Instantiates a client
client = documentai.DocumentProcessorServiceClient()
# The full resource name of the processor, e.g.:
# projects/project-id/locations/location/processor/processor-id
# You must create new processors in the Cloud Console first
name = f"projects/{project_id}/locations/{location}/processors/{processor_id}"
with open(file_path, "rb") as image:
image_content = image.read()
# Read the file into memory
document = {"content": image_content, "mime_type": "application/pdf"}
# Configure the process request
request = {"name": name, "document": document}
# Use the Document AI client to process the sample form
result = client.process_document(request=request)
document = result.document
document_text = document.text
print("Document processing complete.")
print("Text: {}".format(document_text))
コードを実行すると、コンソールにテキストが抽出され、出力されるはずです。次のステップでは構造化データを抽出します。これにより、データベースへの保存や他のアプリケーションでの使用が簡単になります。
関数を呼び出す
process_document()
これで、フォームとそれに対応する信頼スコアから Key-Value ペアを抽出できます。Document レスポンス オブジェクトには、入力ドキュメントのページのリストが含まれています。各 page
オブジェクトには、フォーム内のテキスト フィールドとそれらのテキストの位置が含まれています。
次のコードは、各ページを反復処理し、それぞれのキー、値、信頼スコアを抽出して出力します。
processDocument() 関数の一番下に、次のコードを貼り付けます。
document_pages = document.pages
for page in document_pages:
print("Page Number:{}".format(page.page_number))
for form_field in page.form_fields:
fieldName=get_text(form_field.field_name,document)
nameConfidence = round(form_field.field_name.confidence,4)
fieldValue = get_text(form_field.field_value,document)
valueConfidence = round(form_field.field_value.confidence,4)
print(fieldName+fieldValue +" (Confidence Scores: "+str(nameConfidence)+", "+str(valueConfidence)+")")
def get_text(doc_element: dict, document: dict):
"""
Document AI identifies form fields by their offsets
in document text. This function converts offsets
to text snippets.
"""
response = ""
# If a text segment spans several lines, it will
# be stored in different text segments.
for segment in doc_element.text_anchor.text_segments:
start_index = (
int(segment.start_index)
if segment in doc_element.text_anchor.text_segments
else 0
)
end_index = int(segment.end_index)
response += document.text[start_index:end_index]
return response
コードを実行してから、次の関数を呼び出します。
process_document()
サンプル ドキュメントを使用すると、次の出力が表示されます。
Document processing complete.
Page Number:1
Marital Status: Single (Confidence Scores: 1.0000, 1.0000)
DOB: 09/04/1986 (Confidence Scores: 0.9999, 0.9999)
City: Towalo (Confidence Scores: 0.9996, 0.9996)
Address: 24 Barney Lane (Confidence Scores: 0.9994, 0.9994)
Referred By: None (Confidence Scores: 0.9968, 0.9968)
Phone #: (906) 917-3486 (Confidence Scores: 0.9961, 0.9961)
State: NJ (Confidence Scores: 0.9960, 0.9960)
Emergency Contact Phone: (906) 334-8926 (Confidence Scores: 0.9924, 0.9924)
Name: Sally Walker (Confidence Scores: 0.9922, 0.9922)
これで、Document AI API を使用して手書きのフォームからデータを抽出できました。他のフォーム画像も試してみることをおすすめします
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにする手順は次のとおりです。
- Cloud Console で [リソースの管理] ページに移動します。
- プロジェクト リストでプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。