Оптическое распознавание символов (OCR) с использованием искусственного интеллекта документов (Python)

1. Обзор

Что такое Document AI?

Document AI — это решение для анализа и обработки документов, которое преобразует неструктурированные данные (например, документы, электронные письма, счета-фактуры, формы и т. д.) в более понятные, анализируемые и доступные для использования данные. API обеспечивает структурирование данных посредством классификации контента, извлечения сущностей, расширенного поиска и многого другого.

В этой лабораторной работе вы научитесь выполнять оптическое распознавание символов с помощью API Document AI на языке Python.

Мы будем использовать PDF-файл классического романа «Винни-Пух» А. А. Милна, который недавно перешел в общественное достояние в Соединенных Штатах. Этот файл был отсканирован и оцифрован с помощью Google Books .

Что вы узнаете

  • Как включить API Document AI
  • Как аутентифицировать запросы API
  • Как установить клиентскую библиотеку для Python
  • Как использовать API для онлайн- и пакетной обработки
  • Как извлечь текст из PDF-файла

Что вам понадобится

  • Проект Google Cloud
  • Браузер, например Chrome или Firefox.
  • Знание языка Python (3.9+)

Опрос

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Профессионал

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .)

Выберите проект

Новый проект

Получить идентификатор проекта

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud. (Указанный выше идентификатор проекта уже занят и вам не подойдет, извините!). Этот идентификатор необходимо будет указать позже в формате PROJECT_ID .

  1. Далее, для использования ресурсов Google Cloud необходимо включить оплату в Cloud Console.

Обязательно следуйте инструкциям в разделе «Очистка». В этом разделе указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого руководства. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

В то время как в Google Cloud вы можете управлять им удаленно со своего ноутбука, в этом практическом занятии используется Google Cloud Shell — среда командной строки, работающая в облаке.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . Активировать Cloud Shell

Активировать Cloud Shell

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его содержимое. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

Введение в Cloud Shell

Подготовка и подключение к Cloud Shell займут всего несколько минут. Облачная оболочка

Cloud Shell предоставляет вам терминальный доступ к виртуальной машине, размещенной в облаке. Виртуальная машина включает в себя все необходимые инструменты разработки. Она предлагает постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера.

После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и проект уже настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

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

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

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Включите API Document AI.

Прежде чем начать использовать Document AI, необходимо включить API. Это можно сделать с помощью интерфейса командной строки gcloud или консоли Cloud Console.

Используйте интерфейс командной строки gcloud

  1. Если вы не используете Cloud Shell , выполните действия, описанные в разделе «Установка CLI gcloud на локальный компьютер».
  2. API можно включить с помощью следующих команд gcloud .
gcloud services enable documentai.googleapis.com storage.googleapis.com

Вы должны увидеть что-то подобное:

Operation "operations/..." finished successfully.

Воспользуйтесь облачной консолью.

Откройте консоль Cloud в своем браузере.

  1. Воспользуйтесь строкой поиска в верхней части консоли, найдите "Document AI API", затем нажмите " Включить" , чтобы использовать API в своем проекте Google Cloud.

API поиска

  1. Повторите предыдущий шаг для API Google Cloud Storage.

Теперь вы можете использовать Document AI!

4. Создайте и протестируйте процессор.

Сначала необходимо создать экземпляр процессора распознавания текста (OCR), который будет выполнять извлечение данных. Это можно сделать с помощью облачной консоли или API управления процессором .

Облачная консоль

  1. В консоли перейдите к разделу «Обзор платформы Document AI». Обзор консоли ИИ для документов
  2. Нажмите «Просмотреть процессоры» и выберите «Ораспознавание текста в документе». Процессоры
  3. Назовите его codelab-ocr (или как-нибудь еще, что вы запомните) и выберите ближайший регион из списка.
  4. Нажмите «Создать» , чтобы создать свой процессор.
  5. Скопируйте свой идентификатор процессора. Он понадобится вам в дальнейшем при работе с кодом. Идентификатор процессора

