1. מבוא
ב-codelab הזה תלמדו איך להשתמש במעבדים מיוחדים של Document AI כדי לסווג ולנתח מסמכים מיוחדים באמצעות Python. לצורך הסיווג והפיצול, נשתמש בקובץ PDF לדוגמה שמכיל חשבוניות, קבלות ודפי חשבון של שירותים. לאחר מכן, לצורך הניתוח והפקת הישויות, נשתמש בחשבונית כדוגמה.
ההליך וקוד הדוגמה האלה יפעלו עם כל מסמך ייעודי שנתמך על ידי Document AI.
דרישות מוקדמות
ה-Codelab הזה מבוסס על תוכן שמוצג ב-Codelabs אחרים של Document AI.
מומלץ להשלים את ה-Codelabs הבאים לפני שממשיכים:
מה תלמדו
- איך לסווג ולזהות נקודות פיצול במסמכים מיוחדים.
- איך מחלצים ישויות עם סכימה באמצעות מעבדים ייעודיים.
מה תצטרכו
2. תהליך ההגדרה
ב-Codelab הזה מניחים שהשלמתם את שלבי ההגדרה של Document AI שמפורטים ב-Codelab המבואי.
לפני שממשיכים, צריך לבצע את הפעולות הבאות:
תצטרכו גם להתקין את Pandas, ספרייה פופולרית לניתוח נתונים ב-Python.
pip3 install --upgrade pandas
3. יצירת מעבדים ייעודיים
קודם צריך ליצור מופעים של המעבדים שבהם תשתמשו במדריך הזה.
- במסוף, עוברים אל Document AI Platform Overview.
- לוחצים על Create Processor (יצירת מעבד), גוללים למטה אל Specialized (ייעודי) ובוחרים באפשרות Procurement Doc Splitter (פיצול מסמכי רכש).
- נותנים לו את השם codelab-procurement-splitter (או שם אחר שתזכרו) ובוחרים את האזור הכי קרוב ברשימה.
- לוחצים על יצירה כדי ליצור את המעבד.
- מעתיקים את מזהה המעבד. תצטרכו להשתמש בערך הזה בקוד בהמשך.
- חוזרים על שלבים 2 עד 6 עם Invoice Parser (אפשר לתת לו את השם codelab-invoice-parser)
בדיקת המעבד במסוף
כדי לבדוק את הכלי לניתוח חשבוניות במסוף, אפשר להעלות מסמך.
לוחצים על 'העלאת מסמך' ובוחרים חשבונית לניתוח. אם אין לכם חשבונית זמינה, אתם יכולים להוריד את החשבונית לדוגמה הזו ולהשתמש בה.

הפלט אמור להיראות כך:

