تشخیص نوری کاراکتر (OCR) با هوش مصنوعی سند (پایتون)

۱. مرور کلی

هوش مصنوعی اسناد چیست؟

هوش مصنوعی اسناد، یک راهکار درک اسناد است که داده‌های بدون ساختار (مانند اسناد، ایمیل‌ها، فاکتورها، فرم‌ها و غیره) را دریافت کرده و درک، تجزیه و تحلیل و استفاده از داده‌ها را آسان‌تر می‌کند. این API از طریق طبقه‌بندی محتوا، استخراج موجودیت، جستجوی پیشرفته و موارد دیگر، ساختار ایجاد می‌کند.

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه با استفاده از API هوش مصنوعی اسناد (Document AI API) در پایتون، تشخیص نوری کاراکتر را انجام دهید.

ما از یک فایل PDF از رمان کلاسیک "وینی پو" نوشته‌ی ای.ای. میلن استفاده خواهیم کرد که اخیراً در ایالات متحده به مالکیت عمومی درآمده است. این فایل توسط گوگل بوکز اسکن و دیجیتالی شده است.

آنچه یاد خواهید گرفت

  • نحوه فعال کردن API هوش مصنوعی اسناد
  • نحوه احراز هویت درخواست‌های API
  • نحوه نصب کتابخانه کلاینت برای پایتون
  • نحوه استفاده از API های پردازش آنلاین و دسته ای
  • نحوه تجزیه متن از یک فایل PDF

آنچه نیاز دارید

  • یک پروژه ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با پایتون (۳.۹+)

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پایتون چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. (اگر از قبل حساب Gmail یا Google Workspace ندارید، باید یکی ایجاد کنید .)

انتخاب پروژه

پروژه جدید

دریافت شناسه پروژه

شناسه پروژه، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud، را به خاطر بسپارید. (شناسه پروژه بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). شما باید این شناسه را بعداً به عنوان PROJECT_ID ارائه دهید.

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت صورتحساب را در Cloud Console فعال کنید .

حتماً دستورالعمل‌های بخش «پاکسازی» را دنبال کنید. این بخش به شما توصیه می‌کند که چگونه منابع را خاموش کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

در حالی که می‌توانید با استفاده از گوگل کلود، گوگل کلود را از راه دور و از طریق لپ‌تاپ خود مدیریت کنید، این آزمایشگاه کد از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده می‌کند.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید فعال کردن پوسته ابری

فعال کردن پوسته ابری

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

معرفی پوسته ابری

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد. پوسته ابری

Cloud Shell دسترسی ترمینال به یک ماشین مجازی میزبانی شده در فضای ابری را برای شما فراهم می‌کند. این ماشین مجازی شامل تمام ابزارهای توسعه مورد نیاز شما است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر انجام داد.

پس از اتصال به 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].

۳. فعال کردن API هوش مصنوعی اسناد

قبل از اینکه بتوانید از Document AI استفاده کنید، باید API را فعال کنید. می‌توانید این کار را با استفاده از رابط خط فرمان gcloud یا کنسول ابری انجام دهید.

از رابط خط فرمان gcloud استفاده کنید

  1. اگر از Cloud Shell استفاده نمی‌کنید، مراحل نصب gcloud CLI را روی دستگاه محلی خود دنبال کنید.
  2. APIها را می‌توان با استفاده از دستورات gcloud زیر فعال کرد.
gcloud services enable documentai.googleapis.com storage.googleapis.com

شما باید چیزی شبیه به این را ببینید:

Operation "operations/..." finished successfully.

استفاده از کنسول ابری

کنسول ابری را در مرورگر خود باز کنید.

  1. با استفاده از نوار جستجو در بالای کنسول، عبارت «Document AI API» را جستجو کنید، سپس برای استفاده از API در پروژه Google Cloud خود، روی فعال‌سازی کلیک کنید.

جستجوی API

  1. مرحله قبل را برای API ذخیره‌سازی ابری گوگل تکرار کنید.

حالا می‌توانید از هوش مصنوعی اسناد استفاده کنید!

۴. یک پردازنده ایجاد و آزمایش کنید

ابتدا باید یک نمونه از پردازنده OCR سند ایجاد کنید که استخراج را انجام دهد. این کار را می‌توان با استفاده از کنسول ابری یا API مدیریت پردازنده انجام داد.

کنسول ابری

  1. در کنسول، به نمای کلی پلتفرم هوش مصنوعی اسناد بروید کنسول بررسی اجمالی هوش مصنوعی اسناد
  2. روی «کاوش پردازنده‌ها» کلیک کنید و «OCR سند» را انتخاب کنید پردازنده‌ها
  3. نام آن را codelab-ocr (یا هر چیز دیگری که به خاطر دارید) بگذارید و نزدیک‌ترین ناحیه را در لیست انتخاب کنید.
  4. برای ایجاد پردازنده خود، روی ایجاد کلیک کنید
  5. شناسه پردازنده خود را کپی کنید. بعداً باید از آن در کد خود استفاده کنید. شناسه پردازنده

