Prosesor Khusus dengan Document AI (Python)

1. Pengantar

Dalam codelab ini, Anda akan mempelajari cara menggunakan Pemroses Khusus Document AI untuk mengklasifikasi dan mengurai dokumen khusus dengan Python. Untuk klasifikasi dan pemisahan, kita akan menggunakan contoh file PDF yang berisi invoice, tanda terima, dan laporan tagihan utilitas. Kemudian, untuk penguraian dan ekstraksi entity, kita akan menggunakan invoice sebagai contoh.

Prosedur dan contoh kode ini akan cocok dengan dokumen khusus apa pun yang didukung oleh Document AI.

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 mengklasifikasikan dan mengidentifikasi titik pemisahan untuk dokumen khusus.
  • Cara mengekstrak entity berskema menggunakan pemroses khusus.

Yang Anda butuhkan

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

2. Mempersiapkan

Codelab ini akan menganggap Anda telah menyelesaikan langkah-langkah Penyiapan Document AI yang tercantum di Codelab Pengantar.

Harap selesaikan langkah-langkah berikut sebelum melanjutkan:

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

pip3 install --upgrade pandas

3. Membuat pemroses khusus

Pertama-tama, Anda harus membuat instance pemroses yang akan digunakan untuk tutorial ini.

  1. Di konsol, buka Document AI Platform Overview
  2. Klik Create Processor, scroll ke bawah ke Specialized, lalu pilih Procurement Doc Splitter.
  3. Beri nama "codelab-procurement-splitter" (Atau hal lain yang akan Anda ingat) dan pilih region terdekat di daftar.
  4. Klik Create untuk membuat pemroses
  5. Salin ID prosesor. Anda harus menggunakan ini dalam kode nanti.
  6. Ulangi Langkah 2-6 dengan Invoice Parser (yang dapat Anda beri nama "codelab-invoice-parser")

Menguji pemroses di Konsol

Anda dapat menguji Invoice Parser di konsol dengan mengupload dokumen.

Klik Upload Dokumen dan pilih invoice untuk diuraikan. Anda dapat mendownload dan menggunakan contoh invoice ini jika belum memiliki invoice untuk digunakan.

google_invoice.png

Output Anda akan terlihat seperti ini:

InvoiceParser.png

4. Mendownload contoh dokumen

Kami memiliki beberapa contoh dokumen untuk digunakan dalam lab ini.

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

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

gsutil cp gs://cloud-samples-data/documentai/codelabs/specialized-processors/procurement_multi_document.pdf .

gsutil cp gs://cloud-samples-data/documentai/codelabs/specialized-processors/google_invoice.pdf .

5. Mengklasifikasikan & memisahkan dokumen

Pada langkah ini, Anda akan menggunakan API pemrosesan online untuk mengklasifikasikan dan mendeteksi titik pemisahan logis untuk dokumen multi-halaman.

Anda juga dapat menggunakan API batch processing jika ingin mengirim beberapa file atau jika ukuran file melebihi halaman maksimum pemrosesan online. Anda dapat meninjau cara melakukannya di Codelab OCR Document AI.

Kode untuk membuat permintaan API bersifat identik untuk pemroses umum selain ID Pemroses.

Pemisah/Pengklasifikasi Pengadaan

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

Ganti PROCUREMENT_SPLITTER_ID dengan ID untuk Pemroses Pemisah Pengadaan yang Anda buat sebelumnya. Ganti YOUR_PROJECT_ID dan YOUR_PROJECT_LOCATION dengan Project ID Cloud dan Lokasi Pemroses Anda.

classification.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 file:
        file_content = file.read()

    # Load Binary Data into Document AI RawDocument Object
    raw_document = documentai.RawDocument(content=file_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


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

# The local file in your current working directory
FILE_PATH = "procurement_multi_document.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,
)

print("Document processing complete.")

types = []
confidence = []
pages = []

# Each Document.entity is a classification
for entity in document.entities:
    classification = entity.type_
    types.append(classification)
    confidence.append(f"{entity.confidence:.0%}")

    # entity.page_ref contains the pages that match the classification
    pages_list = []
    for page_ref in entity.page_anchor.page_refs:
        pages_list.append(page_ref.page)
    pages.append(pages_list)

# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame({"Classification": types, "Confidence": confidence, "Pages": pages})

print(df)

Output Anda akan terlihat seperti ini:

$ python3 classification.py
Document processing complete.
         Classification Confidence Pages
0     invoice_statement       100%   [0]
1     receipt_statement        98%   [1]
2                 other        81%   [2]
3     utility_statement       100%   [3]
4  restaurant_statement       100%   [4]

Perhatikan bahwa Pemisah/Pengklasifikasi Pengadaan mengidentifikasi jenis dokumen dengan benar di halaman 0-1 dan 3-4.

Halaman 2 berisi formulir penerimaan medis umum, sehingga pengklasifikasi mengidentifikasinya dengan benar sebagai other.

6. Mengekstrak entity

Sekarang Anda dapat mengekstrak entity berskema dari file, termasuk skor keyakinan, properti, dan nilai yang dinormalisasi.

Kode untuk membuat permintaan API sama dengan langkah sebelumnya, dan dapat dilakukan baik dengan permintaan batch maupun online.

Kami akan mengakses informasi berikut dari entity:

  • Jenis Entity
    • (misalnya, invoice_date, receiver_name, total_amount)
  • Nilai Mentah
    • Nilai data seperti yang ditampilkan dalam file dokumen asli.
  • Nilai yang Dinormalisasi
  • Tingkat Keyakinan
    • Tingkat keyakinan terhadap akurasi model.

