تجزیه فرم با هوش مصنوعی سند (پایتون)

1. مقدمه

در این کد لبه، نحوه استفاده از Document AI Form Parser برای تجزیه یک فرم دست نویس با پایتون را خواهید آموخت.

ما از یک فرم دریافت پزشکی ساده به عنوان مثال استفاده خواهیم کرد، اما این روش با هر فرم عمومی پشتیبانی شده توسط DocAI کار می کند.

پیش نیازها

این کد لبه بر محتوای ارائه شده در سایر Codelab های هوش مصنوعی سند ساخته شده است.

توصیه می شود قبل از ادامه، Codelabs زیر را تکمیل کنید.

چیزی که یاد خواهید گرفت

  • نحوه تجزیه و استخراج داده ها از فرم اسکن شده با استفاده از تجزیه کننده فرم AI سند.

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

  • یک پروژه Google Cloud
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با پایتون 3

نظرسنجی

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

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

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

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

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

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

2. راه اندازی و الزامات

این کد لبه فرض می‌کند که شما مراحل راه‌اندازی Document AI فهرست‌شده در Document AI OCR Codelab را تکمیل کرده‌اید.

لطفا قبل از ادامه مراحل زیر را انجام دهید:

همچنین باید Pandas را نصب کنید، یک کتابخانه تجزیه و تحلیل داده منبع باز برای پایتون.

pip3 install --upgrade pandas

3. یک پردازشگر Form Parser ایجاد کنید

ابتدا باید یک نمونه پردازشگر Form Parser برای استفاده در Document AI Platform برای این آموزش ایجاد کنید.

  1. در کنسول، به Document AI Platform Overview بروید
  2. روی Create Processor کلیک کرده و Form Parser را انتخاب کنید پردازنده ها
  3. نام پردازنده را مشخص کنید و منطقه خود را از لیست انتخاب کنید.
  4. برای ایجاد پردازنده خود روی Create کلیک کنید
  5. شناسه پردازنده خود را کپی کنید. بعدا باید از این در کد خود استفاده کنید.

تست پردازنده در Cloud Console

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

فرم سلامت

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

4. نمونه فرم را دانلود کنید

ما یک سند نمونه داریم که حاوی یک فرم دریافت پزشکی ساده است.

با استفاده از لینک زیر می توانید پی دی اف را دانلود کنید. سپس آن را در نمونه Cloud Shell آپلود کنید .

یا می‌توانید آن را از Google Cloud Storage Bucket با استفاده از gsutil بارگیری کنید.

gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/intake-form.pdf .

با استفاده از دستور زیر تأیید کنید که فایل در Cloud Shell شما دانلود شده است:

ls -ltr intake-form.pdf

5. جفت های کلید/مقدار فرم را استخراج کنید

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

پردازش آنلاین برای ارسال یک سند واحد و انتظار برای پاسخ است. همچنین اگر می‌خواهید چندین فایل ارسال کنید یا اندازه فایل از حداکثر صفحات پردازش آنلاین بیشتر است، می‌توانید از پردازش دسته‌ای استفاده کنید. می توانید نحوه انجام این کار را در OCR Codelab مرور کنید.

کد درخواست فرآیند برای هر نوع پردازنده به غیر از شناسه پردازنده یکسان است.

شیء پاسخ سند حاوی فهرستی از صفحات از سند ورودی است.

هر شی page حاوی لیستی از فیلدهای فرم و مکان آنها در متن است.

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

یک فایل به نام form_parser.py ایجاد کنید و از کد زیر استفاده کنید.

form_parser.py

import pandas as pd
from google.cloud import documentai_v1 as documentai


def online_process(
    project_id: str,
    location: str,
    processor_id: str,
    file_path: str,
    mime_type: str,
) -> documentai.Document:
    """
    Processes a document using the Document AI Online Processing API.
    """

    opts = {"api_endpoint": f"{location}-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # 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 = documentai_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 = documentai_client.process_document(request=request)

        return result.document


def trim_text(text: str):
    """
    Remove extra space characters from text (blank, newline, tab, etc.)
    """
    return text.strip().replace("\n", " ")


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

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

document = online_process(
    project_id=PROJECT_ID,
    location=LOCATION,
    processor_id=PROCESSOR_ID,
    file_path=FILE_PATH,
    mime_type=MIME_TYPE,
)

names = []
name_confidence = []
values = []
value_confidence = []

for page in document.pages:
    for field in page.form_fields:
        # Get the extracted field names
        names.append(trim_text(field.field_name.text_anchor.content))
        # Confidence - How "sure" the Model is that the text is correct
        name_confidence.append(field.field_name.confidence)

        values.append(trim_text(field.field_value.text_anchor.content))
        value_confidence.append(field.field_value.confidence)

# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
    {
        "Field Name": names,
        "Field Name Confidence": name_confidence,
        "Field Value": values,
        "Field Value Confidence": value_confidence,
    }
)

print(df)

اکنون کد خود را اجرا کنید و باید متن استخراج شده و چاپ شده را در کنسول خود مشاهده کنید.

در صورت استفاده از سند نمونه ما باید خروجی زیر را ببینید:

$ python3 form_parser.py
                                           Field Name  Field Name Confidence                                        Field Value  Field Value Confidence
0                                            Phone #:               0.999982                                     (906) 917-3486                0.999982
1                                  Emergency Contact:               0.999972                                         Eva Walker                0.999972
2                                     Marital Status:               0.999951                                             Single                0.999951
3                                             Gender:               0.999933                                                  F                0.999933
4                                         Occupation:               0.999914                                  Software Engineer                0.999914
5                                        Referred By:               0.999862                                               None                0.999862
6                                               Date:               0.999858                                            9/14/19                0.999858
7                                                DOB:               0.999716                                         09/04/1986                0.999716
8                                            Address:               0.999147                                     24 Barney Lane                0.999147
9                                               City:               0.997718                                             Towaco                0.997718
10                                              Name:               0.997345                                       Sally Walker                0.997345
11                                             State:               0.996944                                                 NJ                0.996944
...