4. הורדת מסמכים לדוגמה
יש לנו כמה מסמכים לדוגמה לשימוש בשיעור ה-Lab הזה.
אפשר להוריד את קובצי ה-PDF באמצעות הקישורים הבאים. לאחר מכן מעלים אותם למופע Cloud Shell.
לחלופין, אפשר להוריד אותם מקטגוריה של Cloud Storage הציבורית שלנו באמצעות gsutil.
gsutil cp gs://cloud-samples-data/documentai/codelabs/specialized-processors/procurement_multi_document.pdf .
gsutil cp gs://cloud-samples-data/documentai/codelabs/specialized-processors/google_invoice.pdf .
5. סיווג ופיצול המסמכים
בשלב הזה תשתמשו ב-API לעיבוד אונליין כדי לסווג ולזהות נקודות פיצול לוגיות במסמך מרובה דפים.
אפשר להשתמש ב-API לעיבוד קבוצות אם רוצים לשלוח כמה קבצים או אם גודל הקובץ חורג מהמספר המקסימלי של דפים לעיבוד אונליין. ב-Document AI OCR Codelab מוסבר איך עושים את זה.
הקוד לשליחת בקשת API זהה למעבד כללי, מלבד מזהה המעבד.
Procurement Splitter/Classifier
יוצרים קובץ בשם classification.py ומשתמשים בקוד שבהמשך.
מחליפים את PROCUREMENT_SPLITTER_ID במזהה של מעבד פיצול הרכש שיצרתם קודם. מחליפים את YOUR_PROJECT_ID ו-YOUR_PROJECT_LOCATION במזהה הפרויקט ב-Cloud ובמיקום המעבד בהתאמה.
classification.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 file:
file_content = file.read()
# Load Binary Data into Document AI RawDocument Object
raw_document = documentai.RawDocument(content=file_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
PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION" # Format is 'us' or 'eu'
PROCESSOR_ID = "PROCUREMENT_SPLITTER_ID" # Create processor in Cloud Console
# The local file in your current working directory
FILE_PATH = "procurement_multi_document.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,
)
print("Document processing complete.")
types = []
confidence = []
pages = []
# Each Document.entity is a classification
for entity in document.entities:
classification = entity.type_
types.append(classification)
confidence.append(f"{entity.confidence:.0%}")
# entity.page_ref contains the pages that match the classification
pages_list = []
for page_ref in entity.page_anchor.page_refs:
pages_list.append(page_ref.page)
pages.append(pages_list)
# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame({"Classification": types, "Confidence": confidence, "Pages": pages})
print(df)
הפלט אמור להיראות כך:
$ python3 classification.py
Document processing complete.
Classification Confidence Pages
0 invoice_statement 100% [0]
1 receipt_statement 98% [1]
2 other 81% [2]
3 utility_statement 100% [3]
4 restaurant_statement 100% [4]
שימו לב: הכלי Procurement Splitter/Classifier (מפצל/מסווג רכש) זיהה נכון את סוגי המסמכים בדפים 0-1 ו-3-4.
דף 2 מכיל טופס רפואי כללי לקבלת מידע, ולכן המסווג זיהה אותו בצורה נכונה כ-other.
6. חילוץ הישויות
עכשיו אפשר לחלץ מהקבצים את הישויות שנוצרו לפי סכימה, כולל ציוני מהימנות, מאפיינים וערכים מנורמלים.
הקוד לביצוע בקשת ה-API זהה לקוד בשלב הקודם, ואפשר לבצע את הבקשה באינטרנט או באמצעות בקשות אצווה.
אנחנו ניגש למידע הבא מהישויות:
- סוג הישות
- (לדוגמה,
invoice_date,receiver_name,total_amount)
- (לדוגמה,
- ערכים גולמיים
- ערכי הנתונים כפי שהם מוצגים בקובץ המסמך המקורי.
- ערכים מנורמלים
- ערכי נתונים בפורמט רגיל וסטנדרטי, אם רלוונטי.
- יכול לכלול גם העשרה מ-Enterprise Knowledge Graph
- ערכי מהימנות
- עד כמה המודל בטוח שהערכים מדויקים.
סוגים מסוימים של ישויות, כמו line_item, יכולים לכלול גם מאפיינים שהם ישויות מוטמעות כמו line_item/unit_price ו-line_item/description.
בדוגמה הזו, המבנה המקונן מפושט כדי שיהיה קל יותר לצפות בו.
כלי לניתוח חשבוניות
יוצרים קובץ בשם extraction.py ומשתמשים בקוד שבהמשך.
מחליפים את INVOICE_PARSER_ID במזהה של מעבד ניתוח החשבוניות שיצרתם קודם, ומשתמשים בקובץ google_invoice.pdf
extraction.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 file:
file_content = file.read()
# Load Binary Data into Document AI RawDocument Object
raw_document = documentai.RawDocument(content=file_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
PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION" # Format is 'us' or 'eu'
PROCESSOR_ID = "INVOICE_PARSER_ID" # Create processor in Cloud Console
# The local file in your current working directory
FILE_PATH = "google_invoice.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,
)
types = []
raw_values = []
normalized_values = []
confidence = []
# Grab each key/value pair and their corresponding confidence scores.
for entity in document.entities:
types.append(entity.type_)
raw_values.append(entity.mention_text)
normalized_values.append(entity.normalized_value.text)
confidence.append(f"{entity.confidence:.0%}")
# Get Properties (Sub-Entities) with confidence scores
for prop in entity.properties:
types.append(prop.type_)
raw_values.append(prop.mention_text)
normalized_values.append(prop.normalized_value.text)
confidence.append(f"{prop.confidence:.0%}")
# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
{
"Type": types,
"Raw Value": raw_values,
"Normalized Value": normalized_values,
"Confidence": confidence,
}
)
print(df)
הפלט אמור להיראות כך:
$ python3 extraction.py
Type Raw Value Normalized Value Confidence
0 vat $1,767.97 100%
1 vat/tax_amount $1,767.97 1767.97 USD 0%
2 invoice_date Sep 24, 2019 2019-09-24 99%
3 due_date Sep 30, 2019 2019-09-30 99%
4 total_amount 19,647.68 19647.68 97%
5 total_tax_amount $1,767.97 1767.97 USD 92%
6 net_amount 22,379.39 22379.39 91%
7 receiver_name Jane Smith, 83%
8 invoice_id 23413561D 67%
9 receiver_address 1600 Amphitheatre Pkway\nMountain View, CA 94043 66%
10 freight_amount $199.99 199.99 USD 56%
11 currency $ USD 53%
12 supplier_name John Smith 19%
13 purchase_order 23413561D 1%
14 receiver_tax_id 23413561D 0%
15 supplier_iban 23413561D 0%
16 line_item 9.99 12 12 ft HDMI cable 119.88 100%
17 line_item/unit_price 9.99 9.99 90%
18 line_item/quantity 12 12 77%
19 line_item/description 12 ft HDMI cable 39%
20 line_item/amount 119.88 119.88 92%
21 line_item 12 399.99 27" Computer Monitor 4,799.88 100%
22 line_item/quantity 12 12 80%
23 line_item/unit_price 399.99 399.99 91%
24 line_item/description 27" Computer Monitor 15%
25 line_item/amount 4,799.88 4799.88 94%
26 line_item Ergonomic Keyboard 12 59.99 719.88 100%
27 line_item/description Ergonomic Keyboard 32%
28 line_item/quantity 12 12 76%
29 line_item/unit_price 59.99 59.99 92%
30 line_item/amount 719.88 719.88 94%
31 line_item Optical mouse 12 19.99 239.88 100%
32 line_item/description Optical mouse 26%
33 line_item/quantity 12 12 78%
34 line_item/unit_price 19.99 19.99 91%
35 line_item/amount 239.88 239.88 94%
36 line_item Laptop 12 1,299.99 15,599.88 100%
37 line_item/description Laptop 83%
38 line_item/quantity 12 12 76%
39 line_item/unit_price 1,299.99 1299.99 90%
40 line_item/amount 15,599.88 15599.88 94%
41 line_item Misc processing fees 899.99 899.99 1 100%
42 line_item/description Misc processing fees 22%
43 line_item/unit_price 899.99 899.99 91%
44 line_item/amount 899.99 899.99 94%
45 line_item/quantity 1 1 63%
7. אופציונלי: ניסיון של מעבדים מיוחדים אחרים
השתמשתם בהצלחה ב-Document AI לניהול רכש כדי לסווג מסמכים ולנתח חשבונית. Document AI תומך גם בפתרונות המיוחדים האחרים שמפורטים כאן:
אפשר לפעול לפי אותה פרוצדורה ולהשתמש באותו קוד כדי לטפל בכל מעבד ייעודי.
אם רוצים לנסות את הפתרונות המיוחדים האחרים, אפשר להריץ מחדש את המעבדה עם סוגים אחרים של מעבדים ומסמכים לדוגמה.
מסמכים לדוגמה
הנה כמה מסמכים לדוגמה שבהם אפשר להשתמש כדי לנסות את המעבדים המיוחדים האחרים.
המוצר | סוג מעבד | מסמך |
זהויות | ||
הלוואות | ||
הלוואות | ||
חוזים |
דוגמאות נוספות למסמכים ולפלט של מעבד זמינות בתיעוד.
8. מזל טוב
הצלחת להשתמש ב-Document AI כדי לסווג ולחלץ נתונים ממסמכים ייעודיים. מומלץ לנסות סוגים אחרים של מסמכים ייעודיים.
ניקוי נתונים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה:
- במסוף Cloud, נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט ולוחצים על Delete (מחיקה).
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מידע נוסף
כדי להמשיך ללמוד על Document AI, אפשר לעבור לשיעורי ה-Codelab הבאים.
- ניהול מעבדים של Document AI באמצעות Python
- Document AI: האדם שבתהליך
- Document AI Workbench: Uptraining
- Document AI Workbench: Custom Processors
מקורות מידע
- העתיד של מסמכים – פלייליסט ב-YouTube
- מסמכי תיעוד בנושא Document AI
- ספריית לקוח Python של Document AI
- דוגמאות לשימוש ב-Document AI
רישיון
עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.