Procesadores especializados con Document AI (Python)

1. Introducción

En este codelab, aprenderás a usar procesadores especializados de Document AI para clasificar y analizar documentos especializados con Python. Para la clasificación y división, usaremos un archivo PDF de ejemplo que contiene facturas, recibos y resúmenes de los servicios públicos. Luego, para el análisis y la extracción de entidades, usaremos una factura como ejemplo.

Este procedimiento y código de ejemplo funcionarán con cualquier documento especializado que admita Document AI.

Requisitos previos

Este codelab se basa en contenido presentado en otros codelabs de Document AI.

Se recomienda que completes los siguientes codelabs antes de continuar:

Qué aprenderás

  • Cómo identificar y clasificar puntos de división para documentos especializados
  • Cómo extraer entidades esquematizadas con procesadores especializados

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador, como Chrome o Firefox
  • Conocimiento de Python 3

2. Cómo prepararte

En este codelab, se supone que ya completaste los pasos de configuración de Document AI que se indican en el codelab de introducción.

Completa estos pasos antes de continuar:

También deberás instalar Pandas, una biblioteca popular de análisis de datos para Python.

pip3 install --upgrade pandas

3. Crea procesadores especializados

Primero, debes crear instancias de los procesadores que usarás para este instructivo.

  1. En la consola, navega a Descripción general de la plataforma de Document AI.
  2. Haz clic en Crear procesador, desplázate hacia abajo hasta Especializado y selecciona Divisor de documentos de adquisición.
  3. Asígnale el nombre "codelab-procurement-splitter". (o un nombre que no vayas a olvidar) y selecciona la región más cercana de la lista.
  4. Haz clic en Crear para crear tu procesador.
  5. Copia el ID del procesador. Debes usar esto en el código más adelante.
  6. Repite los pasos del 2 al 6 con el analizador de facturas (al que puedes llamar "codelab-invoice-parser").

Procesador de prueba en la consola

Para probar el analizador de facturas en la consola, sube un documento.

Haz clic en Subir documento y selecciona la factura que quieres analizar. Si no tienes una factura de muestra, puedes descargarla y utilizarla.

google_invoice.png

El resultado debería ser similar al siguiente:

InvoiceParser.png

4. Descarga documentos de muestra

Tenemos algunos documentos de muestra para usar en este lab.

Puedes descargar los PDF mediante los siguientes vínculos. Luego, súbelos a la instancia de Cloud Shell.

También puedes descargarlos de nuestro bucket público de Cloud Storage con 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. Clasificar y divide los documentos

En este paso, usarás la API de procesamiento en línea para clasificar y detectar puntos de división lógicos para un documento de varias páginas.

También puedes usar la API de procesamiento por lotes si deseas enviar varios archivos o si el tamaño de archivo supera el máximo de páginas de procesamiento en línea. Puedes revisar cómo hacerlo en el Codelab de OCR de Document AI.

El código que realiza la solicitud a la API es idéntico para un procesador general, excepto el ID del procesador.

Divisor/clasificador de adquisiciones

Crea un archivo llamado classification.py y usa el código que se proporciona a continuación.

Reemplaza PROCUREMENT_SPLITTER_ID por el ID del procesador divisor de adquisiciones que creaste antes. Reemplaza YOUR_PROJECT_ID y YOUR_PROJECT_LOCATION por el ID del proyecto de Cloud y la ubicación del procesador, respectivamente.

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)

El resultado debería ser similar a este:

$ 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]

Observa que el Divisor o Clasificador de Adquisiciones identificó correctamente los tipos de documentos en las páginas 0-1 y 3-4.

La página 2 contiene un formulario de consumo médico genérico, por lo que el clasificador lo identificó correctamente como other.

6. Extrae las entidades

Ahora, puedes extraer las entidades esquematizadas de los archivos, incluidas las puntuaciones de confianza, las propiedades y los valores normalizados.

El código para realizar la solicitud a la API es idéntico al paso anterior y se puede hacer con solicitudes en línea o por lotes.

Accederemos a la siguiente información de las entidades:

  • Tipo de entidad
    • (p.ej., invoice_date, receiver_name, total_amount)
  • Valores sin procesar
    • Valores de datos como se presentan en el archivo del documento original.
  • Valores normalizados
    • Valores de datos en formato normalizado y estándar, si corresponde.
    • También puede incluir enriquecimiento de Enterprise Knowledge Graph.
  • Valores de confianza
    • Cuán seguro del modelo es que los valores son exactos.

Algunos tipos de entidades, como line_item, también pueden incluir propiedades, que son entidades anidadas, como line_item/unit_price y line_item/description.

En este ejemplo, se compacta la estructura anidada para facilitar la visualización.

Analizador de facturas

Crea un archivo llamado extraction.py y usa el código que se proporciona a continuación.

Reemplaza INVOICE_PARSER_ID por el ID del procesador del analizador de facturas que creaste anteriormente y usa el archivo 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)

El resultado debería ser similar a este:

$ 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. Opcional: Prueba otros procesadores especializados

Usaste Document AI para adquisiciones de forma correcta para clasificar documentos y analizar una factura. Document AI también es compatible con las otras soluciones especializadas que se mencionan aquí:

Puedes seguir el mismo procedimiento y usar el mismo código para controlar cualquier procesador especializado.

Si quieres probar las otras soluciones especializadas, puedes volver a ejecutar el lab con otros tipos de procesadores y documentos de muestra especializados.

Documentos de ejemplo

Estos son algunos documentos de muestra que puedes usar para probar los otros procesadores especializados.

Solución

Tipo de procesador

Document

Identidad

Analizador de licencias de conducir de EE.UU.

Préstamos

Divisor de préstamos y Clasificador

Préstamos

Analizador W9

Contratos

Analizador de contratos

Puedes encontrar otros documentos de muestra y resultados del procesador en la documentación.

8. Felicitaciones

Felicitaciones, utilizaste de forma correcta Document AI para clasificar y extraer datos de documentos especializados. Te recomendamos experimentar con otros tipos de documentos especializados.

Haz limpieza

Para evitar que se generen cargos en tu cuenta de Google Cloud por los recursos que usaste en este instructivo, sigue estos pasos:

  • En la consola de Cloud, ve a la página Administrar recursos.
  • En la lista de proyectos, selecciona tu proyecto y haz clic en Borrar.
  • En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.

Más información

Sigue aprendiendo sobre Document AI con estos codelabs de seguimiento.

Recursos

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.