Pengenalan Karakter Optik (OCR) dengan Document AI (Python)

1. Ringkasan

Apa itu Document AI?

Document AI adalah solusi pemahaman dokumen yang mengambil data tidak terstruktur (misalnya dokumen, email, invoice, formulir, dll.) kemudian membuat data tersebut lebih mudah dipahami, dianalisis, dan digunakan. API ini menyediakan struktur melalui klasifikasi konten, ekstraksi entitas, penelusuran lanjutan, dan lainnya.

Di lab ini, Anda akan mempelajari cara melakukan Pengenalan Karakter Optik menggunakan Document AI API dengan Python.

Kita akan menggunakan file PDF dari novel klasik "Winnie the Pooh" karya A.A. Milne, yang baru-baru ini menjadi bagian Domain Publik di Amerika Serikat. File ini dipindai dan didigitalkan oleh Google Buku.

Yang akan Anda pelajari

  • Cara mengaktifkan Document AI API
  • Cara mengautentikasi permintaan API
  • Cara menginstal library klien untuk Python
  • Cara menggunakan API batch processing dan pemrosesan online
  • Cara mengurai teks dari file PDF

Yang akan Anda butuhkan

  • Project Google Cloud
  • Browser, seperti Chrome atau Firefox
  • Kemampuan menggunakan Python (3.9+)

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

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console lalu buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.)

Pilih Project

Project Baru

Dapatkan Project ID

Ingat Project ID tersebut, yang merupakan nama unik di semua project Google Cloud. (Maaf, Project ID di atas telah digunakan dan tidak akan berfungsi untuk Anda). Anda harus memberikan ID ini nanti sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Pastikan untuk mengikuti petunjuk di bagian "Membersihkan". Bagian ini memberi tahu Anda cara mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis seharga $300 USD.

Mulai Cloud Shell

Saat menggunakan Google Cloud, Anda dapat mengoperasikannya dari jarak jauh menggunakan laptop, codelab ini menggunakan Google Cloud Shell, lingkungan command line yang dijalankan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Activate Cloud Shell Mengaktifkan Cloud Shell

