Processori specializzati con Document AI (Python)

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:

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

  • Un progetto Google Cloud
  • Un browser, ad esempio Chrome o Firefox
  • Conoscenza di Python 3

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.

  1. Nella console, vai alla panoramica della piattaforma Document AI.
  2. Fai clic su Crea processore, scorri verso il basso fino a Specializzato e seleziona Separatore di documenti di approvvigionamento.
  3. Assegna il nome "codelab-procurement-splitter" (o un altro nome che ricorderai) e seleziona la regione più vicina nell'elenco.
  4. Fai clic su Crea per creare il processore.
  5. Copia l'ID processore. Lo dovrai utilizzare nel tuo codice in un secondo momento.
  6. 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.

google_invoice.png

L'output dovrebbe avere il seguente aspetto:

InvoiceParser.png

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)
  • 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à

Analizzatore sintattico di patenti di guida statunitensi

Prestiti

Divisione e classificazione dei documenti creditizi

Prestiti

Analizzatore sintattico W9

Contratti

Analizzatore sintattico di 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.

Risorse

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.