Beberapa jenis entity, seperti line_item, juga dapat menyertakan properties yang merupakan entity bertingkat seperti line_item/unit_price dan line_item/description.

Contoh ini meratakan struktur bertingkat agar mudah dilihat.

Parser Invoice

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

Ganti INVOICE_PARSER_ID dengan ID untuk Pemroses Parser Invoice yang Anda buat sebelumnya dan gunakan file google_invoice.pdf

extraction.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 file:
        file_content = file.read()

    # Load Binary Data into Document AI RawDocument Object
    raw_document = documentai.RawDocument(content=file_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


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

# The local file in your current working directory
FILE_PATH = "google_invoice.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,
)

types = []
raw_values = []
normalized_values = []
confidence = []

# Grab each key/value pair and their corresponding confidence scores.
for entity in document.entities:
    types.append(entity.type_)
    raw_values.append(entity.mention_text)
    normalized_values.append(entity.normalized_value.text)
    confidence.append(f"{entity.confidence:.0%}")

    # Get Properties (Sub-Entities) with confidence scores
    for prop in entity.properties:
        types.append(prop.type_)
        raw_values.append(prop.mention_text)
        normalized_values.append(prop.normalized_value.text)
        confidence.append(f"{prop.confidence:.0%}")

# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
    {
        "Type": types,
        "Raw Value": raw_values,
        "Normalized Value": normalized_values,
        "Confidence": confidence,
    }
)

print(df)

Output Anda akan terlihat seperti ini:

$ python3 extraction.py
                     Type                                         Raw Value Normalized Value Confidence
0                     vat                                         $1,767.97                        100%
1          vat/tax_amount                                         $1,767.97      1767.97 USD         0%
2            invoice_date                                      Sep 24, 2019       2019-09-24        99%
3                due_date                                      Sep 30, 2019       2019-09-30        99%
4            total_amount                                         19,647.68         19647.68        97%
5        total_tax_amount                                         $1,767.97      1767.97 USD        92%
6              net_amount                                         22,379.39         22379.39        91%
7           receiver_name                                       Jane Smith,                         83%
8              invoice_id                                         23413561D                         67%
9        receiver_address  1600 Amphitheatre Pkway\nMountain View, CA 94043                         66%
10         freight_amount                                           $199.99       199.99 USD        56%
11               currency                                                 $              USD        53%
12          supplier_name                                        John Smith                         19%
13         purchase_order                                         23413561D                          1%
14        receiver_tax_id                                         23413561D                          0%
15          supplier_iban                                         23413561D                          0%
16              line_item                   9.99 12 12 ft HDMI cable 119.88                        100%
17   line_item/unit_price                                              9.99             9.99        90%
18     line_item/quantity                                                12               12        77%
19  line_item/description                                  12 ft HDMI cable                         39%
20       line_item/amount                                            119.88           119.88        92%
21              line_item           12 399.99 27" Computer Monitor 4,799.88                        100%
22     line_item/quantity                                                12               12        80%
23   line_item/unit_price                                            399.99           399.99        91%
24  line_item/description                              27" Computer Monitor                         15%
25       line_item/amount                                          4,799.88          4799.88        94%
26              line_item                Ergonomic Keyboard 12 59.99 719.88                        100%
27  line_item/description                                Ergonomic Keyboard                         32%
28     line_item/quantity                                                12               12        76%
29   line_item/unit_price                                             59.99            59.99        92%
30       line_item/amount                                            719.88           719.88        94%
31              line_item                     Optical mouse 12 19.99 239.88                        100%
32  line_item/description                                     Optical mouse                         26%
33     line_item/quantity                                                12               12        78%
34   line_item/unit_price                                             19.99            19.99        91%
35       line_item/amount                                            239.88           239.88        94%
36              line_item                      Laptop 12 1,299.99 15,599.88                        100%
37  line_item/description                                            Laptop                         83%
38     line_item/quantity                                                12               12        76%
39   line_item/unit_price                                          1,299.99          1299.99        90%
40       line_item/amount                                         15,599.88         15599.88        94%
41              line_item              Misc processing fees 899.99 899.99 1                        100%
42  line_item/description                              Misc processing fees                         22%
43   line_item/unit_price                                            899.99           899.99        91%
44       line_item/amount                                            899.99           899.99        94%
45     line_item/quantity                                                 1                1        63%

7. Opsional: Mencoba pemroses khusus lainnya

Anda berhasil menggunakan Document AI untuk Pembelian guna mengklasifikasi dokumen dan mengurai invoice. Document AI juga mendukung solusi khusus lainnya yang tercantum di sini:

Anda dapat mengikuti prosedur yang sama dan menggunakan kode yang sama untuk menangani pemroses khusus apa pun.

Jika ingin mencoba solusi khusus lainnya, Anda dapat menjalankan kembali lab dengan jenis pemroses dan contoh dokumen khusus lainnya.

Contoh Dokumen

Berikut beberapa contoh dokumen yang dapat Anda gunakan untuk mencoba pemroses khusus lainnya.

Solusi

Jenis Pemroses

Dokumen

Identitas

Parser Surat Izin Mengemudi (SIM) Amerika Serikat

Pinjaman

Pemisah & Pengklasifikasi Pinjaman

Pinjaman

Parser W9

Kontrak

Parser Kontrak

Anda dapat menemukan contoh dokumen dan output pemroses lainnya dalam dokumentasi.

8. Selamat

Selamat, Anda telah berhasil menggunakan Document AI untuk mengklasifikasikan dan mengekstrak data dari dokumen khusus. Sebaiknya Anda bereksperimen dengan jenis dokumen khusus 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.