Penguraian Formulir dengan Document AI (Python)

1. Pengantar

Dalam codelab ini, Anda akan mempelajari cara menggunakan Parser Formulir Document AI untuk mengurai formulir tulisan tangan dengan Python.

Kami akan menggunakan formulir asupan medis sederhana sebagai contoh, tetapi prosedur ini akan berfungsi dengan formulir umum apa pun yang didukung oleh DocAI.

Prasyarat

Codelab ini dibangun berdasarkan konten yang disajikan dalam Codelab Document AI lainnya.

Sebaiknya Anda menyelesaikan Codelab berikut sebelum melanjutkan.

Yang akan Anda pelajari

  • Cara mengurai dan mengekstrak data dari formulir hasil pindai menggunakan Parser Form Document AI.

Yang Anda butuhkan

  • Project Google Cloud
  • Browser, seperti Chrome atau Firefox
  • Pengetahuan tentang Python 3

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Codelab ini akan menganggap Anda telah menyelesaikan langkah-langkah penyiapan Document AI yang tercantum di Codelab OCR Document AI.

Harap selesaikan langkah-langkah berikut sebelum melanjutkan:

Anda juga perlu menginstal Pandas, library Analisis Data Open Source untuk Python.

pip3 install --upgrade pandas

3. Membuat prosesor Parser Formulir

Anda harus membuat instance prosesor Form Parser terlebih dahulu untuk digunakan dalam Document AI Platform untuk tutorial ini.

  1. Di console, buka Ringkasan Document AI Platform
  2. Klik Buat Prosesor dan pilih Form ParserProsesor
  3. Tentukan nama prosesor dan pilih region Anda dari daftar.
  4. Klik Buat untuk membuat prosesor
  5. Salin ID prosesor Anda. Anda harus menggunakan ini dalam kode nanti.

Menguji prosesor di Cloud Console

Anda dapat menguji prosesor di konsol dengan mengupload dokumen. Klik Upload Dokumen dan pilih formulir untuk diuraikan. Anda dapat mendownload dan menggunakan formulir contoh ini jika belum memiliki formulir untuk digunakan.

Formulir Kesehatan

Output Anda akan terlihat seperti ini: Formulir yang Diuraikan

4. Mendownload Formulir Contoh

Kami memiliki dokumen sampel yang berisi formulir asupan medis sederhana.

Anda dapat mendownload PDF menggunakan link berikut. Kemudian upload PDF ke instance Cloud Shell.

Atau, Anda dapat mendownloadnya dari Bucket Google Cloud Storage publik kami menggunakan gsutil.

gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/intake-form.pdf .

Pastikan file didownload ke Cloud Shell Anda menggunakan perintah di bawah:

ls -ltr intake-form.pdf

5. Mengekstrak Key-Value Pair Formulir

Pada langkah ini, Anda akan menggunakan API pemrosesan online untuk memanggil prosesor parser formulir yang Anda buat sebelumnya. Kemudian, Anda akan mengekstrak pasangan nilai kunci yang ditemukan dalam dokumen.

Pemrosesan online adalah untuk mengirim satu dokumen dan menunggu responsnya. Anda juga dapat menggunakan batch processing jika ingin mengirim beberapa file atau jika ukuran file melebihi halaman maksimum pemrosesan online. Anda dapat meninjau cara melakukannya di Codelab OCR.

Kode untuk membuat permintaan proses identik untuk setiap jenis prosesor selain ID Prosesor.

Objek respons Dokumen berisi daftar halaman dari dokumen input.

Setiap objek page berisi daftar kolom formulir dan lokasinya dalam teks.

Kode berikut melakukan iterasi di seluruh halaman dan mengekstrak setiap kunci, nilai, dan skor keyakinan. Ini adalah data terstruktur yang lebih mudah disimpan dalam database atau digunakan di aplikasi lain.

Buat file bernama form_parser.py dan gunakan kode di bawah ini.

form_parser.py

import pandas as pd
from google.cloud import documentai_v1 as documentai


