Optyczne rozpoznawanie znaków (OCR) w Document AI (Python)

1. Przegląd

Co to jest Document AI?

Document AI to rozwiązanie do analizy dokumentów, które przetwarza dane nieustrukturyzowane (np. dokumenty, e-maile, faktury, formularze itp.) i ułatwia ich zrozumienie, analizowanie i wykorzystywanie. Interfejs API zapewnia strukturę dzięki klasyfikacji treści, wyodrębnianiu encji, wyszukiwaniu zaawansowanemu i innym funkcjom.

W tym module nauczysz się wykonywać optyczne rozpoznawanie znaków za pomocą interfejsu Document AI API w Pythonie.

Użyjemy pliku PDF z klasyczną powieścią „Kubuś Puchatek”, którą napisał A. A. Milne. Niedawno książka ta trafiła do domeny publicznej w Stanach Zjednoczonych. Ten plik został zeskanowany i zdigitalizowany w Książkach Google.

Czego się nauczysz

  • Jak włączyć interfejs Document AI API
  • Uwierzytelnianie żądań do interfejsu API
  • Instalowanie biblioteki klienta w Pythonie
  • Jak korzystać z interfejsów API do przetwarzania online i przetwarzania wsadowego
  • Jak analizować tekst z pliku PDF

Czego potrzebujesz

  • Projekt Google Cloud
  • przeglądarka, np. Chrome lub Firefox;
  • Znajomość języka Python (3.9 lub nowszego)

Ankieta

Jak zamierzasz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie z Pythonem?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. (Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz je utworzyć).

Wybierz projekt

Nowy projekt

Pobieranie identyfikatora projektu

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud. (Podany powyżej identyfikator projektu jest już zajęty i nie będzie działać. Przepraszamy). Musisz podać ten identyfikator później jako PROJECT_ID.

  1. Następnie musisz włączyć płatności w konsoli Cloud, aby móc korzystać z zasobów Google Cloud.

Pamiętaj, aby postępować zgodnie z instrukcjami w sekcji „Czyszczenie”. W tej sekcji znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Po zalogowaniu się w Google Cloud możesz zdalnie korzystać z tej usługi na laptopie. W tym ćwiczeniu programistycznym używamy Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell Aktywowanie Cloud Shell.

Aktywowanie Cloud Shell

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni (część strony widoczna po przewinięciu) z opisem tego środowiska. W takim przypadku kliknij Dalej, a ten ekran nie będzie się już wyświetlać. Ten wyświetlany jednorazowo ekran wygląda tak:

Wprowadzenie do Cloud Shell

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil. Cloud Shell

Cloud Shell zapewnia dostęp z terminala do maszyny wirtualnej hostowanej w chmurze. Maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

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

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

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Włączanie interfejsu Document AI API

Zanim zaczniesz korzystać z Document AI, musisz włączyć interfejs API. Możesz to zrobić za pomocą gcloudinterfejsu wiersza poleceń lub konsoli Google Cloud.

Korzystanie z interfejsu wiersza poleceń gcloud

  1. Jeśli nie używasz Cloud Shell, wykonaj czynności opisane w artykule Instalowanie interfejsu wiersza poleceń gcloud na komputerze lokalnym.
  2. Interfejsy API można włączyć za pomocą tych poleceń gcloud.
gcloud services enable documentai.googleapis.com storage.googleapis.com

Powinien pojawić się ekran podobny do tego:

Operation "operations/..." finished successfully.

Korzystanie z Cloud Console

Otwórz Cloud Console w przeglądarce.

  1. Na pasku wyszukiwania u góry konsoli wyszukaj „Document AI API”, a potem kliknij Włącz, aby używać interfejsu API w projekcie Google Cloud.

Search API

  1. Powtórz poprzedni krok w przypadku interfejsu Google Cloud Storage API.

Możesz teraz korzystać z Document AI.

4. Tworzenie i testowanie procesora

Najpierw musisz utworzyć instancję procesora Document OCR, która będzie przeprowadzać wyodrębnianie. Możesz to zrobić za pomocą konsoli Cloud lub interfejsu Processor Management API.

Cloud Console

  1. W konsoli otwórz Przegląd platformy Document AI.Konsola Omówienie Document AI
  2. Kliknij Poznaj procesory i wybierz Document OCRProcesory.
  3. Nadaj mu nazwę codelab-ocr (lub inną, którą będziesz pamiętać) i wybierz najbliższy region na liście.
  4. Kliknij Utwórz, aby utworzyć procesor.
  5. Skopiuj identyfikator procesora. Będzie trzeba użyć go później w kodzie. Identyfikator procesora

