تحليل النماذج باستخدام الذكاء الاصطناعي (AI) للمستند (Python)

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية استخدام أداة Document AI الجديدة في النموذج لتحليل نموذج مكتوب بخط اليد باستخدام لغة Python.

سنستخدم نموذج طلب طبي بسيط كمثال، ولكن سيعمل هذا الإجراء مع أي نموذج معمّم يتوافق مع مستند DocAI.

المتطلبات الأساسية

يعتمد هذا الدرس التطبيقي حول الترميز على المحتوى المقدَّم في الدروس التطبيقية الأخرى حول الترميز الخاص بالذكاء الاصطناعي للمستندات.

ننصحك بإكمال الدروس التطبيقية التالية حول الترميز قبل المتابعة.

المعلومات التي ستطّلع عليها

  • كيفية تحليل البيانات واستخراجها من نموذج تم مسحه ضوئيًا باستخدام المحلِّل اللغوي للنماذج المستنِدة إلى الذكاء الاصطناعي (Document AI)

المتطلبات

  • مشروع على Google Cloud
  • متصفح، مثل Chrome أو Firefox
  • معرفة بايثون 3

استطلاع

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك مع Python؟

حديث متوسط بارع

ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud؟

حديث متوسط بارع

2. الإعداد والمتطلبات

يفترض هذا الدرس التطبيقي حول الترميز أنّك أكملت خطوات إعداد Document AI الموضحة في الدرس التطبيقي حول الترميز باستخدام تكنولوجيا الذكاء الاصطناعي (OCR) للمستندات.

يُرجى إكمال الخطوات التالية قبل المتابعة:

ستحتاج أيضًا إلى تثبيت Pandas، وهي مكتبة تحليل بيانات مفتوحة المصدر للغة Python.

pip3 install --upgrade pandas

3- إنشاء معالج محلل نماذج للنماذج

يجب أولاً إنشاء مثيل لمعالِج النماذج اللغوية لاستخدام الأداة في Document AI Platform لهذا البرنامج التعليمي.

  1. في وحدة التحكّم، انتقِل إلى Document AI Platform Overview
  2. انقر على إنشاء معالج واختَر النموذج اللغوي للنموذجالمعالجات.
  3. حدِّد اسم معالج بيانات واختَر منطقتك من القائمة.
  4. انقر على إنشاء لإنشاء المعالج
  5. انسخ رقم تعريف معالج البيانات. يجب استخدام هذا في الرمز لاحقًا.

اختبار المعالج في 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 من خلال هذه الدروس التطبيقية حول الترميز.

المراجع

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.