Mengaktifkan Cloud Shell

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika memang demikian, klik Continue (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

Pengantar Cloud Shell

Hanya perlu waktu sebentar saja untuk melakukan penyediaan dan terhubung ke Cloud Shell. Cloud Shell

Cloud Shell memberi Anda akses terminal ke virtual machine yang dihosting di cloud. Mesin virtual ini mencakup semua alat pengembangan yang akan Anda perlukan. VM ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke Project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*      <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Mengaktifkan Document AI API

Sebelum dapat mulai menggunakan Document AI, Anda harus mengaktifkan API. Anda dapat melakukannya menggunakan antarmuka command line gcloud atau Konsol Cloud.

Menggunakan CLI gcloud

  1. Jika Anda tidak menggunakan Cloud Shell, ikuti langkah-langkah di bagian Menginstal gcloud CLI di komputer lokal Anda.
  2. API ini dapat diaktifkan menggunakan perintah gcloud berikut.
gcloud services enable documentai.googleapis.com storage.googleapis.com

Anda akan melihat sesuatu seperti ini:

Operation "operations/..." finished successfully.

Menggunakan Cloud Console

Buka Cloud Console di browser Anda.

  1. Dengan menggunakan Kotak Penelusuran di bagian atas konsol, cari "Document AI API", lalu klik Enable untuk menggunakan API di project Google Cloud Anda

Telusuri API

  1. Ulangi langkah sebelumnya untuk Google Cloud Storage API.

Sekarang, Anda dapat menggunakan Document AI.

4. Membuat dan Menguji Prosesor

Pertama-tama, Anda harus membuat instance prosesor OCR Dokumen yang akan melakukan ekstraksi. Hal ini dapat dilakukan menggunakan Konsol Cloud atau Processor Management API.

Konsol Cloud

  1. Di konsole, buka Document AI Platform OverviewKonsol Ringkasan Document AI
  2. Klik Explore Processors dan pilih Document OCRProsesor
  3. Beri nama codelab-ocr (Atau hal lain yang akan Anda ingat) dan pilih region terdekat di daftar.
  4. Klik Create untuk membuat prosesor
  5. Salin ID Prosesor Anda. Anda harus menggunakannya dalam kode nanti. ID Prosesor

Anda dapat menguji prosesor di konsol dengan mengupload dokumen. Klik Upload Test Document dan pilih dokumen untuk diurai.

Anda dapat mendownload file PDF di bawah ini, yang berisi 3 halaman pertama novel kita.

Judul Halaman

Output Anda akan terlihat seperti ini: Buku Hasil Penguraian

Library Klien Phyton

Ikuti codelab ini untuk mempelajari cara mengelola prosesor Document AI dengan Library Klien Python:

Mengelola prosesor Document AI dengan Python - Codelab

5. Melakukan Autentikasi permintaan API

Untuk membuat permintaan ke Document AI API, Anda harus menggunakan Akun Layanan. Akun Layanan merupakan milik project Anda dan digunakan oleh library Klien Python untuk membuat permintaan API. Seperti akun pengguna lainnya, akun layanan diwakili oleh alamat email. Di bagian ini, Anda akan menggunakan Cloud SDK untuk membuat akun layanan, lalu membuat kredensial yang diperlukan untuk melakukan autentikasi sebagai akun layanan.

Pertama, buka Cloud Shell dan tetapkan variabel lingkungan dengan PROJECT_ID Anda yang akan digunakan di seluruh codelab ini:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

Selanjutnya, buat akun layanan baru untuk mengakses Document AI API menggunakan:

gcloud iam service-accounts create my-docai-sa \
  --display-name "my-docai-service-account"

Selanjutnya, beri akun layanan Anda izin untuk mengakses Document AI dan Cloud Storage di project Anda.

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/documentai.admin"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/storage.admin"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/serviceusage.serviceUsageConsumer"

Selanjutnya, buat kredensial yang digunakan kode Python Anda untuk login sebagai akun layanan baru. Buat kredensial ini dan simpan sebagai ~/key.json file JSON menggunakan perintah berikut:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account  my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

Terakhir, tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS, yang digunakan library untuk menemukan kredensial Anda. Untuk mempelajari info selengkapnya tentang jenis autentikasi ini, baca panduan. Variabel lingkungan harus ditetapkan ke jalur lengkap file JSON kredensial yang Anda buat menggunakan:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

6. Menginstal library klien

Instal library klien Python untuk Document AI, Cloud Storage, dan Toolbox Document AI:

pip3 install --upgrade google-cloud-documentai
pip3 install --upgrade google-cloud-storage
pip3 install --upgrade google-cloud-documentai-toolbox

Anda akan melihat sesuatu seperti ini:

...
Installing collected packages: google-cloud-documentai
Successfully installed google-cloud-documentai-2.15.0
.
.
Installing collected packages: google-cloud-storage
Successfully installed google-cloud-storage-2.9.0
.
.
Installing collected packages: google-cloud-documentai-toolbox
Successfully installed google-cloud-documentai-toolbox-0.6.0a0

Sekarang, Anda siap untuk menggunakan Document AI API.

7. Mendownload PDF Sampel

Kami memiliki dokumen sampel yang berisi 3 halaman pertama novel yang kita gunakan ini.

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

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

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh_3_Pages.pdf .

8. Membuat Permintaan Pemrosesan Online

Pada langkah ini, Anda akan memproses 3 halaman pertama novel menggunakan API pemrosesan online (sinkron). Metode ini paling cocok untuk dokumen kecil yang disimpan secara lokal. Lihat daftar lengkap prosesor untuk mengetahui halaman maksimum dan ukuran file untuk setiap jenis prosesor.

Gunakan Cloud Shell Editor atau editor teks di mesin lokal Anda untuk membuat file bernama online_processing.py dan gunakan kode di bawah ini.

Ganti YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_ID, dan FILE_PATH dengan nilai yang sesuai untuk lingkungan Anda.

online_processing.py

from google.api_core.client_options import ClientOptions
from google.cloud import documentai


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

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

# Instantiates a client
docai_client = documentai.DocumentProcessorServiceClient(
    client_options=ClientOptions(api_endpoint=f"{LOCATION}-documentai.googleapis.com")
)

# 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 = docai_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 = docai_client.process_document(request=request)

document_object = result.document
print("Document processing complete.")
print(f"Text: {document_object.text}")

Jalankan kode, yang akan mengekstrak teks dan mencetaknya ke konsol.

Anda akan melihat output berikut jika menggunakan dokumen contoh kami:

Document processing complete.
Text: CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
Here is Edward Bear, coming
downstairs now, bump, bump, bump, on the back
of his head, behind Christopher Robin. It is, as far
as he knows, the only way of coming downstairs,
but sometimes he feels that there really is another
way, if only he could stop bumping for a moment
and think of it. And then he feels that perhaps there
isn't. Anyhow, here he is at the bottom, and ready
to be introduced to you. Winnie-the-Pooh.
When I first heard his name, I said, just as you
are going to say, "But I thought he was a boy?"
"So did I," said Christopher Robin.
"Then you can't call him Winnie?"
"I don't."
"But you said "

...

Digitized by
Google

9. Membuat Permintaan Batch Processing

Sekarang, misalkan Anda ingin membaca teks dari seluruh novel.

  • Pemrosesan Online memiliki batasan jumlah halaman dan ukuran file yang dapat dikirim dan hanya mengizinkan satu file dokumen per panggilan API.
  • Batch Processing dapat dilakukan untuk melakukan pemrosesan file yang lebih besar/banyak dalam metode asinkron.

Pada langkah ini, kami akan memproses seluruh novel "Winnie the Pooh" dengan Document AI Batch Processing API dan menampilkan teks ke dalam Bucket Google Cloud Storage.

Batch processing menggunakan Operasi yang Berjalan Lama untuk mengelola permintaan secara asinkron. Jadi, kita harus membuat permintaan dan mengambil output dengan cara yang berbeda dari pemrosesan online. Namun, outputnya akan memiliki format objek Document yang sama, baik menggunakan pemrosesan online atau batch processing.

Langkah ini menunjukkan cara menyediakan dokumen khusus untuk diproses oleh Document AI. Langkah berikutnya akan menunjukkan cara memproses seluruh direktori dokumen.

Mengupload PDF ke Cloud Storage

Metode batch_process_documents() saat ini menerima file dari Google Cloud Storage. Anda dapat merujuk documentai_v1.types.BatchProcessRequest untuk mengetahui informasi lebih lanjut tentang struktur objek.

Untuk contoh ini, Anda dapat membaca file langsung dari bucket sampel kami.

Anda juga dapat menyalin file ke dalam bucket Anda sendiri menggunakan gsutil...

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf gs://YOUR_BUCKET_NAME/

...atau Anda dapat mendownload file sampel novel dari link di bawah dan menguploadnya ke bucket Anda sendiri.

Anda juga memerlukan Bucket GCS untuk menyimpan output API.

Anda dapat mengikuti Dokumentasi Cloud Storage untuk mempelajari cara membuat bucket penyimpanan.

Menggunakan metode batch_process_documents()

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

Ganti YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URI dan YOUR_OUTPUT_URI dengan nilai yang sesuai untuk lingkungan Anda.

Pastikan YOUR_INPUT_URI mengarah langsung ke file pdf tersebut, misalnya: gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf.

batch_processing.py

"""
Makes a Batch Processing Request to Document AI
"""

import re

from google.api_core.client_options import ClientOptions
from google.api_core.exceptions import InternalServerError
from google.api_core.exceptions import RetryError
from google.cloud import documentai
from google.cloud import storage

# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION"  # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID"  # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI"  # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
    "YOUR_PROCESSOR_VERSION_ID"  # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)

# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI"  # Format: `gs://bucket/directory/file.pdf` or `gs://bucket/directory/`
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber"  # Optional. The fields to return in the Document object.


def batch_process_documents(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    gcs_output_uri: str,
    processor_version_id: str = None,
    input_mime_type: str = None,
    field_mask: str = None,
    timeout: int = 400,
):
    # You must set the api_endpoint if you use a location other than "us".
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")

    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
        # Specify specific GCS URIs to process individual documents
        gcs_document = documentai.GcsDocument(
            gcs_uri=gcs_input_uri, mime_type=input_mime_type
        )
        # Load GCS Input URI into a List of document files
        gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
        input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
    else:
        # Specify a GCS URI Prefix to process an entire directory
        gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
        input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)

    # Cloud Storage URI for the Output Directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri, field_mask=field_mask
    )

    # Where to write results
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    if processor_version_id:
        # The full resource name of the processor version, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version_id
        )
    else:
        # The full resource name of the processor, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}
        name = client.processor_path(project_id, location, processor_id)

    request = documentai.BatchProcessRequest(
        name=name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # BatchProcess returns a Long Running Operation (LRO)
    operation = client.batch_process_documents(request)

    # Continually polls the operation until it is complete.
    # This could take some time for larger files
    # Format: projects/{project_id}/locations/{location}/operations/{operation_id}
    try:
        print(f"Waiting for operation {operation.operation.name} to complete...")
        operation.result(timeout=timeout)
    # Catch exception when operation doesn"t finish before timeout
    except (RetryError, InternalServerError) as e:
        print(e.message)

    # NOTE: Can also use callbacks for asynchronous processing
    #
    # def my_callback(future):
    #   result = future.result()
    #
    # operation.add_done_callback(my_callback)

    # Once the operation is complete,
    # get output document information from operation metadata
    metadata = documentai.BatchProcessMetadata(operation.metadata)

    if metadata.state != documentai.BatchProcessMetadata.State.SUCCEEDED:
        raise ValueError(f"Batch Process Failed: {metadata.state_message}")

    storage_client = storage.Client()

    print("Output files:")
    # One process per Input Document
    for process in list(metadata.individual_process_statuses):
        # output_gcs_destination format: gs://BUCKET/PREFIX/OPERATION_NUMBER/INPUT_FILE_NUMBER/
        # The Cloud Storage API requires the bucket name and URI prefix separately
        matches = re.match(r"gs://(.*?)/(.*)", process.output_gcs_destination)
        if not matches:
            print(
                "Could not parse output GCS destination:",
                process.output_gcs_destination,
            )
            continue

        output_bucket, output_prefix = matches.groups()

        # Get List of Document Objects from the Output Bucket
        output_blobs = storage_client.list_blobs(output_bucket, prefix=output_prefix)

        # Document AI may output multiple JSON files per source file
        for blob in output_blobs:
            # Document AI should only output JSON files to GCS
            if blob.content_type != "application/json":
                print(
                    f"Skipping non-supported file: {blob.name} - Mimetype: {blob.content_type}"
                )
                continue

            # Download JSON File as bytes object and convert to Document Object
            print(f"Fetching {blob.name}")
            document = documentai.Document.from_json(
                blob.download_as_bytes(), ignore_unknown_fields=True
            )

            # For a full list of Document object attributes, please reference this page:
            # https://cloud.google.com/python/docs/reference/documentai/latest/google.cloud.documentai_v1.types.Document

            # Read the text recognition output from the processor
            print("The document contains the following text:")
            print(document.text)


if __name__ == "__main__":
    batch_process_documents(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        gcs_output_uri=gcs_output_uri,
        input_mime_type=input_mime_type,
        field_mask=field_mask,
    )

Jalankan kodenya, dan Anda akan melihat teks lengkap novel diekstraksi dan dicetak di konsol Anda.

Prosesnya mungkin butuh waktu lebih lama sampai selesai karena file ini jauh lebih besar daripada contoh sebelumnya. (Yaahh...)

Namun, dengan Batch Processing API, Anda akan menerima ID Operasi yang dapat digunakan untuk mendapatkan output dari GCS setelah tugas selesai.

Output Anda akan terlihat seperti ini:

Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete...
Document processing complete.
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-0.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-1.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-10.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-11.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-12.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-13.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-14.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-15.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-16.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-17.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-18.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-2.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-3.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-4.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-5.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-6.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-7.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-8.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-9.json

This is a reproduction of a library book that was digitized
by Google as part of an ongoing effort to preserve the
information in books and make it universally accessible.
TM
Google books
https://books.google.com

.....

He nodded and went
out ... and in a moment
I heard Winnie-the-Pooh
-bump, bump, bump-go-ing up the stairs behind
him.
Digitized by
Google

10. Membuat Permintaan Batch Processing untuk sebuah direktori

Terkadang, Anda mungkin ingin memproses seluruh direktori dokumen, tanpa mencantumkan setiap dokumen satu per satu. Metode batch_process_documents() mendukung input berupa daftar dokumen tertentu atau jalur direktori.

Langkah ini akan menunjukkan cara memproses direktori lengkap file dokumen. Sebagian besar kode berfungsi sama seperti langkah sebelumnya. Satu-satunya perbedaan adalah URI GCS yang dikirim dengan BatchProcessRequest.

Kami memiliki direktori di bucket sampel kami yang berisi banyak halaman novel dalam file terpisah.

  • gs://cloud-samples-data/documentai/codelabs/ocr/multi-document/

Anda dapat membaca file secara langsung atau menyalinnya ke dalam bucket Cloud Storage Anda sendiri.

Jalankan ulang kode dari langkah sebelumnya, dengan mengganti YOUR_INPUT_URI dengan direktori di Cloud Storage.

Jalankan kode, dan Anda akan melihat teks yang diekstraksi dari semua file dokumen di direktori Cloud Storage.

Output Anda akan terlihat seperti ini:

Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete...
Document processing complete.
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh_Page_0-0.json
Fetching docai-output/OPERATION_NUMBER/1/Winnie_the_Pooh_Page_1-0.json
Fetching docai-output/OPERATION_NUMBER/2/Winnie_the_Pooh_Page_10-0.json
Fetching docai-output/OPERATION_NUMBER/3/Winnie_the_Pooh_Page_12-0.json
Fetching docai-output/OPERATION_NUMBER/4/Winnie_the_Pooh_Page_16-0.json
Fetching docai-output/OPERATION_NUMBER/5/Winnie_the_Pooh_Page_7-0.json

Introduction
(I₂
F YOU happen to have read another
book about Christopher Robin, you may remember
th
CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
HERE is
10
WINNIE-THE-POOH
"I wonder if you've got such a thing as a balloon
about you?"
"A balloon?"
"Yes, 
12
WINNIE-THE-POOH
and you took your gun with you, just in case, as
you always did, and Winnie-the-P
16
WINNIE-THE-POOH
this song, and one bee sat down on the nose of the
cloud for a moment, and then g
WE ARE INTRODUCED
7
"Oh, help!" said Pooh, as he dropped ten feet on
the branch below him.
"If only 

11. Menangani Respons Batch Processing dengan Toolbox Document AI

Batch processing memerlukan beberapa langkah yang harus diselesaikan karena integrasi dengan Cloud Storage. Output Document juga dapat "disharding" menjadi beberapa file .json bergantung pada ukuran dokumen input.

SDK Python Document AI Toolbox dibuat untuk menyederhanakan pascapemrosesan dan tugas umum lainnya dengan Document AI. Library ini dimaksudkan sebagai tambahan untuk library klien Document AI, bukan sebagai pengganti. Buka dokumentasi referensi untuk mengetahui spesifikasi lengkapnya.

Langkah ini menunjukkan cara membuat permintaan batch processing dan mengambil output menggunakan Toolbox Document AI.

batch_processing_toolbox.py

"""
Makes a Batch Processing Request to Document AI using Document AI Toolbox
"""

from google.api_core.client_options import ClientOptions
from google.cloud import documentai
from google.cloud import documentai_toolbox

# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION"  # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID"  # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI"  # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
    "YOUR_PROCESSOR_VERSION_ID"  # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)

# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI"  # Format: `gs://bucket/directory/file.pdf`` or `gs://bucket/directory/``
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber"  # Optional. The fields to return in the Document object.


def batch_process_toolbox(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    gcs_output_uri: str,
    processor_version_id: str = None,
    input_mime_type: str = None,
    field_mask: str = None,
):
    # You must set the api_endpoint if you use a location other than "us".
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")

    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
        # Specify specific GCS URIs to process individual documents
        gcs_document = documentai.GcsDocument(
            gcs_uri=gcs_input_uri, mime_type=input_mime_type
        )
        # Load GCS Input URI into a List of document files
        gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
        input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
    else:
        # Specify a GCS URI Prefix to process an entire directory
        gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
        input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)

    # Cloud Storage URI for the Output Directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri, field_mask=field_mask
    )

    # Where to write results
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    if processor_version_id:
        # The full resource name of the processor version, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version_id
        )
    else:
        # The full resource name of the processor, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}
        name = client.processor_path(project_id, location, processor_id)

    request = documentai.BatchProcessRequest(
        name=name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # BatchProcess returns a Long Running Operation (LRO)
    operation = client.batch_process_documents(request)

    # Operation Name Format: projects/{project_id}/locations/{location}/operations/{operation_id}
    documents = documentai_toolbox.document.Document.from_batch_process_operation(
        location=location, operation_name=operation.operation.name
    )

    for document in documents:
        # Read the text recognition output from the processor
        print("The document contains the following text:")
        # Truncated at 100 characters for brevity
        print(document.text[:100])


if __name__ == "__main__":
    batch_process_toolbox(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        gcs_output_uri=gcs_output_uri,
        input_mime_type=input_mime_type,
        field_mask=field_mask,
    )

12. Selamat

Anda telah berhasil menggunakan Document AI untuk mengekstrak teks dari sebuah novel menggunakan Pemrosesan Online, Pemrosesan Batch, dan Toolbox Document AI.

Kami mendorong Anda untuk bereksperimen dengan dokumen lain dan mempelajari prosesor lain yang tersedia di platform.

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.