شما می‌توانید با آپلود یک سند، پردازنده خود را در کنسول آزمایش کنید. روی آپلود سند آزمایشی کلیک کنید و سندی را برای تجزیه انتخاب کنید.

شما می‌توانید فایل PDF زیر را که شامل ۳ صفحه اول رمان ما است، دانلود کنید.

صفحه عنوان

خروجی شما باید به این شکل باشد: کتاب تجزیه شده

کتابخانه کلاینت پایتون

برای یادگیری نحوه مدیریت پردازنده‌های هوش مصنوعی اسناد با کتابخانه کلاینت پایتون، این codelab را دنبال کنید:

مدیریت پردازنده‌های هوش مصنوعی اسناد با پایتون - Codelab

۵. درخواست‌های API را تأیید اعتبار کنید

برای ارسال درخواست به API مربوط به Document AI، باید از یک حساب کاربری سرویس (Service Account) استفاده کنید. یک حساب کاربری سرویس متعلق به پروژه شماست و توسط کتابخانه کلاینت پایتون برای ارسال درخواست‌های API استفاده می‌شود. مانند هر حساب کاربری دیگر، یک حساب کاربری سرویس با یک آدرس ایمیل نمایش داده می‌شود. در این بخش، شما از Cloud SDK برای ایجاد یک حساب کاربری سرویس استفاده خواهید کرد و سپس اعتبارنامه‌هایی را که برای تأیید اعتبار به عنوان حساب کاربری سرویس نیاز دارید، ایجاد خواهید کرد.

ابتدا، Cloud Shell را باز کنید و یک متغیر محیطی با PROJECT_ID خود تنظیم کنید که در طول این codelab از آن استفاده خواهید کرد:

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

در مرحله بعد، با استفاده از دستور زیر، یک حساب کاربری سرویس جدید برای دسترسی به Document AI API ایجاد کنید:

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

در مرحله بعد، به حساب کاربری سرویس خود مجوزهای دسترسی به هوش مصنوعی اسناد و فضای ذخیره‌سازی ابری را در پروژه خود بدهید.

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"

در مرحله بعد، اعتبارنامه‌هایی ایجاد کنید که کد پایتون شما برای ورود به حساب کاربری سرویس جدیدتان از آنها استفاده کند. این اعتبارنامه‌ها را ایجاد کرده و با استفاده از دستور زیر، آن را به عنوان یک فایل 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"

۶. کتابخانه کلاینت را نصب کنید

کتابخانه‌های کلاینت پایتون را برای 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 هوش مصنوعی اسناد هستید!

۷. نمونه PDF را دانلود کنید

ما یک سند نمونه داریم که شامل ۳ صفحه اول رمان است.

می‌توانید فایل PDF را با استفاده از لینک زیر دانلود کنید. سپس آن را در نمونه cloudshell آپلود کنید .

همچنین می‌توانید با استفاده از gsutil آن را از مخزن ذخیره‌سازی ابری عمومی گوگل ما دانلود کنید.

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

۸. درخواست پردازش آنلاین ارسال کنید

در این مرحله، شما ۳ صفحه اول رمان را با استفاده از API پردازش آنلاین (همزمان) پردازش خواهید کرد. این روش برای اسناد کوچکتری که به صورت محلی ذخیره می‌شوند، مناسب‌تر است. برای اطلاع از حداکثر صفحات و حجم فایل برای هر نوع پردازنده ، لیست کامل پردازنده‌ها را بررسی کنید.

با استفاده از ویرایشگر Cloud Shell یا یک ویرایشگر متن در دستگاه محلی خود، فایلی به نام online_processing.py ایجاد کنید و از کد زیر در آن استفاده کنید.

YOUR_PROJECT_ID ، YOUR_PROJECT_LOCATION ، YOUR_PROCESSOR_ID و FILE_PATH را با مقادیر مناسب برای محیط خود جایگزین کنید.

پردازش آنلاین.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

۹. درخواست پردازش دسته‌ای ایجاد کنید

حالا فرض کنید می‌خواهید کل رمان را از روی متن بخوانید.

  • پردازش آنلاین محدودیت‌هایی در تعداد صفحات و اندازه فایل ارسالی دارد و فقط امکان ارسال یک فایل سند را در هر فراخوانی API فراهم می‌کند.
  • پردازش دسته‌ای امکان پردازش فایل‌های بزرگتر/متعدد را به روشی ناهمزمان فراهم می‌کند.

