1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية استخدام أداة Document AI الجديدة في النموذج لتحليل نموذج مكتوب بخط اليد باستخدام لغة Python.
سنستخدم نموذج طلب طبي بسيط كمثال، ولكن سيعمل هذا الإجراء مع أي نموذج معمّم يتوافق مع مستند DocAI.
المتطلبات الأساسية
يعتمد هذا الدرس التطبيقي حول الترميز على المحتوى المقدَّم في الدروس التطبيقية الأخرى حول الترميز الخاص بالذكاء الاصطناعي للمستندات.
ننصحك بإكمال الدروس التطبيقية التالية حول الترميز قبل المتابعة.
المعلومات التي ستطّلع عليها
- كيفية تحليل البيانات واستخراجها من نموذج تم مسحه ضوئيًا باستخدام المحلِّل اللغوي للنماذج المستنِدة إلى الذكاء الاصطناعي (Document AI)
المتطلبات
استطلاع
كيف ستستخدم هذا البرنامج التعليمي؟
كيف تقيّم تجربتك مع Python؟
ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud؟
2. الإعداد والمتطلبات
يفترض هذا الدرس التطبيقي حول الترميز أنّك أكملت خطوات إعداد Document AI الموضحة في الدرس التطبيقي حول الترميز باستخدام تكنولوجيا الذكاء الاصطناعي (OCR) للمستندات.
يُرجى إكمال الخطوات التالية قبل المتابعة:
ستحتاج أيضًا إلى تثبيت Pandas، وهي مكتبة تحليل بيانات مفتوحة المصدر للغة Python.
pip3 install --upgrade pandas
3- إنشاء معالج محلل نماذج للنماذج
يجب أولاً إنشاء مثيل لمعالِج النماذج اللغوية لاستخدام الأداة في Document AI Platform لهذا البرنامج التعليمي.
- في وحدة التحكّم، انتقِل إلى Document AI Platform Overview
- انقر على إنشاء معالج واختَر النموذج اللغوي للنموذج.
- حدِّد اسم معالج بيانات واختَر منطقتك من القائمة.
- انقر على إنشاء لإنشاء المعالج
- انسخ رقم تعريف معالج البيانات. يجب استخدام هذا في الرمز لاحقًا.
اختبار المعالج في Cloud Console
يمكنك اختبار المعالج في وحدة التحكم من خلال تحميل مستند. انقر على تحميل المستند واختَر نموذجًا لتحليله. يمكنك تنزيل هذا النموذج واستخدامه إذا لم يكن لديك نموذج متاح للاستخدام.
يجب أن تبدو مخرجاتك على هذا النحو:
4. تنزيل عيّنة النموذج
لدينا نموذج مستند يحتوي على نموذج بسيط للأخذ الطبي.
يمكنك تنزيل ملف PDF باستخدام الرابط التالي. بعد ذلك، يمكنك تحميله إلى مثيل 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- استخراج أزواج المفتاح/القيمة للنماذج
في هذه الخطوة، ستستخدم واجهة برمجة تطبيقات المعالجة عبر الإنترنت لاستدعاء معالج تحليل النماذج الذي أنشأته سابقًا. بعد ذلك، ستستخرج أزواج القيم الرئيسية المتوفّرة في المستند.
تُستخدم المعالجة على الإنترنت لإرسال مستند واحد وانتظار الردّ. يمكنك أيضًا استخدام المعالجة على دفعات إذا كنت تريد إرسال عدة ملفات أو إذا تجاوز حجم الملف الحد الأقصى للمعالجة على الإنترنت للصفحات. يمكنك الاطّلاع على كيفية إجراء ذلك في الدرس التطبيقي حول ترميز التعرّف البصري على الأحرف.
يكون رمز تقديم طلب العملية مطابقًا لكل أنواع معالج البيانات باستثناء رقم تعريف معالج البيانات.
يحتوي كائن الاستجابة المستند على قائمة بالصفحات من مستند الإدخال.
يحتوي كل عنصر 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- طاولات التحليل
يمكن للمحلل اللغوي للنماذج أيضًا استخراج البيانات من الجداول داخل المستندات. في هذه الخطوة، سيتم تنزيل نموذج مستند جديد واستخراج البيانات من الجدول. ونظرًا لأننا نحمّل البيانات إلى Pandas، يمكن إخراج هذه البيانات إلى ملف CSV والعديد من التنسيقات الأخرى باستخدام استدعاء طريقة واحدة.
تنزيل نموذج النموذج الذي يحتوي على الجداول
لدينا نموذج مستند يحتوي على نموذج وجدول.
يمكنك تنزيل ملف PDF باستخدام الرابط التالي. بعد ذلك، يمكنك تحميله إلى مثيل 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، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر مشروعك ثم انقر على "حذف".
- في مربع الحوار، اكتب معرّف المشروع ثم انقر على "إيقاف التشغيل" لحذف المشروع.
مزيد من المعلومات
يمكنك مواصلة التعرّف على مزيد من المعلومات حول Document AI من خلال هذه الدروس التطبيقية حول الترميز.
- معالجات متخصّصة تستخدم الذكاء الاصطناعي للمستندات (Python)
- إدارة معالجات الذكاء الاصطناعي للمستندات باستخدام Python
- الذكاء الاصطناعي المستند إلى الذكاء الاصطناعي: Human in the Loop
المراجع
- مستندات الذكاء الاصطناعي للمستندات
- مكتبة برامج Python المستندة إلى الذكاء الاصطناعي (AI)
- نماذج الذكاء الاصطناعي للمستندات
الترخيص
هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.