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 la división, usaremos un archivo PDF de ejemplo que contiene facturas, recibos y estados de cuenta de servicios públicos. Luego, para el análisis y la extracción de entidades, usaremos una factura como ejemplo.
Este procedimiento y el código de ejemplo funcionarán con cualquier documento especializado compatible con Document AI.
Requisitos previos
Este codelab se basa en contenido presentado en otros codelabs de Document AI.
Recomendamos que completes los siguientes codelabs antes de continuar:
- Reconocimiento óptico de caracteres (OCR) con Document AI y Python
- Análisis de formularios con Document AI (Python)
Qué aprenderás
- Cómo clasificar e identificar puntos de división para documentos especializados
- Cómo extraer entidades esquematizadas con procesadores especializados
Requisitos
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 de análisis de datos popular para Python.
pip3 install --upgrade pandas
3. Crea procesadores especializados
Primero debes crear instancias de los procesadores que usarás para este instructivo.
- En la consola, navega a la Descripción general de la plataforma de Document AI.
- Haz clic en Crear procesador, desplázate hasta Especializado y selecciona Procurement Doc Splitter.
- 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.
- Haz clic en Crear para crear tu procesador.
- Copia el ID del procesador. Debes usarlo en el código más adelante.
- Repite los pasos del 2 al 6 con el Analizador de facturas (al que puedes llamar "codelab-invoice-parser").
Prueba el procesador en la consola
Para probar el analizador de facturas en la consola, puedes subir un documento.
Haz clic en Subir documento y selecciona una factura para analizarla. Puedes descargar y usar esta factura de muestra si no tienes una disponible para usar.

El resultado debería ser similar al siguiente:

4. Descarga documentos de muestra
Tenemos algunos documentos de muestra que puedes usar para este lab.
Puedes descargar los PDFs con los siguientes vínculos. Luego, súbelos a la instancia de Cloud Shell.
Como alternativa, 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. Clasifica 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 del archivo supera el límite de páginas del procesamiento en línea. Puedes revisar cómo hacerlo en el Codelab de OCR de Document AI.
El código para realizar la solicitud a la API es idéntico para un procesador general, con la excepción del ID del procesador.
Divisor/clasificador de documentos de adquisición
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 de división de adquisiciones que creaste antes. Reemplaza YOUR_PROJECT_ID y YOUR_PROJECT_LOCATION por tu 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]
Ten en cuenta que el divisor y clasificador de documentos de adquisición identificó correctamente los tipos de documentos en las páginas 0-1 y 3-4.
La página 2 contiene un formulario de admisión médica 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, incluidos las puntuaciones de confianza, las propiedades y los valores normalizados.
El código para hacer la solicitud a la API es idéntico al del paso anterior y se puede hacer con solicitudes por lotes o en línea.
Accederemos a la siguiente información de las entidades:
- Tipo de entidad
- (p.ej.,
invoice_date,receiver_name,total_amount)
- (p.ej.,
- Valores sin procesar
- Valores de datos tal como aparecen en el archivo del documento original
- Valores normalizados
- Valores de datos en un formato normalizado y estándar, si corresponde
- También puede incluir enriquecimiento de Enterprise Knowledge Graph
- Valores de confianza
- Nivel de seguridad del modelo de que los valores sean 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 aplana 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 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 correctamente Document AI para adquisiciones para clasificar documentos y analizar una factura. Document AI también admite las otras soluciones especializadas que se indican aquí:
Sigue el mismo procedimiento y usa 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 muestra
Estos son algunos documentos de muestra que puedes usar para probar los otros procesadores especializados.
Solución | Tipo de procesador | Documento |
Identidad | ||
Préstamos | ||
Préstamos | ||
Contratos |
Puedes encontrar otros documentos de muestra y resultados del procesador en la documentación.
8. Felicitaciones
Felicitaciones, usaste correctamente Document AI para clasificar y extraer datos de documentos especializados. Te recomendamos que experimentes 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.
- Administra procesadores de Document AI con Python
- Document AI: Con interacción humana
- Document AI Workbench: Enriquecimiento
- Document AI Workbench: Procesadores personalizados
Recursos
- El futuro de los documentos: Lista de reproducción de YouTube
- Documentación de Document AI
- Biblioteca cliente de Document AI con Python
- Muestras de Document AI
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.