Możesz przetestować procesor w konsoli, przesyłając dokument. Kliknij Prześlij dokument testowy i wybierz dokument do przeanalizowania.

Poniżej możesz pobrać plik PDF z pierwszymi 3 stronami naszej powieści.

Strona tytułowa

Dane wyjściowe powinny wyglądać tak: Przeanalizowana książka

Biblioteka klienta Python

W tym module dowiesz się, jak zarządzać procesorami Document AI za pomocą biblioteki klienta w Pythonie:

Zarządzanie procesorami Document AI za pomocą Pythona – ćwiczenia z programowania

5. Uwierzytelnianie żądań do interfejsu API

Aby wysyłać żądania do interfejsu Document AI API, musisz użyć konta usługi. Konto usługi należy do Twojego projektu i jest używane przez bibliotekę klienta Python do wysyłania żądań interfejsu API. Podobnie jak każde inne konto użytkownika, konto usługi jest reprezentowane przez adres e-mail. W tej sekcji użyjesz pakietu SDK Cloud, aby utworzyć konto usługi, a następnie utworzysz dane logowania potrzebne do uwierzytelnienia się jako konto usługi.

Najpierw otwórz Cloud Shell i ustaw zmienną środowiskową wykorzystującą Twój PROJECT_ID, której będziesz używać podczas naszych ćwiczeń z programowania:

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

Następnie utwórz nowe konto usługi, aby uzyskać dostęp do interfejsu Document AI API, korzystając z:

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

Następnie przyznaj kontu usługi uprawnienia dostępu do Document AI i Cloud Storage w Twoim projekcie.

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"

Następnie utwórz dane logowania, których kod w Pythonie będzie używać do logowania się na nowe konto usługi. Utworzone dane zapisz w pliku JSON ~/key.json przy użyciu tego polecenia:

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

Na koniec ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS, która jest używana przez bibliotekę do znajdowania danych logowania. Więcej informacji o tej formie uwierzytelniania znajdziesz w przewodniku. Zmienna środowiskowa powinna zawierać pełną ścieżkę do utworzonego przez Ciebie pliku JSON z danymi logowania. Aby to zrobić, użyj tego polecenia:

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

6. Instalowanie biblioteki klienta

Zainstaluj biblioteki klienta Pythona dla Document AI, Cloud Storage i Document AI Toolbox:

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

Powinien pojawić się ekran podobny do tego:

...
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

Teraz możesz używać interfejsu Document AI API.

7. Pobierz przykładowy plik PDF

Mamy przykładowy dokument, który zawiera pierwsze 3 strony powieści.

Plik PDF możesz pobrać, klikając ten link. Następnie prześlij go do instancji Cloud Shell.

Możesz też pobrać go z naszego publicznego zasobnika Cloud Storage za pomocą gsutil.

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

8. Przesyłanie żądania przetwarzania online

W tym kroku przetworzysz pierwsze 3 strony powieści za pomocą interfejsu API do przetwarzania online (synchronicznego). Ta metoda najlepiej sprawdza się w przypadku mniejszych dokumentów przechowywanych lokalnie. Pełną listę procesorów wraz z maksymalną liczbą stron i rozmiarem pliku dla każdego typu procesora znajdziesz tutaj.

Użyj edytora Cloud Shell lub edytora tekstu na komputerze lokalnym, aby utworzyć plik o nazwie online_processing.py, i użyj poniższego kodu.

Zastąp parametry YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_IDFILE_PATH odpowiednimi wartościami dla Twojego środowiska.

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}")

Uruchom kod, który wyodrębni tekst i wyświetli go w konsoli.

Jeśli używasz naszego przykładowego dokumentu, powinny się wyświetlić te dane wyjściowe:

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. Wysyłanie żądania przetwarzania wsadowego

Załóżmy, że chcesz przeczytać tekst z całej powieści.

  • Przetwarzanie online ma limity dotyczące liczby stron i rozmiaru pliku, które można przesłać, i umożliwia tylko jeden plik dokumentu na wywołanie interfejsu API.
  • Przetwarzanie wsadowe umożliwia przetwarzanie większych lub wielu plików metodą asynchroniczną.

W tym kroku przetworzymy całą powieść „Kubuś Puchatek” za pomocą interfejsu Document AI Batch Processing API i wyeksportujemy tekst do zasobnika Cloud Storage.

