1. مقدمه
در این کد لبه، نحوه استفاده از Document AI Form Parser برای تجزیه یک فرم دست نویس با پایتون را خواهید آموخت.
ما از یک فرم دریافت پزشکی ساده به عنوان مثال استفاده خواهیم کرد، اما این روش با هر فرم عمومی پشتیبانی شده توسط DocAI کار می کند.
پیش نیازها
این کد لبه بر محتوای ارائه شده در سایر Codelab های هوش مصنوعی سند ساخته شده است.
توصیه می شود قبل از ادامه، Codelabs زیر را تکمیل کنید.
چیزی که یاد خواهید گرفت
- نحوه تجزیه و استخراج داده ها از فرم اسکن شده با استفاده از تجزیه کننده فرم AI سند.
آنچه شما نیاز دارید
نظرسنجی
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با پایتون چگونه ارزیابی می کنید؟
تجربه خود را در استفاده از خدمات Google Cloud چگونه ارزیابی می کنید؟
2. راه اندازی و الزامات
این کد لبه فرض میکند که شما مراحل راهاندازی Document AI فهرستشده در Document AI OCR Codelab را تکمیل کردهاید.
لطفا قبل از ادامه مراحل زیر را انجام دهید:
همچنین باید Pandas را نصب کنید، یک کتابخانه تجزیه و تحلیل داده منبع باز برای پایتون.
pip3 install --upgrade pandas
3. یک پردازشگر Form Parser ایجاد کنید
ابتدا باید یک نمونه پردازشگر Form Parser برای استفاده در Document AI Platform برای این آموزش ایجاد کنید.
- در کنسول، به Document AI Platform Overview بروید
- روی Create Processor کلیک کرده و Form Parser را انتخاب کنید
- نام پردازنده را مشخص کنید و منطقه خود را از لیست انتخاب کنید.
- برای ایجاد پردازنده خود روی Create کلیک کنید
- شناسه پردازنده خود را کپی کنید. بعدا باید از این در کد خود استفاده کنید.
تست پردازنده در 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 ادامه دهید.
- پردازنده های تخصصی با Document AI (Python)
- مدیریت پردازشگرهای هوش مصنوعی سند با پایتون
- سند هوش مصنوعی: انسان در حلقه
منابع
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.