6. جداول را تجزیه کنید

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

دانلود فرم نمونه با جداول

ما یک سند نمونه داریم که شامل یک فرم نمونه و یک جدول است.

با استفاده از لینک زیر می توانید پی دی اف را دانلود کنید. سپس آن را در نمونه Cloud Shell آپلود کنید .

یا می‌توانید آن را از Google Cloud Storage Bucket با استفاده از gsutil بارگیری کنید.

gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/form_with_tables.pdf .

با استفاده از دستور زیر تأیید کنید که فایل در Cloud Shell شما دانلود شده است:

ls -ltr form_with_tables.pdf

استخراج داده های جدول

درخواست پردازش برای داده های جدول دقیقاً مشابه استخراج جفت های کلید-مقدار است. تفاوت این است که از کدام فیلدها داده ها را در پاسخ استخراج می کنیم. داده های جدول در قسمت pages[].tables[] ذخیره می شود.

این مثال اطلاعات مربوط به ردیف‌های سرصفحه جدول و ردیف‌های بدنه هر جدول و صفحه را استخراج می‌کند، سپس جدول را چاپ می‌کند و جدول را به‌عنوان یک فایل CSV ذخیره می‌کند.

یک فایل به نام table_parsing.py ایجاد کنید و از کد زیر استفاده کنید.

table_parsing.py

# type: ignore[1]
"""
Uses Document AI online processing to call a form parser processor
Extracts the tables and data in the document.
"""
from os.path import splitext
from typing import List, Sequence

import pandas as pd
from google.cloud import documentai


def online_process(
    project_id: str,
    location: str,
    processor_id: str,
    file_path: str,
    mime_type: str,
) -> documentai.Document:
    """
    Processes a document using the Document AI Online Processing API.
    """

    opts = {"api_endpoint": f"{location}-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # 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 = documentai_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 = documentai_client.process_document(request=request)

        return result.document


def get_table_data(
    rows: Sequence[documentai.Document.Page.Table.TableRow], text: str
) -> List[List[str]]:
    """
    Get Text data from table rows
    """
    all_values: List[List[str]] = []
    for row in rows:
        current_row_values: List[str] = []
        for cell in row.cells:
            current_row_values.append(
                text_anchor_to_text(cell.layout.text_anchor, text)
            )
        all_values.append(current_row_values)
    return all_values


def text_anchor_to_text(text_anchor: documentai.Document.TextAnchor, text: str) -> str:
    """
    Document AI identifies table data by their offsets in the entirety of the
    document's text. This function converts offsets to a string.
    """
    response = ""
    # If a text segment spans several lines, it will
    # be stored in different text segments.
    for segment in text_anchor.text_segments:
        start_index = int(segment.start_index)
        end_index = int(segment.end_index)
        response += text[start_index:end_index]
    return response.strip().replace("\n", " ")


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "FORM_PARSER_ID"  # Create processor before running sample

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

document = online_process(
    project_id=PROJECT_ID,
    location=LOCATION,
    processor_id=PROCESSOR_ID,
    file_path=FILE_PATH,
    mime_type=MIME_TYPE,
)

header_row_values: List[List[str]] = []
body_row_values: List[List[str]] = []

# Input Filename without extension
output_file_prefix = splitext(FILE_PATH)[0]

for page in document.pages:
    for index, table in enumerate(page.tables):
        header_row_values = get_table_data(table.header_rows, document.text)
        body_row_values = get_table_data(table.body_rows, document.text)

        # Create a Pandas Dataframe to print the values in tabular format.
        df = pd.DataFrame(
            data=body_row_values,
            columns=pd.MultiIndex.from_arrays(header_row_values),
        )

        print(f"Page {page.page_number} - Table {index}")
        print(df)

        # Save each table as a CSV file
        output_filename = f"{output_file_prefix}_pg{page.page_number}_tb{index}.csv"
        df.to_csv(output_filename, index=False)

اکنون کد خود را اجرا کنید و باید متن استخراج شده و چاپ شده را در کنسول خود مشاهده کنید.

در صورت استفاده از سند نمونه ما باید خروجی زیر را ببینید:

$ python3 table_parsing.py
Page 1 - Table 0
     Item    Description
0  Item 1  Description 1
1  Item 2  Description 2
2  Item 3  Description 3
Page 1 - Table 1
  Form Number:     12345678
0   Form Date:   2020/10/01
1        Name:   First Last
2     Address:  123 Fake St

همچنین باید دو فایل CSV جدید در دایرکتوری که کد را از آن اجرا می کنید داشته باشید.

$ ls
form_with_tables_pg1_tb0.csv form_with_tables_pg1_tb1.csv table_parsing.py

7. تبریک می گویم

تبریک می‌گوییم، شما با موفقیت از Document AI API برای استخراج داده‌ها از یک فرم دست‌نویس استفاده کردید. ما شما را تشویق می کنیم که با سایر اسناد فرم آزمایش کنید.

پاک کردن

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

  • در Cloud Console، به صفحه مدیریت منابع بروید.
  • در لیست پروژه، پروژه خود را انتخاب کنید و سپس روی Delete کلیک کنید.
  • در گفتگو، ID پروژه را تایپ کنید و سپس بر روی Shut down کلیک کنید تا پروژه حذف شود.

بیشتر بدانید

با این Codelab های بعدی به یادگیری در مورد Document AI ادامه دهید.

منابع

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.