Przetwarzanie wsadowe wykorzystuje długotrwałe operacje do asynchronicznego zarządzania żądaniami, więc musimy wysyłać żądania i pobierać dane wyjściowe w inny sposób niż w przypadku przetwarzania online. Dane wyjściowe będą jednak miały ten sam format obiektu Document niezależnie od tego, czy używasz przetwarzania online, czy przetwarzania wsadowego.

Ten krok pokazuje, jak udostępnić Document AI konkretne dokumenty do przetworzenia. W dalszej części pokażemy, jak przetworzyć cały katalog dokumentów.

Przesyłanie pliku PDF do Cloud Storage

Metoda batch_process_documents() obecnie akceptuje pliki z Google Cloud Storage. Więcej informacji o strukturze obiektu znajdziesz w documentai_v1.types.BatchProcessRequest.

W tym przykładzie możesz odczytać plik bezpośrednio z naszego przykładowego zasobnika.

Możesz też skopiować plik do własnego zasobnika za pomocą gsutil

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

Możesz też pobrać przykładowy plik powieści, klikając link poniżej, i przesłać go do własnego zasobnika.

Potrzebujesz też zasobnika GCS do przechowywania danych wyjściowych interfejsu API.

Aby dowiedzieć się, jak tworzyć zasobniki na dane, zapoznaj się z dokumentacją Cloud Storage.

Korzystanie z metody batch_process_documents()

Utwórz plik o nazwie batch_processing.py i użyj poniższego kodu.

Zastąp wartości YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URIYOUR_OUTPUT_URI odpowiednimi wartościami dla Twojego środowiska.

Sprawdź, czy YOUR_INPUT_URI wskazuje bezpośrednio na plik PDF, np. 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,
    )

Uruchom kod. W konsoli powinien pojawić się wyodrębniony i wydrukowany pełny tekst powieści.

Może to trochę potrwać, ponieważ plik jest znacznie większy niż w poprzednim przykładzie. (Och, nie…)

Jednak w przypadku interfejsu Batch Processing API otrzymasz identyfikator operacji, którego możesz użyć do pobrania danych wyjściowych z GCS po zakończeniu zadania.

Dane wyjściowe powinny wyglądać mniej więcej tak:

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. Wysyłanie żądania przetwarzania zbiorczego dotyczącego katalogu

Czasami możesz chcieć przetworzyć cały katalog dokumentów bez podawania każdego z nich z osobna. Metoda batch_process_documents() obsługuje wprowadzanie listy konkretnych dokumentów lub ścieżki do katalogu.

W tym kroku dowiesz się, jak przetworzyć cały katalog plików dokumentów. Większość kodu działa tak samo jak w poprzednim kroku. Jedyna różnica to identyfikator URI GCS wysyłany z parametrem BatchProcessRequest.

W naszym przykładowym zasobniku znajduje się katalog zawierający wiele stron powieści w osobnych plikach.

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

Możesz odczytać pliki bezpośrednio lub skopiować je do własnego zasobnika Cloud Storage.

Ponownie uruchom kod z poprzedniego kroku, zastępując YOUR_INPUT_URI katalogiem w Cloud Storage.

Uruchom kod. Powinien wyświetlić wyodrębniony tekst ze wszystkich plików dokumentów w katalogu Cloud Storage.

Dane wyjściowe powinny wyglądać mniej więcej tak:

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. Obsługa odpowiedzi na przetwarzanie wsadowe za pomocą Document AI Toolbox

Przetwarzanie wsadowe wymaga wykonania wielu czynności ze względu na integrację z Cloud Storage. Dane wyjściowe Document mogą być też „dzielone” na kilka plików .json w zależności od rozmiaru dokumentu wejściowego.

Pakiet SDK Document AI Toolbox dla Pythona został stworzony, aby uprościć przetwarzanie końcowe i inne typowe zadania związane z Document AI. Ta biblioteka ma być uzupełnieniem biblioteki klienta Document AI, a nie jej zamiennikiem. Pełną specyfikację znajdziesz w dokumentacji.

Ten krok pokazuje, jak wysłać żądanie przetwarzania wsadowego i pobrać dane wyjściowe za pomocą Document AI Toolbox.

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. Gratulacje

Udało Ci się wyodrębnić tekst z powieści za pomocą Document AI przy użyciu przetwarzania online, przetwarzania wsadowego i Document AI Toolbox.

Zachęcamy do eksperymentowania z innymi dokumentami i wypróbowania innych procesorów dostępnych na platformie.

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku:

  • W Cloud Console otwórz stronę Zarządzanie zasobami.
  • Na liście projektów wybierz projekt, a następnie kliknij Usuń.
  • W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

Więcej informacji

Kontynuuj naukę o Document AI w tych modułach Codelabs.

Materiały

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.