1. บทนำ
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้โปรแกรมแยกวิเคราะห์แบบฟอร์ม AI ของเอกสารเพื่อแยกวิเคราะห์แบบฟอร์มที่เขียนด้วยลายมือด้วย Python
เราจะใช้แบบฟอร์มข้อมูลทางการแพทย์ง่ายๆ เป็นตัวอย่าง แต่กระบวนการนี้จะใช้ได้กับรูปแบบทั่วไปที่ DocAI รองรับ
ข้อกำหนดเบื้องต้น
Codelab นี้สร้างขึ้นจากเนื้อหาที่แสดงใน Codelab อื่นๆ สำหรับ Document AI
เราขอแนะนำให้คุณทำ Codelab ต่อไปนี้ให้เสร็จก่อนดำเนินการต่อ
สิ่งที่คุณจะได้เรียนรู้
- วิธีแยกวิเคราะห์และแยกข้อมูลจากแบบฟอร์มที่สแกนโดยใช้โปรแกรมแยกวิเคราะห์แบบฟอร์ม Document AI
สิ่งที่คุณต้องมี
แบบสำรวจ
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งาน Python อย่างไร
คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร
2. การตั้งค่าและข้อกำหนด
Codelab นี้จะจะถือว่าคุณได้ทำตามขั้นตอนการตั้งค่า Document AI ใน Document AI OCR Codelab เรียบร้อยแล้ว
โปรดทำตามขั้นตอนต่อไปนี้ก่อนดำเนินการต่อ
และจะต้องติดตั้ง Pandas ซึ่งเป็นไลบรารีการวิเคราะห์ข้อมูลโอเพนซอร์สสำหรับ Python ด้วย
pip3 install --upgrade pandas
3. สร้างตัวประมวลผลโปรแกรมแยกวิเคราะห์แบบฟอร์ม
คุณต้องสร้างอินสแตนซ์ตัวประมวลผลฟอร์มโปรแกรมแยกวิเคราะห์เพื่อใช้ใน Document AI Platform ก่อนสำหรับบทแนะนำนี้
- ในคอนโซล ให้ไปที่ภาพรวมของ Document AI Platform
- คลิกสร้างตัวประมวลผลแล้วเลือกโปรแกรมแยกวิเคราะห์แบบฟอร์ม
- ระบุชื่อผู้ประมวลผลข้อมูลและเลือกภูมิภาคของคุณจากรายการ
- คลิกสร้างเพื่อสร้างโปรเซสเซอร์
- คัดลอกรหัสผู้ประมวลผลข้อมูล คุณต้องใช้สิ่งนี้ในรหัสในภายหลัง
ทดสอบผู้ประมวลผลข้อมูลใน Cloud Console
คุณสามารถทดสอบโปรเซสเซอร์ในคอนโซลได้โดยอัปโหลดเอกสาร คลิกอัปโหลดเอกสารและเลือกแบบฟอร์มที่จะแยกวิเคราะห์ คุณจะดาวน์โหลดและใช้ตัวอย่างแบบฟอร์มได้หากไม่มีแบบฟอร์มให้ใช้
เอาต์พุตควรมีลักษณะดังนี้
4. ดาวน์โหลดแบบฟอร์มตัวอย่าง
เรามีเอกสารตัวอย่างซึ่งประกอบด้วยแบบฟอร์มข้อมูลทางการแพทย์ที่ไม่ซับซ้อน
คุณดาวน์โหลดไฟล์ PDF ได้โดยใช้ลิงก์ต่อไปนี้ จากนั้นอัปโหลดไปยังอินสแตนซ์ Cloud Shell
หรือคุณจะดาวน์โหลดจากที่เก็บข้อมูล Google Cloud Storage สาธารณะของเราโดยใช้ gsutil
ก็ได้
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/intake-form.pdf .
ตรวจสอบว่าดาวน์โหลดไฟล์ไปยัง Cloud Shell แล้วโดยใช้คำสั่งต่อไปนี้
ls -ltr intake-form.pdf
5. ดึงข้อมูลคู่คีย์/ค่าของแบบฟอร์ม
ในขั้นตอนนี้ คุณจะใช้ API การประมวลผลออนไลน์เพื่อเรียกใช้เครื่องมือแยกวิเคราะห์แบบฟอร์มที่คุณสร้างขึ้นก่อนหน้านี้ จากนั้นจึงแยกคู่คีย์-ค่าที่พบในเอกสาร
การประมวลผลออนไลน์มีไว้สำหรับส่งเอกสาร 1 รายการและรอการตอบกลับ นอกจากนี้คุณยังใช้การประมวลผลแบบกลุ่มได้หากต้องการส่งไฟล์หลายไฟล์ หรือหากขนาดไฟล์เกินการประมวลผลหน้าเว็บสูงสุดทางออนไลน์ ดูวิธีการได้ที่ OCR Codelab
รหัสสำหรับส่งคำขอกระบวนการจะเหมือนกันสำหรับโปรเซสเซอร์ทุกประเภท นอกเหนือจากรหัสผู้ประมวลผลข้อมูล
ออบเจ็กต์การตอบกลับเอกสารมีรายการหน้าจากเอกสารอินพุต
ออบเจ็กต์ page
แต่ละรายการจะมีรายการช่องข้อมูลในแบบฟอร์มและตำแหน่งในข้อความ
โค้ดต่อไปนี้จะทำซ้ำในแต่ละหน้าและแยกคีย์ ค่า และคะแนนความเชื่อมั่นแต่ละรายการ โดยข้อมูลนี้เป็น Structured Data ซึ่งสามารถจัดเก็บในฐานข้อมูลหรือใช้ในแอปพลิเคชันอื่นได้ง่ายขึ้น
สร้างไฟล์ชื่อ 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 สาธารณะของเราโดยใช้ 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 ใหม่อีก 2 ไฟล์ในไดเรกทอรีต้นทางที่เรียกใช้โค้ด
$ 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 ต่อไปด้วย Codelab ติดตามผลเหล่านี้
- โปรเซสเซอร์เฉพาะทางที่มี Document AI (Python)
- การจัดการตัวประมวลผล Document AI ด้วย Python
- Document AI: การทำงานของมนุษย์
แหล่งข้อมูล
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0