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

1. Omówienie

Co to jest Document AI?

Document AI to rozwiązanie do rozumienia dokumentów, które wykorzystuje nieuporządkowane dane (np. dokumenty, e-maile, faktury, formularze itp.) i ułatwia ich analizowanie, analizowanie i wykorzystywanie. Zapewnia on strukturę dzięki klasyfikacji treści, wyodrębnianiu encji, wyszukiwaniu zaawansowanym i innym funkcjom.

W tym module dowiesz się, jak korzystać z optycznego rozpoznawania znaków za pomocą interfejsu Document AI API w języku Python.

Użyjemy pliku PDF z klasycznej powieści „Kubuś” autor: A.A. Milne, która niedawno stała się częścią domeny publicznej w Stanach Zjednoczonych. Ten plik został zeskanowany i przetworzony do postaci cyfrowej w Książkach Google.

Czego się nauczysz

  • Jak włączyć interfejs Document AI API
  • Jak uwierzytelniać żądania do interfejsu API
  • Jak zainstalować bibliotekę klienta dla Pythona
  • Jak korzystać z interfejsów API przetwarzania online i wsadowego
  • Jak analizować tekst z pliku PDF

Czego potrzebujesz

  • Projekt Google Cloud
  • przeglądarkę, np. Chrome lub Firefox;
  • znajomość Pythona (3.9 lub nowszego)

Ankieta

Jak wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenia z językiem Python?

Początkujący Poziom średnio zaawansowany Biegły

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

Wybierz projekt

Nowy projekt

Uzyskaj identyfikator projektu

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud. (Powyższy identyfikator projektu jest już zajęty i nie sprawdzi się w Twoim przypadku). Musisz podać ten identyfikator później jako PROJECT_ID.

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

Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” . W tej sekcji znajdziesz informacje na temat wyłączania zasobów, aby nie naliczać opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud możesz korzystać zdalnie z laptopa, ale to ćwiczenie w programowaniu wykorzystuje Google Cloud Shell – środowisko wiersza poleceń działające w Cloud.

Aktywowanie Cloud Shell

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

Aktywowanie Cloud Shell

Jeśli dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:

Wprowadzenie do Cloud Shell

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

Cloud Shell zapewnia dostęp do terminala maszyny wirtualnej hostowanej w chmurze. Maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość czynności w ramach tego ćwiczenia z programowania można wykonać za pomocą przeglądarki.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe 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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Dane wyjściowe 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ą interfejsu wiersza poleceń gcloud lub konsoli Cloud.

Użyj 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ą podanych niżej poleceń gcloud.
gcloud services enable documentai.googleapis.com storage.googleapis.com

Powinien pojawić się ekran podobny do tego:

Operation "operations/..." finished successfully.

Korzystanie z konsoli Google Cloud

Otwórz konsolę Cloud w przeglądarce.

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

Interfejs API wyszukiwarki

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

Teraz możesz korzystać z Document AI.

4. Utwórz i przetestuj procesor

Musisz najpierw utworzyć instancję procesora OCR w dokumencie, która przeprowadzi wyodrębnianie. Możesz to zrobić w konsoli Cloud lub za pomocą interfejsu Processor Management API.

Cloud Console

  1. W konsoli otwórz Omówienie platformy Document AI.Konsola przeglądu Document AI
  2. Kliknij Poznaj procesory i wybierz OCR w dokumentach.Procesory
  3. Nadaj mu nazwę codelab-ocr (albo coś innego, co zapamiętasz) i wybierz na liście najbliższy region.
  4. Kliknij Utwórz, aby utworzyć procesor.
  5. Skopiuj identyfikator podmiotu przetwarzającego. Należy 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 znajdziesz plik PDF, który zawiera pierwsze 3 strony naszej powieści.

Strona tytułowa

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

Biblioteka klienta Pythona

Wykonaj to ćwiczenia w Codelabs, aby dowiedzieć 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żywać konta usługi. Konto usługi należy do Twojego projektu i jest używane przez bibliotekę klienta Pythona do wysyłania żądań do interfejsu API. Tak jak każde inne konto użytkownika, konto usługi jest reprezentowane przez adres e-mail. W tej sekcji utworzysz konto usługi za pomocą pakietu Cloud SDK, a następnie utworzysz dane logowania, których użyjesz do uwierzytelnienia jako konto usługi.

Najpierw otwórz Cloud Shell i ustaw zmienną środowiskową PROJECT_ID, której będziesz używać podczas tego ćwiczenia w programowaniu:

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

Następnie utwórz nowe konto usługi z dostępem do interfejsu Document AI API, używając polecenia:

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 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 Twój kod w Pythonie będzie używać do logowania się na Twoje nowe konto usługi. Utwórz te dane logowania i zapisz je w pliku JSON ~/key.json za pomocą tego polecenia:

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

Ostatnim krokiem jest utworzenie zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS, która będzie używana przez biblioteka do wyszukiwania Twoich 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 za pomocą polecenia:

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

6. Instalowanie biblioteki klienta

Zainstaluj biblioteki klienta w Pythonie dla Document AI, Cloud Storage i Zestawu narzędzi Document AI:

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

