Processeurs spécialisés avec Document AI (Python)

1. Introduction

Dans cet atelier de programmation, vous allez apprendre à utiliser les processeurs spécialisés Document AI pour classer et analyser des documents spécialisés avec Python. Pour la classification et la division, nous allons utiliser un exemple de fichier PDF contenant des factures, des reçus et des relevés de charge électrique. Ensuite, pour l'analyse et l'extraction d'entités, nous utiliserons une facture comme exemple.

Cette procédure et cet exemple de code fonctionnent avec tout document spécialisé accepté par Document AI.

Prérequis

Cet atelier s'appuie sur le contenu présenté dans d'autres ateliers de programmation Document AI.

Nous vous recommandons d'effectuer les ateliers de programmation suivants avant de continuer:

Points abordés

  • Classer et identifier les divisions de documents spécialisés
  • Extraire des entités schématisées à l'aide de processeurs spécialisés

Prérequis

  • Un projet Google Cloud
  • Un navigateur (Chrome ou Firefox, par exemple)
  • Connaissances sur Python 3

2. Préparation

Cet atelier de programmation suppose que vous avez effectué les étapes de configuration de Document AI présentées dans l'atelier de programmation d'introduction.

Veuillez effectuer les étapes suivantes avant de continuer :

Vous devrez également installer Pandas, une bibliothèque d'analyse de données populaire pour Python.

pip3 install --upgrade pandas

3. Créer des processeurs spécialisés

Vous devez d'abord créer des instances des processeurs que vous utiliserez dans ce tutoriel.

  1. Dans la console, accédez à la présentation de la plate-forme Document AI.
  2. Cliquez sur Créer un processeur, faites défiler la page jusqu'à Spécialisé, puis sélectionnez Répartiteur de documents d'approvisionnement.
  3. Nommez-le "codelab-procurement-splitter". (Ou d'un autre élément facile à mémoriser), puis sélectionnez la région la plus proche sur la liste.
  4. Cliquez sur Créer pour créer le processeur.
  5. Copiez l'ID du processeur. Vous devrez l'utiliser ultérieurement dans votre code.
  6. Répétez les étapes 2 à 6 avec l'analyseur de factures (que vous pouvez nommer "codelab-invoice-parser").

Tester le processeur dans la console

Vous pouvez tester l'analyseur de factures dans la console en important un document.

Cliquez sur Importer un document et sélectionnez la facture à analyser. Vous pouvez télécharger et utiliser cet exemple de facture si vous n'en avez pas.

google_invoice.png

Vous devez normalement obtenir le résultat suivant :

InvoiceParser.png

4. Télécharger des exemples de documents

Voici quelques exemples de documents à utiliser pour cet atelier.

Vous pouvez télécharger les PDF en cliquant sur les liens suivants. Ensuite, importez-les dans l'instance Cloud Shell.

Vous pouvez également les télécharger depuis notre bucket Cloud Storage public à l'aide de 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. Classer et scinder les documents

Au cours de cette étape, vous allez utiliser l'API de traitement en ligne pour classer et détecter les points de division logiques d'un document de plusieurs pages.

Vous pouvez également utiliser l'API de traitement par lot si vous souhaitez envoyer plusieurs fichiers ou si la taille du fichier dépasse le nombre maximal de pages pour le traitement en ligne. Pour savoir comment procéder, consultez l'atelier de programmation OCR dans Document AI.

Hormis l'ID de processeur, le code permettant d'envoyer la requête API est identique pour un processeur général.

Classificateur/Séparateur d'approvisionnement

Créez un fichier appelé classification.py et utilisez le code ci-dessous.

Remplacez PROCUREMENT_SPLITTER_ID par l'ID du processeur de répartition d'approvisionnement que vous avez créé précédemment. Remplacez YOUR_PROJECT_ID et YOUR_PROJECT_LOCATION par respectivement l'ID de votre projet Cloud et l'emplacement du processeur.

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)

Votre résultat doit se présenter comme suit :

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

Notez que le séparateur/classificateur d'approvisionnement a correctement identifié les types de documents sur les pages 0-1 et 3-4.

La page 2 contient un formulaire d'admission médicale générique. Le classificateur l'a donc correctement identifié comme other.

6. Extraire les entités

Vous pouvez maintenant extraire les entités schématisées à partir des fichiers, y compris les scores de confiance, les propriétés et les valeurs normalisées.

Le code permettant d'envoyer la requête API est identique à celui de l'étape précédente. Vous pouvez effectuer cette opération avec des requêtes en ligne ou par lots.

Nous obtiendrons les informations suivantes à partir des entités:

  • Type d'entité
    • (par exemple, invoice_date, receiver_name, total_amount)
  • Valeurs brutes
    • Valeurs des données telles que présentées dans le fichier de document d'origine.
  • Valeurs normalisées
    • Valeurs des données dans un format normalisé et standard, le cas échéant.
    • Peut également inclure des informations enrichies à partir d'Enterprise Knowledge Graph
  • Valeurs de confiance
    • Comment "sûr" ? le modèle est que les valeurs sont exactes.

Certains types d'entités, tels que line_item, peuvent également inclure des propriétés, qui sont des entités imbriquées telles que line_item/unit_price et line_item/description.

Cet exemple aplatit la structure imbriquée pour faciliter la visualisation.

Analyseur de factures

Créez un fichier appelé extraction.py et utilisez le code ci-dessous.

Remplacez INVOICE_PARSER_ID par l'ID de l'analyseur de factures que vous avez créé précédemment et utilisez le fichier 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)

Votre résultat doit se présenter comme suit :

$ 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. Facultatif: Essayez d'autres processeurs spécialisés

Vous avez utilisé Document AI pour l'approvisionnement pour classer des documents et analyser une facture. Document AI est également compatible avec les autres solutions spécialisées présentées ici:

Vous pouvez suivre la même procédure et utiliser le même code pour gérer tout processeur spécialisé.

Si vous souhaitez essayer d'autres solutions spécialisées, vous pouvez recommencer l'atelier avec d'autres types de processeurs et des exemples de documents spécialisés.

Exemples de documents

Voici des exemples de documents que vous pouvez utiliser pour essayer les autres processeurs spécialisés.

Solution

Type de processeur

Document

Identité

Analyseur de permis de conduire américains

Prêts

Séparateur de prêt Classificateur

Prêts

Analyseur W9

Contrats

Analyseur de contrats

Vous trouverez d'autres exemples de documents et la sortie du processeur dans la documentation.

8. Félicitations

Félicitations, vous avez utilisé Document AI pour classer et extraire des données de documents spécialisés. Nous vous encourageons à essayer d'autres types de documents spécialisés.

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, procédez comme suit :

  • Dans la console Cloud, accédez à la page Gérer les ressources.
  • Dans la liste des projets, sélectionnez votre projet, puis cliquez sur "Supprimer".
  • Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur "Arrêter" pour supprimer le projet.

En savoir plus

Continuez à vous familiariser avec Document AI grâce aux ateliers de programmation suivants.

Ressources

Licence

Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.