Вы можете протестировать свой процессор в консоли, загрузив документ. Нажмите «Загрузить тестовый документ» и выберите документ для анализа.

Ниже вы можете скачать PDF-файл, содержащий первые 3 страницы нашего романа.

Титульная страница

Результат должен выглядеть примерно так: Разобранная книга

Клиентская библиотека Python

Выполните это практическое задание, чтобы узнать, как управлять обработчиками Document AI с помощью клиентской библиотеки Python:

Управление обработчиками документов с помощью ИИ на Python - Codelab

5. Аутентификация API-запросов

Для отправки запросов к API Document AI необходимо использовать учетную запись службы . Учетная запись службы принадлежит вашему проекту и используется библиотекой Python Client для отправки запросов к API. Как и любая другая учетная запись пользователя, учетная запись службы представлена ​​адресом электронной почты. В этом разделе вы будете использовать Cloud SDK для создания учетной записи службы, а затем создадите учетные данные, необходимые для аутентификации в качестве учетной записи службы.

Сначала откройте Cloud Shell и установите переменную среды с вашим PROJECT_ID , которую вы будете использовать на протяжении всего этого практического занятия:

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

Далее создайте новую учетную запись службы для доступа к API Document AI, используя:

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

Далее предоставьте учетной записи службы разрешения на доступ к Document AI и облачному хранилищу в вашем проекте.

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"

Далее создайте учетные данные, которые ваш код на Python будет использовать для входа в систему под вашей новой учетной записью службы. Создайте эти учетные данные и сохраните их в виде JSON-файла ~/key.json , используя следующую команду:

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

Наконец, установите переменную среды GOOGLE_APPLICATION_CREDENTIALS , которая используется библиотекой для поиска ваших учетных данных. Подробнее об этом способе аутентификации см. в руководстве . Переменная среды должна быть установлена ​​на полный путь к созданному вами JSON-файлу с учетными данными, используя:

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

6. Установите клиентскую библиотеку.

Установите клиентские библиотеки Python для Document AI, Cloud Storage и Document AI Toolbox:

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

Вы должны увидеть что-то подобное:

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

Теперь вы готовы использовать API Document AI!

7. Скачайте образец PDF-файла.

У нас есть образец документа, содержащий первые 3 страницы романа.

Вы можете скачать PDF-файл по следующей ссылке. Затем загрузите его в экземпляр CloudShell .

Вы также можете загрузить его из нашего общедоступного хранилища Google Cloud Storage с помощью утилиты gsutil .

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

8. Отправьте онлайн-запрос на обработку.

На этом этапе вы обработаете первые 3 страницы романа, используя API онлайн-обработки (синхронный режим). Этот метод лучше всего подходит для небольших документов, хранящихся локально. Полный список обработчиков содержит информацию о максимальном количестве страниц и размере файла для каждого типа обработчика.

Используйте редактор Cloud Shell или любой другой текстовый редактор на вашем локальном компьютере, чтобы создать файл с именем online_processing.py и использовать приведенный ниже код.

Замените YOUR_PROJECT_ID , YOUR_PROJECT_LOCATION , YOUR_PROCESSOR_ID и FILE_PATH на соответствующие значения для вашей среды.

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

Запустите код, который извлечет текст и выведет его в консоль.

При использовании нашего примера документа вы должны увидеть следующий результат:

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. Создайте запрос на пакетную обработку.

Теперь предположим, что вы хотите прочитать текст всего романа.

  • В режиме онлайн-обработки существуют ограничения на количество страниц и размер файлов, которые можно отправить, и допускается отправка только одного файла документа за один вызов API.
  • Пакетная обработка позволяет обрабатывать большие/многочисленные файлы асинхронным методом.

На этом этапе мы обработаем весь роман «Винни-Пух» с помощью API пакетной обработки Document AI и выведем текст в хранилище Google Cloud Storage.