Możesz teraz korzystać z interfejsu Document AI API.

7. Pobierz przykładowy plik PDF

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

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

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

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

8. Złóż wniosek o przetwarzanie danych online

W tym kroku przetworzysz pierwsze 3 strony powieści, używając interfejsu API przetwarzania online (synchronicznego). Ta metoda najlepiej sprawdza się w przypadku mniejszych dokumentów przechowywanych lokalnie. Na pełnej liście procesorów znajdziesz maksymalną liczbę stron i rozmiar pliku dla każdego typu procesora.

Utwórz plik o nazwie online_processing.py za pomocą edytora Cloud Shell lub edytora tekstu na komputerze lokalnym i użyj tego kodu.

Zastąp YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_ID i FILE_PATH wartościami odpowiednimi 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 wydrukuje go w konsoli.

Jeśli korzystasz z przykładowego dokumentu, dane wyjściowe powinny wyglądać tak:

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. Wyślij żądanie przetwarzania zbiorczego

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

  • W ramach przetwarzania online obowiązują ograniczenia dotyczące liczby stron i rozmiaru pliku, które można wysłać. Zezwala też na przesłanie tylko 1 pliku dokumentu na wywołanie interfejsu API.
  • Przetwarzanie wsadowe umożliwia przetwarzanie większych/wielu plików przy użyciu metody asynchronicznej.

Na tym etapie przetworzymy całą planetę „Kubuś” za pomocą interfejsu Document AI Batch Processing API i przesłać tekst do zasobnika Google Cloud Storage.

Przetwarzanie wsadowe wykorzystuje długie operacje do zarządzania żądaniami w sposób asynchroniczny, dlatego musimy wysłać żądanie i pobrać dane wyjściowe w inny sposób niż przetwarzanie online. Dane wyjściowe będą jednak w tym samym formacie obiektu Document niezależnie od tego, czy korzystasz z przetwarzania online czy wsadowego.

Ten krok pokazuje, jak dostarczyć określone dokumenty do przetworzenia przez Document AI. W kolejnym kroku pokazujemy, jak przetworzyć cały katalog dokumentów.

Prześlij plik PDF do Cloud Storage

Obecnie metoda batch_process_documents() akceptuje pliki z Google Cloud Storage. Więcej informacji o strukturze obiektów znajdziesz w artykule 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 swojego zasobnika za pomocą narzędzia 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 z linku poniżej i przesłać go do swojego zasobnika.

Będziesz też potrzebować zasobnika GCS do przechowywania danych wyjściowych interfejsu API.

Informacje o tym, jak tworzyć zasobniki na dane, znajdziesz w dokumentacji Cloud Storage.

Korzystanie z metody batch_process_documents()

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

Zastąp YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URI i YOUR_OUTPUT_URI wartościami odpowiednimi dla Twojego środowiska.

Upewnij się, że atrybut 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, a cały tekst powieści powinien zostać wyodrębniony i wydrukowany w konsoli.

Może to zająć trochę czasu, ponieważ plik jest znacznie większy niż w poprzednim przykładzie. (Ach, irytację...)

Jednak dzięki interfejsowi Batch Processing API otrzymasz identyfikator operacji, którego można 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. Tworzenie żądania przetwarzania wsadowego dla katalogu

Czasami może być potrzebne przetwarzanie całego katalogu dokumentów bez wyświetlania każdego dokumentu oddzielnie. Metoda batch_process_documents() obsługuje wprowadzanie listy konkretnych dokumentów lub ścieżki katalogu.

W tym kroku pokazujemy, jak przetworzyć pełny katalog plików dokumentów. Większość kodu działa tak samo jak w poprzednim kroku, jedyną różnicą jest identyfikator URI GCS wysyłany za pomocą 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.

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

Uruchom kod – powinien być widoczny 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. Przetwarzanie odpowiedzi wsadowej za pomocą Zestawu narzędzi Document AI

Ze względu na integrację z Cloud Storage przetwarzanie wsadowe wymaga wykonania kilku czynności. Dane wyjściowe funkcji Document mogą być również „podzielone na fragmenty” na wiele plików .json w zależności od rozmiaru dokumentu wejściowego.

Pakiet Document AI Toolbox w Pythonie został stworzony, aby uprościć przetwarzanie i inne typowe zadania w Document AI. Ta biblioteka ma być uzupełnieniem biblioteki klienta Document AI, a nie jej zamiennikiem. Pełną specyfikację znajdziesz w dokumentacji referencyjnej.

Ten krok pokazuje, jak utworzyć żądanie przetwarzania wsadowego i pobrać dane wyjściowe za pomocą Zestawu narzędzi 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. Gratulacje

Udało Ci się wykorzystać Document AI do wyodrębniania tekstu z powieści przy użyciu przetwarzania online, przetwarzania wsadowego i zestawu narzędzi Document AI.

Zachęcamy do eksperymentowania z innymi dokumentami i zapoznania się z innymi platformami przetwarzania danych dostępnymi na platformie.

Czyszczenie danych

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

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

Więcej informacji

Dowiedz się więcej o Document AI dzięki tym dodatkowym ćwiczeniom z programowania.

Materiały

Licencja

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