Document AI で手書きフォームをインテリジェントに処理(Python)

c65b9ae04aa1853.png

Document AI とは何か

Document AI API は、ドキュメント、メールなどの非構造化データを対象に、データを簡単に理解、分析、利用できるようにする、ドキュメント理解ソリューションです。この API はコンテンツ分類、エンティティ抽出、検索オプションなどにより構造を提供します。

このチュートリアルでは、Python で Document AI API を使用する方法について学びます。このチュートリアルでは、シンプルな医療問診票を解析する方法を説明します。

ラボの内容

  • Document AI API を有効にする方法
  • API リクエストを認証する方法
  • Python 用のクライアント ライブラリをインストールする方法
  • スキャンされたフォームからデータを解析する方法

必要なもの

  • Google Cloud プロジェクト
  • ブラウザ(ChromeFirefox など)
  • Python 3 に関する知識

アンケート

このチュートリアルをどのように使用されますか?

通読するのみ 通読し、演習を行う

Python のご利用についてどのように評価されますか?

初心者 中級者 上級者

Google Cloud サービスのご利用についてどのように評価されますか?

初心者 中級者 上級者

セルフペース型の環境設定

  1. Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します。(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトで一意の名前です。(上記の名前はすでに使用されているため使用できません)。この ID は後で PROJECT_ID として指定する必要があります。

  1. 次に、Google Cloud リソースを使用するには、Cloud Console で課金を有効にする必要があります。

「クリーンアップ」セクションの指示に従います。このセクションでは、このチュートリアルでの課金が発生しないように、リソースをシャットダウンする方法について説明します。Google Cloud の新規ユーザーは $300 の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンから リモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ をクリックします。

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

まだ Cloud Shell を起動したことがない場合は、その内容を説明する中間画面(スクロールしなければ見えない位置)が表示されます。その場合は、[続行] をクリックします(以後表示されなくなります)。1 回限りの画面は次のようになります。

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Cloud Shell では、クラウドでホストされている仮想マシンにターミナルでアクセスできます。この仮想マシンには、必要な開発ツールがすべて準備されています。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワーク パフォーマンスが充実しており認証もスムーズです。この Codelab での作業のほとんどは、ブラウザまたは Google Chromebook から実行できます。

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の プロジェクト ID が設定されていることがわかります。

  1. 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 を開きます。

  1. ナビゲーション メニュー > [API とサービス] > [ライブラリ] Search API をクリックします。
  2. 「Document AI API」を検索し、[有効にする] をクリックして Google Cloud プロジェクトで API を使用します

このチュートリアルでは最初に、Document AI Platform で使用する Form Parser プロセッサのインスタンスを作成する必要があります。

  1. コンソールで [Document AI Platform Overview] に移動します。
  2. [Create Processor] をクリックし、[Form Parser] を選択しますプロセッサ
  3. プロセッサ名を指定し、リストからリージョンを選択します。
  4. [作成] をクリックしてプロセッサを作成します。
  5. プロセッサ 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 を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。