ডকুমেন্ট এআই (পাইথন) সহ ফর্ম পার্সিং

1. ভূমিকা

এই কোডল্যাবে, আপনি শিখবেন কিভাবে ডকুমেন্ট এআই ফর্ম পার্সার ব্যবহার করে পাইথনের সাথে একটি হাতে লেখা ফর্ম পার্স করতে হয়।

আমরা উদাহরণ হিসেবে একটি সাধারণ চিকিৎসা গ্রহণের ফর্ম ব্যবহার করব, কিন্তু এই পদ্ধতিটি DocAI দ্বারা সমর্থিত যেকোনো সাধারণ ফর্মের সাথে কাজ করবে।

পূর্বশর্ত

এই কোডল্যাব অন্যান্য ডকুমেন্ট এআই কোডল্যাবে উপস্থাপিত বিষয়বস্তুর উপর তৈরি করে।

এটি সুপারিশ করা হয় যে আপনি এগিয়ে যাওয়ার আগে নিম্নলিখিত কোডল্যাবগুলি সম্পূর্ণ করুন৷

আপনি কি শিখবেন

  • ডকুমেন্ট এআই ফর্ম পার্সার ব্যবহার করে কীভাবে স্ক্যান করা ফর্ম থেকে ডেটা পার্স এবং এক্সট্রাক্ট করবেন।

আপনি কি প্রয়োজন হবে

সমীক্ষা

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

পাইথনের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

আপনি Google ক্লাউড পরিষেবাগুলি ব্যবহার করার সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

2. সেটআপ এবং প্রয়োজনীয়তা

এই কোডল্যাব ধরে নেয় আপনি ডকুমেন্ট এআই ওসিআর কোডল্যাবে তালিকাভুক্ত ডকুমেন্ট এআই সেটআপ ধাপগুলি সম্পূর্ণ করেছেন।

এগিয়ে যাওয়ার আগে অনুগ্রহ করে নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

আপনাকে পান্ডাস ইনস্টল করতে হবে, পাইথনের জন্য একটি ওপেন সোর্স ডেটা বিশ্লেষণ লাইব্রেরি।

pip3 install --upgrade pandas

3. একটি ফর্ম পার্সার প্রসেসর তৈরি করুন

এই টিউটোরিয়ালের জন্য ডকুমেন্ট এআই প্ল্যাটফর্মে ব্যবহার করার জন্য আপনাকে প্রথমে একটি ফর্ম পার্সার প্রসেসর ইনস্ট্যান্স তৈরি করতে হবে।

  1. কনসোলে, ডকুমেন্ট এআই প্ল্যাটফর্ম ওভারভিউতে নেভিগেট করুন
  2. প্রসেসর তৈরি করুন ক্লিক করুন এবং ফর্ম পার্সার নির্বাচন করুন প্রসেসর
  3. একটি প্রসেসরের নাম উল্লেখ করুন এবং তালিকা থেকে আপনার অঞ্চল নির্বাচন করুন।
  4. আপনার প্রসেসর তৈরি করতে তৈরি করুন ক্লিক করুন
  5. আপনার প্রসেসর আইডি কপি করুন। আপনাকে অবশ্যই এটি আপনার কোডে ব্যবহার করতে হবে।

ক্লাউড কনসোলে প্রসেসর পরীক্ষা করুন

আপনি একটি নথি আপলোড করে কনসোলে আপনার প্রসেসর পরীক্ষা করতে পারেন। আপলোড নথিতে ক্লিক করুন এবং পার্স করার জন্য একটি ফর্ম নির্বাচন করুন৷ আপনি এই নমুনা ফর্ম ডাউনলোড এবং ব্যবহার করতে পারেন যদি আপনার ব্যবহার করার জন্য উপলব্ধ না থাকে।

স্বাস্থ্য ফর্ম

আপনার আউটপুট এটি দেখতে হবে: পার্স করা ফর্ম

4. নমুনা ফর্ম ডাউনলোড করুন

আমাদের কাছে একটি নমুনা নথি রয়েছে যাতে একটি সাধারণ চিকিৎসা গ্রহণের ফর্ম রয়েছে।

