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 bollette. Poi, per l'analisi e l'estrazione delle entità, utilizzeremo una fattura come esempio.
Questa procedura e il codice di esempio funzioneranno 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 divisione 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 di configurazione di Document AI elencati nel codelab introduttivo.
Prima di procedere, completa i seguenti passaggi:
Dovrai anche installare Pandas, una libreria di analisi dei dati molto diffusa per Python.
pip3 install --upgrade pandas
3. Crea processori specializzati
Devi prima creare istanze dei processori che utilizzerai per questo tutorial.
- Nella console, vai alla panoramica della piattaforma Document AI.
- Fai clic su Crea processore, scorri verso il basso fino a Specializzato e seleziona Separatore di documenti di approvvigionamento.
- Assegna il nome "codelab-procurement-splitter" (o un altro nome che ricorderai) e seleziona la regione più vicina nell'elenco.
- Fai clic su Crea per creare il processore.
- Copia l'ID processore. Lo dovrai utilizzare nel tuo codice in un secondo momento.
- Ripeti i passaggi 2-6 con Invoice Parser (che puoi chiamare "codelab-invoice-parser")
Testare 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 a disposizione.

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 nell'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. Classificare e dividere i documenti
In questo passaggio utilizzerai l'API di elaborazione online per classificare e rilevare i punti di divisione logica per un documento di più pagine.
Puoi anche utilizzare l'API di elaborazione batch se vuoi inviare più file o se le dimensioni del file superano il numero massimo di pagine per l'elaborazione online. Per sapere come fare, consulta il codelab sull'OCR di Document AI.
Il codice per effettuare la richiesta API è identico per un processore generico, a parte l'ID processore.
Strumento per la divisione e classificazione dei documenti relativi all'approvvigionamento
Crea un file denominato classification.py e utilizza il codice riportato di seguito.
Sostituisci PROCUREMENT_SPLITTER_ID con l'ID del processore di divisione degli acquisti che hai creato in precedenza. Sostituisci YOUR_PROJECT_ID e YOUR_PROJECT_LOCATION con l'ID progetto Cloud e la posizione del processore rispettivamente.
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)
L'output dovrebbe avere un aspetto 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 lo strumento di divisione e classificazione dei documenti relativi all'approvvigionamento ha identificato correttamente i tipi di documenti nelle pagine 0-1 e 3-4.
La pagina 2 contiene un modulo di ammissione medica generico, quindi il classificatore lo ha identificato correttamente come other.
6. Estrarre le entità
Ora puoi estrarre le entità schematizzate dai file, inclusi i punteggi di confidenza, le proprietà e i valori normalizzati.
Il codice per effettuare la richiesta API è identico a quello del passaggio precedente e può essere eseguito con richieste online o batch.
Accederemo alle seguenti informazioni delle entità:
- Tipo di persona giuridica
- (ad es.
invoice_date,receiver_name,total_amount)
- (ad es.
- Valori non elaborati
- Valori dei dati come presentati nel file del documento originale.
- Valori normalizzati
- Valori dei dati in un formato normalizzato e standard, se applicabile.
- Può includere anche l'arricchimento da Enterprise Knowledge Graph
- Valori di confidenza
- Il livello di "certezza" del modello che i valori siano accurati.
Alcuni tipi di entità, come line_item, possono includere anche proprietà, ovvero entità nidificate come line_item/unit_price e line_item/description.
Questo esempio appiattisce la struttura nidificata per facilitarne la visualizzazione.
Analizzatore sintattico delle fatture
Crea un file denominato extraction.py e utilizza il codice riportato di seguito.
Sostituisci INVOICE_PARSER_ID con l'ID del processore Invoice Parser 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)
L'output dovrebbe avere un aspetto 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 qui:
Puoi seguire la stessa procedura e utilizzare lo stesso codice per gestire qualsiasi processore specializzato.
Se vuoi provare le altre soluzioni specializzate, puoi eseguire di nuovo il lab con altri tipi di processore 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
Congratulazioni, hai utilizzato Document AI per classificare ed estrarre dati da documenti specializzati. Ti invitiamo a sperimentare altri tipi di documenti specializzati.
Pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial:
- In Cloud Console, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il tuo progetto e poi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.
Scopri di più
Continua a scoprire Document AI con questi codelab di follow-up.
- Gestione dei processori Document AI con Python
- Document AI: Human in the Loop
- Document AI Workbench: riqualificazione
- Document AI Workbench: processori personalizzati
Risorse
- The Future of Documents - YouTube Playlist
- 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.