Processadores especializados com a Document AI (Python)

1. Introdução

Neste codelab, você vai aprender a usar processadores especializados da Document AI para classificar e analisar documentos especializados com Python. Para classificação e divisão, usaremos um arquivo PDF de exemplo contendo faturas, recibos e declarações de serviços públicos. Em seguida, para a análise e extração de entidade, usaremos uma fatura como exemplo.

O procedimento e o código de exemplo funcionam com qualquer documento especializado aceito pela Document AI.

Pré-requisitos

Este codelab se baseia no conteúdo apresentado em outros codelabs da Document AI.

Recomendamos que você conclua os seguintes codelabs antes de continuar:

O que você vai aprender

  • Como classificar e identificar pontos de divisão em documentos especializados.
  • Como extrair entidades esquematizadas usando processadores especializados.

O que é necessário

  • Um projeto do Google Cloud
  • Um navegador, como o Chrome ou o Firefox
  • Conhecimento sobre o Python 3

2. Etapas da configuração

Este codelab parte do princípio de que você concluiu as etapas de configuração da Document AI listadas no Codelab básico.

Conclua as etapas a seguir antes de continuar:

Também é necessário instalar o Pandas, uma biblioteca de análise de dados conhecida para Python.

pip3 install --upgrade pandas

3. Criar processadores especializados

Primeiro, crie instâncias dos processadores que serão usados neste tutorial.

  1. No console, navegue até Visão geral da Document AI Platform.
  2. Clique em Criar processador, role para baixo até Especializado e selecione Divisor de documentos de compras.
  3. Dê a ele o nome de "codelab-procurement-splitter". (Ou de outra coisa que você lembrar) e selecione a região mais próxima na lista.
  4. Clique em Criar para criar seu processador.
  5. Copie o ID do processador. Você precisará usá-la em seu código mais tarde.
  6. Repita as etapas de 2 a 6 com o Analisador de faturas, que pode ser chamado de "Analisador de fatura do codelab".

Testar o processador no console

É possível testar o analisador de faturas no console ao fazer upload de um documento.

Clique em Fazer upload de documento e selecione uma fatura para analisar. Você poderá fazer o download desse modelo de fatura e usá-lo se não tiver uma disponível.

google_invoice.png

A saída será parecida com esta:

InvoiceParser.png

4. Fazer o download de documentos de amostra

Temos alguns documentos de exemplo para usar neste laboratório.

Faça o download dos PDFs usando os links a seguir. Em seguida, faça o upload deles para a instância do Cloud Shell.

Como alternativa, é possível fazer o download deles pelo bucket público do Cloud Storage usando 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. Classificar e dividir os documentos

Nesta etapa, você vai usar a API de processamento on-line para classificar e detectar pontos de divisão lógica para um documento de várias páginas.

Também é possível usar a API de processamento em lote se você quiser enviar vários arquivos ou se o tamanho do arquivo exceder o máximo de páginas de processamento on-line. Confira como fazer isso no Codelab da OCR da Document AI.

O código para fazer a solicitação de API é idêntico para um processador geral, exceto o ID do processador.

Divisor/classificador de compras

Crie um arquivo chamado classification.py e use o código abaixo.

Substitua PROCUREMENT_SPLITTER_ID pelo ID do processador do divisor de compras criado anteriormente. Substitua YOUR_PROJECT_ID e YOUR_PROJECT_LOCATION pelo ID do projeto do Cloud e local do processador, 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)

A saída será parecida com esta:

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

O Divisor/Classificador de compras identificou corretamente os tipos de documento nas páginas 0-1 e 3-4.

A página 2 contém um formulário de admissão médica genérico, de modo que o classificador corretamente o identificou como other.

6. Extrair as entidades

Agora é possível extrair as entidades esquematizadas dos arquivos, incluindo pontuações de confiança, propriedades e valores normalizados.

O código para fazer a solicitação de API é idêntico ao da etapa anterior e pode ser feito com solicitações on-line ou em lote.

Vamos acessar as seguintes informações das entidades:

  • Tipo de entidade
    • (por exemplo, invoice_date, receiver_name, total_amount)
  • Valores brutos
    • Valores de dados conforme apresentado no arquivo do documento original.
  • Valores normalizados
  • Valores de confiança
    • Qual é o grau de "certeza" modelo é que os valores são precisos.

Alguns tipos de entidade, como line_item, também podem incluir propriedades, que são entidades aninhadas, como line_item/unit_price e line_item/description.

Este exemplo nivela a estrutura aninhada para facilitar a visualização.

Analisador de faturas

Crie um arquivo chamado extraction.py e use o código abaixo.

Substitua INVOICE_PARSER_ID pelo ID do processador analisador de faturas criado anteriormente e use o arquivo 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)

A saída será parecida com esta:

$ 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: testar outros processadores especializados

Você usou corretamente a Document AI for Procurement para classificar documentos e analisar uma fatura. A Document AI também oferece suporte às outras soluções especializadas listadas aqui:

É possível seguir o mesmo procedimento e usar o mesmo código para lidar com qualquer processador especializado.

Se quiser testar as outras soluções especializadas, faça novamente o laboratório com outros tipos de processador e documentos de amostra especializados.

Exemplos de documentos

Aqui estão alguns documentos de amostra que você pode usar para testar os outros processadores especializados.

Solução

Tipo de processador

Document

Identidade

Analisador de carteira de habilitação dos EUA

Empréstimo

Divisor de empréstimos Classificador

Empréstimo

Analisador W9

Contratos

Analisador de contratos

Confira outros exemplos de documentos e saídas do processador na documentação.

8. Parabéns

Parabéns! Você usou corretamente a Document AI para classificar e extrair dados de documentos especializados. Teste outros tipos de documentos especializados.

Limpeza

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud, siga estas etapas:

  • No console do Cloud, acesse a página Gerenciar recursos.
  • Na lista de projetos, selecione o projeto e clique em "Excluir".
  • Na caixa de diálogo, digite o ID do projeto e clique em "Encerrar" para excluí-lo.

Saiba mais

Saiba mais sobre a Document AI com estes codelabs de acompanhamento.

Recursos

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.