আপনি নীচের লিঙ্কটি ব্যবহার করে PDF ডাউনলোড করতে পারেন। তারপর এটি ক্লাউড শেল ইনস্ট্যান্সে আপলোড করুন

বিকল্পভাবে, আপনি gsutil ব্যবহার করে আমাদের সর্বজনীন Google ক্লাউড স্টোরেজ বাকেট থেকে এটি ডাউনলোড করতে পারেন।

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

নীচের কমান্ডটি ব্যবহার করে ফাইলটি আপনার ক্লাউড শেলে ডাউনলোড করা হয়েছে তা নিশ্চিত করুন:

ls -ltr intake-form.pdf

5. এক্সট্র্যাক্ট ফর্ম কী/মান পেয়ার

এই ধাপে আপনি পূর্বে তৈরি করা ফর্ম পার্সার প্রসেসরকে কল করতে অনলাইন প্রসেসিং API ব্যবহার করবেন। তারপর, আপনি নথিতে পাওয়া মূল মান জোড়াগুলি বের করবেন।

অনলাইন প্রক্রিয়াকরণ হল একটি একক নথি পাঠানো এবং প্রতিক্রিয়ার জন্য অপেক্ষা করা। আপনি যদি একাধিক ফাইল পাঠাতে চান বা ফাইলের আকার অনলাইন প্রসেসিং সর্বাধিক পৃষ্ঠাগুলি অতিক্রম করতে চান তবে আপনি ব্যাচ প্রক্রিয়াকরণ ব্যবহার করতে পারেন৷ আপনি OCR কোডল্যাবে এটি কীভাবে করবেন তা পর্যালোচনা করতে পারেন।

প্রসেসর আইডি বাদে প্রতিটি প্রসেসর টাইপের জন্য প্রসেস রিকোয়েস্ট করার কোড একই রকম।

ডকুমেন্ট রেসপন্স অবজেক্টে ইনপুট ডকুমেন্ট থেকে পৃষ্ঠাগুলির একটি তালিকা রয়েছে।

প্রতিটি 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 ফাইলে আউটপুট হতে পারে এবং একটি একক মেথড কল সহ অন্যান্য অনেক ফরম্যাটে।

টেবিল সহ নমুনা ফর্ম ডাউনলোড করুন

আমাদের কাছে একটি নমুনা নথি রয়েছে যাতে একটি নমুনা ফর্ম এবং একটি টেবিল রয়েছে।

আপনি নীচের লিঙ্কটি ব্যবহার করে PDF ডাউনলোড করতে পারেন। তারপর এটি ক্লাউড শেল ইনস্ট্যান্সে আপলোড করুন

বিকল্পভাবে, আপনি gsutil ব্যবহার করে আমাদের সর্বজনীন Google ক্লাউড স্টোরেজ বাকেট থেকে এটি ডাউনলোড করতে পারেন।

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

নীচের কমান্ডটি ব্যবহার করে ফাইলটি আপনার ক্লাউড শেলে ডাউনলোড করা হয়েছে তা নিশ্চিত করুন:

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. অভিনন্দন

অভিনন্দন, আপনি সফলভাবে একটি হাতে লেখা ফর্ম থেকে ডেটা বের করতে ডকুমেন্ট AI API ব্যবহার করেছেন। আমরা আপনাকে অন্যান্য ফর্ম নথির সাথে পরীক্ষা করার জন্য উত্সাহিত করি।

ক্লিন আপ

এই টিউটোরিয়ালে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে:

  • ক্লাউড কনসোলে, সম্পদ পরিচালনা পৃষ্ঠাতে যান।
  • প্রকল্প তালিকায়, আপনার প্রকল্প নির্বাচন করুন তারপর মুছুন ক্লিক করুন.
  • ডায়ালগে, প্রকল্প আইডি টাইপ করুন এবং তারপরে প্রকল্পটি মুছে ফেলতে শাট ডাউন ক্লিক করুন।

আরও জানুন

এই ফলো-আপ কোডল্যাবগুলির সাথে ডকুমেন্ট এআই সম্পর্কে শেখা চালিয়ে যান।

সম্পদ

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।