Processadores especializados com a Document AI (Python)

1. Introdução

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

Esse procedimento e o exemplo de código funcionam com qualquer documento especializado compatível com a Document AI.

Pré-requisitos

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

Recomendamos que você conclua os codelabs a seguir antes de continuar:

O que você vai aprender

  • Como classificar e identificar pontos de divisão para 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:

Você também precisa 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 você vai usar neste tutorial.

  1. No console, navegue até a Visão geral do Document AI Platform.
  2. Clique em Criar processador, role para baixo até Especializado e selecione Divisor de documentos de compras.
  3. Nomeie como "codelab-procurement-splitter" ou de outra forma, desde que você se lembre. Em seguida, 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 você pode nomear como "codelab-invoice-parser").

Testar o processador no console

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

Clique em "Fazer upload do documento" e selecione uma fatura para analisar. É possível fazer o download e usar este exemplo de fatura se você não tiver um disponível.

google_invoice.png

A saída será parecida com esta:

InvoiceParser.png

4. Baixar amostras de documentos

Temos alguns exemplos para usar neste laboratório.

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

Como alternativa, faça o download deles no 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 em um documento de várias páginas.

Você também pode usar a API de processamento em lote se quiser enviar vários arquivos ou se o tamanho do arquivo exceder o máximo de páginas para processamento on-line. Consulte como fazer isso no codelab de OCR da Document AI.

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

Divisor/classificador de compras

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

Substitua PROCUREMENT_SPLITTER_ID pelo ID do processador de divisão de compras que você criou anteriormente. Substitua YOUR_PROJECT_ID e YOUR_PROJECT_LOCATION pelo ID do projeto do Cloud e pela localização 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 documentos nas páginas 0 a 1 e 3 a 4.

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

6. extrair as entidades

Agora você pode 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 apresentados no arquivo original do documento.
  • Valores normalizados
    • Valores de dados em um formato normalizado e padrão, se aplicável.
    • Também pode incluir aprimoramento do Enterprise Knowledge Graph
  • Níveis de confiança
    • O quanto o modelo tem "certeza" de 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 simplifica 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 de análise de faturas que você criou antes 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: teste outros processadores especializados

Você conseguiu usar a Document AI para compras para classificar documentos e analisar uma fatura. A Document AI também aceita outras soluções especializadas listadas aqui:

Você pode seguir o mesmo procedimento e usar o mesmo código para lidar com qualquer processador especializado.

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

Documentos de amostra

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

Solução

Tipo de processador

Documento

Identidade

Analisador de carteira de habilitação dos EUA

Empréstimo

Divisor e classificador de empréstimos

Empréstimo

Analisador W9

Contratos

Analisador de contrato

Veja outros documentos de amostra e a saída do processador na documentação.

8. Parabéns

Parabéns! Você usou a Document AI para classificar e extrair dados de documentos especializados. Incentivamos você a testar 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.