1. Introduzione
In questo codelab imparerai a utilizzare i processori specializzati di Document AI per classificare e analizzare documenti specializzati con Python. Per la classificazione e la suddivisione, utilizzeremo un file PDF di esempio contenente fatture, ricevute e estratti conto. Quindi, per l'analisi e l'estrazione delle entità, utilizzeremo una fattura come esempio.
Questa procedura e il codice di esempio funzionano con qualsiasi documento specializzato supportato da Document AI.
Prerequisiti
Questo codelab si basa sui contenuti presentati in altri codelab di Document AI.
Ti consigliamo di completare i seguenti codelab prima di procedere:
- Riconoscimento ottico dei caratteri (OCR) con Document AI e Python
- Analisi dei moduli con Document AI (Python)
Cosa imparerai a fare
- Come classificare e identificare i punti di suddivisione per documenti specializzati.
- Come estrarre entità schematizzate utilizzando processori specializzati.
Che cosa ti serve
2. Preparazione
Questo codelab presuppone che tu abbia completato i passaggi della configurazione di Document AI elencati nel Codelab introduttivo.
Completa i seguenti passaggi prima di procedere:
Dovrai anche installare Pandas, una popolare libreria di analisi dei dati per Python.
pip3 install --upgrade pandas
3. Crea processori specializzati
Devi prima creare le istanze dei processori che utilizzerai per questo tutorial.
- Nella console, vai a Document AI Platform Overview
- Fai clic su Crea processore, scorri verso il basso fino a Specializzato e seleziona Suddividi documenti di approvvigionamento.
- Assegna il nome "codelab-procurement-splitter" (o qualcos'altro che ricorderai) e seleziona la regione più vicina nell'elenco.
- Fai clic su Crea per creare il tuo processore
- Copia l'ID processore. Lo dovrai utilizzare nel tuo codice in un secondo momento.
- Ripeti i passaggi da 2 a 6 con l'analizzatore sintattico delle fatture (che puoi chiamare "codelab-invoice-parser")
Testa il processore nella console
Puoi provare l'analizzatore sintattico delle fatture nella console caricando un documento.
Fai clic su Carica documento e seleziona una fattura da analizzare. Puoi scaricare e utilizzare questa fattura di esempio se non ne hai una disponibile.
L'output dovrebbe avere il seguente aspetto:
4. Scarica documenti di esempio
Abbiamo alcuni documenti di esempio da utilizzare per questo lab.
Puoi scaricare i PDF utilizzando i seguenti link. Quindi caricali sull'istanza di Cloud Shell.
In alternativa, puoi scaricarli dal nostro bucket Cloud Storage pubblico utilizzando 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. Classifica e suddividere i documenti
In questo passaggio utilizzerai l'API di elaborazione online per classificare e rilevare punti di suddivisione logici per un documento di più pagine.
Puoi utilizzare l'API di elaborazione batch anche se vuoi inviare più file o se le dimensioni del file superano il numero massimo di pagine per l'elaborazione online. Puoi rivedere come eseguire questa operazione nel Codelab OCR di Document AI.
Il codice per effettuare la richiesta API è identico per un processore generale a parte l'ID processore.
Ripartitore/classificatore approvvigionamento
Crea un file denominato classification.py
e utilizza il codice riportato di seguito.
Sostituisci PROCUREMENT_SPLITTER_ID
con l'ID del processore di ripartizione dell'approvvigionamento che hai creato in precedenza. Sostituisci YOUR_PROJECT_ID
e YOUR_PROJECT_LOCATION
rispettivamente con il tuo ID progetto Cloud e la località del processore.
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)
Dovresti vedere un output simile al seguente:
$ 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]
Tieni presente che il separatore/classificatore approvvigionamento ha identificato correttamente i tipi di documenti alle pagine 0-1 e 3-4.
Pagina 2 contiene un modulo di assunzione per uso medico generico, pertanto il classificatore lo ha identificato correttamente come other
.
6. Estrarre le entità
Ora puoi estrarre le entità schematizzate dai file, inclusi punteggi di confidenza, proprietà e valori normalizzati.
Il codice per effettuare la richiesta API è identico al passaggio precedente e può essere eseguito con richieste online o batch.
Accederemo alle seguenti informazioni dalle entità:
- Tipo di persona giuridica
- (ad es.
invoice_date
,receiver_name
,total_amount
)
- (ad es.
- Valori non elaborati
- Valori dei dati presentati nel file del documento originale.
- Valori normalizzati
- Valori dei dati in formato normalizzato e standard, se applicabile.
- Può includere anche l'arricchimento da Enterprise Knowledge Graph
- Valori di confidenza
- Quanto "certo" del modello è che i valori sono accurati.
Alcuni tipi di entità, come line_item
, possono includere anche le proprietà, che sono entità nidificate, come line_item/unit_price
e line_item/description
.
In questo esempio la struttura nidificata viene resa più semplice per la visualizzazione.
Analizzatore fattura
Crea un file denominato extraction.py
e utilizza il codice riportato di seguito.
Sostituisci INVOICE_PARSER_ID
con l'ID del processore di analisi delle fatture che hai creato in precedenza e utilizza il file 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)
Dovresti vedere un output simile al seguente:
$ 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. (Facoltativo) Prova altri processori specializzati
Hai utilizzato Document AI per l'approvvigionamento per classificare i documenti e analizzare una fattura. Document AI supporta anche le altre soluzioni specializzate elencate di seguito:
Puoi seguire la stessa procedura e utilizzare lo stesso codice per gestire qualsiasi processore specializzato.
Se vuoi provare altre soluzioni specializzate, puoi ripetere il lab con altri tipi di processori e documenti di esempio specializzati.
Documenti di esempio
Ecco alcuni documenti di esempio che puoi utilizzare per provare gli altri processori specializzati.
Soluzione | Tipo di processore | Documento |
Identità | ||
Prestiti | ||
Prestiti | ||
Contratti |
Puoi trovare altri documenti di esempio e output del processore nella documentazione.
8. Complimenti
Complimenti, hai utilizzato con successo Document AI per classificare ed estrarre dati da documenti specializzati. Ti invitiamo a fare esperimenti con altri tipi di documenti specializzati.
Pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial:
- Nella console Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto e fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.
Scopri di più
Continua a imparare su Document AI con questi codelab di follow-up.
- Gestione dei processori Document AI con Python
- Document AI: human-in-the-loop
- Document AI Workbench: uptraining
- Document AI Workbench: processori personalizzati
Risorse
- Il futuro dei documenti - Playlist di YouTube
- Documentazione di Document AI
- Libreria client Python di Document AI
- Esempi di Document AI
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.