def online_process(
    project_id: str,
    location: str,
    processor_id: str,
    file_path: str,
    mime_type: str,
) -> documentai.Document:
    """
    Processes a document using the Document AI Online Processing API.
    """

    opts = {"api_endpoint": f"{location}-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # 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
    resource_name = documentai_client.processor_path(project_id, location, processor_id)

    # Read the file into memory
    with open(file_path, "rb") as image:
        image_content = image.read()

        # Load Binary Data into Document AI RawDocument Object
        raw_document = documentai.RawDocument(
            content=image_content, mime_type=mime_type
        )

        # Configure the process request
        request = documentai.ProcessRequest(
            name=resource_name, raw_document=raw_document
        )

        # Use the Document AI client to process the sample form
        result = documentai_client.process_document(request=request)

        return result.document


def trim_text(text: str):
    """
    Remove extra space characters from text (blank, newline, tab, etc.)
    """
    return text.strip().replace("\n", " ")


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "FORM_PARSER_ID"  # Create processor in Cloud Console

# The local file in your current working directory
FILE_PATH = "intake-form.pdf"
# Refer to https://cloud.google.com/document-ai/docs/processors-list
# for supported file types
MIME_TYPE = "application/pdf"

document = online_process(
    project_id=PROJECT_ID,
    location=LOCATION,
    processor_id=PROCESSOR_ID,
    file_path=FILE_PATH,
    mime_type=MIME_TYPE,
)

names = []
name_confidence = []
values = []
value_confidence = []

for page in document.pages:
    for field in page.form_fields:
        # Get the extracted field names
        names.append(trim_text(field.field_name.text_anchor.content))
        # Confidence - How "sure" the Model is that the text is correct
        name_confidence.append(field.field_name.confidence)

        values.append(trim_text(field.field_value.text_anchor.content))
        value_confidence.append(field.field_value.confidence)

# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
    {
        "Field Name": names,
        "Field Name Confidence": name_confidence,
        "Field Value": values,
        "Field Value Confidence": value_confidence,
    }
)

print(df)

Jalankan kode Anda sekarang dan Anda akan melihat teks yang diekstrak dan dicetak di console.

Anda akan melihat output berikut jika menggunakan dokumen contoh kami:

$ python3 form_parser.py
                                           Field Name  Field Name Confidence                                        Field Value  Field Value Confidence
0                                            Phone #:               0.999982                                     (906) 917-3486                0.999982
1                                  Emergency Contact:               0.999972                                         Eva Walker                0.999972
2                                     Marital Status:               0.999951                                             Single                0.999951
3                                             Gender:               0.999933                                                  F                0.999933
4                                         Occupation:               0.999914                                  Software Engineer                0.999914
5                                        Referred By:               0.999862                                               None                0.999862
6                                               Date:               0.999858                                            9/14/19                0.999858
7                                                DOB:               0.999716                                         09/04/1986                0.999716
8                                            Address:               0.999147                                     24 Barney Lane                0.999147
9                                               City:               0.997718                                             Towaco                0.997718
10                                              Name:               0.997345                                       Sally Walker                0.997345
11                                             State:               0.996944                                                 NJ                0.996944
...

6. Tabel Urai

Parser Formulir juga dapat mengekstrak data dari tabel dalam dokumen. Pada langkah ini, kita akan mendownload dokumen contoh baru dan mengekstrak data dari tabel. Karena kita memuat data ke Pandas, data ini dapat berupa output ke file CSV dan banyak format lainnya dengan satu panggilan metode.

Mendownload Contoh Formulir dengan Tabel

Kami memiliki dokumen contoh yang berisi formulir contoh dan tabel.

Anda dapat mendownload PDF menggunakan link berikut. Kemudian upload PDF ke instance Cloud Shell.

Atau, Anda dapat mendownloadnya dari Bucket Google Cloud Storage publik kami menggunakan gsutil.

gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/form_with_tables.pdf .

Pastikan file didownload ke Cloud Shell Anda menggunakan perintah di bawah:

ls -ltr form_with_tables.pdf

Mengekstrak Data Tabel

Permintaan pemrosesan untuk data tabel sama persis dengan permintaan pemrosesan untuk mengekstrak key-value pair. Perbedaannya adalah kolom tempat kami mengekstrak data dalam respons. Data tabel disimpan di kolom pages[].tables[].

Contoh ini mengekstrak informasi tentang dari baris header tabel dan baris isi untuk setiap tabel dan halaman, lalu mencetak tabel dan menyimpan tabel sebagai file CSV.

Buat file bernama table_parsing.py dan gunakan kode di bawah ini.

table_parsing.py

# type: ignore[1]
"""
Uses Document AI online processing to call a form parser processor
Extracts the tables and data in the document.
"""
from os.path import splitext
from typing import List, Sequence