در این مرحله، کل رمان «وینی پو» را با API پردازش دسته‌ای هوش مصنوعی اسناد پردازش می‌کنیم و متن را در یک سطل ذخیره‌سازی ابری گوگل (Google Cloud Storage Bucket) خروجی می‌دهیم.

پردازش دسته‌ای از عملیات طولانی مدت (Long Running Operations) برای مدیریت درخواست‌ها به صورت غیرهمزمان استفاده می‌کند، بنابراین ما باید درخواست را ایجاد کنیم و خروجی را به روشی متفاوت از پردازش آنلاین بازیابی کنیم. با این حال، خروجی چه با استفاده از پردازش آنلاین و چه با استفاده از پردازش دسته‌ای، در همان قالب شیء Document object) خواهد بود.

این مرحله نحوه ارائه اسناد خاص برای پردازش توسط هوش مصنوعی اسناد را نشان می‌دهد. مرحله بعدی نحوه پردازش کل فهرست اسناد را نشان خواهد داد.

آپلود فایل PDF در فضای ذخیره‌سازی ابری

متد batch_process_documents() در حال حاضر فایل‌ها را از فضای ذخیره‌سازی ابری گوگل می‌پذیرد. برای اطلاعات بیشتر در مورد ساختار شیء، می‌توانید به documentai_v1.types.BatchProcessRequest مراجعه کنید.

برای این مثال، می‌توانید فایل را مستقیماً از سطل نمونه ما بخوانید.

همچنین می‌توانید با استفاده از gsutil فایل را در سطل خود کپی کنید ...

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

... یا می‌توانید فایل نمونه رمان را از لینک زیر دانلود کرده و در سطل خودتان آپلود کنید .

همچنین برای ذخیره خروجی API به یک GCS Bucket نیاز خواهید داشت.

برای یادگیری نحوه ایجاد سطل‌های ذخیره‌سازی، می‌توانید مستندات ذخیره‌سازی ابری را دنبال کنید.

استفاده از متد 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 .

پردازش دسته‌ای.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

۱۰. درخواست پردازش دسته‌ای برای یک دایرکتوری ایجاد کنید

گاهی اوقات، ممکن است بخواهید کل یک دایرکتوری از اسناد را پردازش کنید، بدون اینکه هر سند را به صورت جداگانه فهرست کنید. متد batch_process_documents() از ورودی لیستی از اسناد خاص یا مسیر دایرکتوری پشتیبانی می‌کند.

این مرحله نحوه پردازش یک دایرکتوری کامل از فایل‌های سند را نشان می‌دهد. بیشتر کد مانند مرحله قبل عمل می‌کند، تنها تفاوت در URI ارسالی GCS با BatchProcessRequest است.

ما در سطل نمونه خود یک دایرکتوری داریم که شامل چندین صفحه از رمان در فایل‌های جداگانه است.

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

می‌توانید فایل‌ها را مستقیماً بخوانید یا آنها را در فضای ذخیره‌سازی ابری خود کپی کنید.

کد مرحله قبل را دوباره اجرا کنید و 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 

۱۱. مدیریت پاسخ پردازش دسته‌ای با جعبه ابزار هوش مصنوعی اسناد

پردازش دسته‌ای به دلیل ادغام با فضای ذخیره‌سازی ابری، به چند مرحله نیاز دارد. خروجی Document همچنین می‌تواند بسته به اندازه سند ورودی، به چندین فایل .json تقسیم شود.

جعبه ابزار پایتون Document AI Toolbox برای ساده‌سازی پس‌پردازش و سایر وظایف رایج با Document AI ایجاد شده است. این کتابخانه قرار است مکمل کتابخانه کلاینت Document AI باشد، نه جایگزین آن. برای مشخصات کامل به مستندات مرجع مراجعه کنید.

این مرحله نحوه ایجاد یک درخواست پردازش دسته‌ای و بازیابی خروجی با استفاده از جعبه ابزار هوش مصنوعی سند (Document AI 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,
    )

۱۲. تبریک

شما با موفقیت از هوش مصنوعی اسناد برای استخراج متن از یک رمان با استفاده از پردازش آنلاین، پردازش دسته‌ای و جعبه ابزار هوش مصنوعی اسناد استفاده کرده‌اید.

ما شما را تشویق می‌کنیم که با اسناد دیگر آزمایش کنید و پردازنده‌های دیگر موجود در پلتفرم را بررسی کنید.

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش:

  • در کنسول ابری، به صفحه مدیریت منابع بروید.
  • در لیست پروژه‌ها، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
  • در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن (Shut down) کلیک کنید.

اطلاعات بیشتر

با این Codelabs های بعدی، به یادگیری در مورد هوش مصنوعی اسناد ادامه دهید.

منابع

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.