Пакетная обработка использует длительные операции (Long Running Operations) для асинхронного управления запросами, поэтому запрос и получение результата должны выполняться иначе, чем при онлайн-обработке. Однако результат будет в одном и том же формате объекта Document независимо от того, используется ли онлайн-обработка или пакетная обработка.

На этом шаге показано, как указать конкретные документы для обработки системой Document AI. На следующем шаге будет показано, как обработать весь каталог документов.

Загрузите PDF-файл в облачное хранилище.

Метод batch_process_documents() в настоящее время принимает файлы из Google Cloud Storage. Для получения дополнительной информации о структуре объекта см. documentai_v1.types.BatchProcessRequest .

В этом примере вы можете прочитать файл непосредственно из нашего тестового хранилища.

Вы также можете скопировать файл в свой собственный бакет с помощью gsutil ...

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

...или вы можете скачать ознакомительный файл романа по ссылке ниже и загрузить его в свой собственный репозиторий .

Вам также понадобится хранилище GCS Bucket для хранения результатов работы API.

Чтобы узнать, как создавать сегменты хранилища, вы можете обратиться к документации Cloud Storage.

Использование метода batch_process_documents()

Создайте файл с именем batch_processing.py и используйте приведенный ниже код.

Замените значения YOUR_PROJECT_ID , YOUR_PROCESSOR_LOCATION , YOUR_PROCESSOR_ID , YOUR_INPUT_URI и YOUR_OUTPUT_URI соответствующими значениями для вашей среды.

Убедитесь, что переменная YOUR_INPUT_URI указывает непосредственно на PDF-файл, например: 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,
    )

Запустите код, и вы увидите полный текст романа, извлеченный и выведенный в консоль.

Выполнение этой операции может занять некоторое время, так как файл значительно больше, чем в предыдущем примере. (Ой, какая досада...)

Однако, используя API пакетной обработки, вы получите идентификатор операции, который можно использовать для получения результатов из GCS после завершения задачи.

Результат должен выглядеть примерно так:

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. Выполните запрос на пакетную обработку каталога.

Иногда может потребоваться обработать весь каталог документов, не перечисляя каждый документ по отдельности. Метод batch_process_documents() поддерживает ввод списка конкретных документов или пути к каталогу.

На этом шаге будет показано, как обработать целую директорию файлов документов. Большая часть кода работает так же, как и на предыдущем шаге, единственное отличие — это URI GCS, отправляемый с помощью BatchProcessRequest .

В нашем хранилище образцов есть папка, содержащая несколько страниц романа в отдельных файлах.

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

Вы можете читать файлы напрямую или скопировать их в собственное хранилище Cloud Storage.

Повторно запустите код из предыдущего шага, заменив YOUR_INPUT_URI на название каталога в Cloud Storage.

Запустите код, и вы увидите извлеченный текст из всех файлов документов в каталоге Cloud Storage.

Результат должен выглядеть примерно так:

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. Обработка ответов пакетной обработки с помощью Document AI Toolbox.

Пакетная обработка требует выполнения довольно большого количества шагов из-за интеграции с облачным хранилищем. Выходной Document также может быть «разделен» на несколько файлов .json в зависимости от размера входного документа.

Пакет инструментов Document AI Toolbox Python SDK создан для упрощения постобработки и других распространенных задач в Document AI. Эта библиотека предназначена для дополнения клиентской библиотеки Document AI, а не для ее замены. Полное описание см. в справочной документации .

На этом шаге показано, как создать запрос на пакетную обработку и получить результат с помощью 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. Поздравляем!

Вы успешно использовали Document AI для извлечения текста из романа с помощью онлайн-обработки, пакетной обработки и инструментария Document AI.

Мы рекомендуем вам поэкспериментировать с другими документами и изучить другие доступные на платформе процессоры .

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этом руководстве:

  • В консоли Cloud перейдите на страницу «Управление ресурсами» .
  • В списке проектов выберите свой проект и нажмите «Удалить».
  • В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.

Узнать больше

Продолжите изучение Document AI с помощью этих дополнительных практических занятий.

Ресурсы

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.