import pandas as pd
from google.cloud import documentai


def online_process(
    project_id: str,
    location: str,
    processor_id: str,
    file_path: str,
    mime_type: str,
) -> documentai.Document:
    """
    Processes a document using the Document AI Online Processing API.
    """

    opts = {"api_endpoint": f"{location}-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # 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
    resource_name = documentai_client.processor_path(project_id, location, processor_id)

    # Read the file into memory
    with open(file_path, "rb") as image:
        image_content = image.read()

        # Load Binary Data into Document AI RawDocument Object
        raw_document = documentai.RawDocument(
            content=image_content, mime_type=mime_type
        )

        # Configure the process request
        request = documentai.ProcessRequest(
            name=resource_name, raw_document=raw_document
        )

        # Use the Document AI client to process the sample form
        result = documentai_client.process_document(request=request)

        return result.document


def get_table_data(
    rows: Sequence[documentai.Document.Page.Table.TableRow], text: str
) -> List[List[str]]:
    """
    Get Text data from table rows
    """
    all_values: List[List[str]] = []
    for row in rows:
        current_row_values: List[str] = []
        for cell in row.cells:
            current_row_values.append(
                text_anchor_to_text(cell.layout.text_anchor, text)
            )
        all_values.append(current_row_values)
    return all_values


def text_anchor_to_text(text_anchor: documentai.Document.TextAnchor, text: str) -> str:
    """
    Document AI identifies table data by their offsets in the entirety of the
    document's text. This function converts offsets to a string.
    """
    response = ""
    # If a text segment spans several lines, it will
    # be stored in different text segments.
    for segment in text_anchor.text_segments:
        start_index = int(segment.start_index)
        end_index = int(segment.end_index)
        response += text[start_index:end_index]
    return response.strip().replace("\n", " ")


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "FORM_PARSER_ID"  # Create processor before running sample

# The local file in your current working directory
FILE_PATH = "form_with_tables.pdf"
# Refer to https://cloud.google.com/document-ai/docs/file-types
# for supported file types
MIME_TYPE = "application/pdf"

document = online_process(
    project_id=PROJECT_ID,
    location=LOCATION,
    processor_id=PROCESSOR_ID,
    file_path=FILE_PATH,
    mime_type=MIME_TYPE,
)

header_row_values: List[List[str]] = []
body_row_values: List[List[str]] = []

# Input Filename without extension
output_file_prefix = splitext(FILE_PATH)[0]

for page in document.pages:
    for index, table in enumerate(page.tables):
        header_row_values = get_table_data(table.header_rows, document.text)
        body_row_values = get_table_data(table.body_rows, document.text)

        # Create a Pandas Dataframe to print the values in tabular format.
        df = pd.DataFrame(
            data=body_row_values,
            columns=pd.MultiIndex.from_arrays(header_row_values),
        )

        print(f"Page {page.page_number} - Table {index}")
        print(df)

        # Save each table as a CSV file
        output_filename = f"{output_file_prefix}_pg{page.page_number}_tb{index}.csv"
        df.to_csv(output_filename, index=False)

Jalankan kode Anda sekarang dan Anda akan melihat teks yang diekstrak dan dicetak di console.

Anda akan melihat output berikut jika menggunakan dokumen contoh kami:

$ python3 table_parsing.py
Page 1 - Table 0
     Item    Description
0  Item 1  Description 1
1  Item 2  Description 2
2  Item 3  Description 3
Page 1 - Table 1
  Form Number:     12345678
0   Form Date:   2020/10/01
1        Name:   First Last
2     Address:  123 Fake St

Anda juga harus memiliki dua file CSV baru di direktori tempat kode dijalankan.

$ ls
form_with_tables_pg1_tb0.csv form_with_tables_pg1_tb1.csv table_parsing.py

7. Selamat

Selamat, Anda telah berhasil menggunakan Document AI API untuk mengekstrak data dari formulir tulisan tangan. Sebaiknya Anda bereksperimen dengan dokumen formulir lainnya.

Pembersihan

Agar tidak menimbulkan tagihan ke akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini:

  • Di Cloud Console, buka halaman Mengelola resource.
  • Dalam daftar project, pilih project Anda lalu klik Hapus.
  • Pada dialog, ketik project ID, lalu klik Matikan untuk menghapus project.

Pelajari Lebih Lanjut

Lanjutkan belajar tentang Document AI dengan Codelab berikut ini.

Referensi

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.