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:
- Reconnaissance optique des caractères (OCR) avec Document AI et Python
- Analyse de formulaire avec Document AI et Python
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
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.
- Dans la console, accédez à la présentation de la plate-forme Document AI.
- Cliquez sur Créer un processeur, faites défiler la page jusqu'à Spécialisé, puis sélectionnez Répartiteur de documents d'approvisionnement.
- 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.
- Cliquez sur Créer pour créer le processeur.
- Copiez l'ID du processeur. Vous devrez l'utiliser ultérieurement dans votre code.
- 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.
Vous devez normalement obtenir le résultat suivant :
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
)
- (par exemple,
- 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é | ||
Prêts | ||
Prêts | ||
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.
- Gérer les processeurs Document AI avec Python
- Document AI : human-in-the-loop (avec intervention humaine)
- Document AI Workbench: surentraînement
- Document AI Workbench: processeurs personnalisés
Ressources
- The Future of Documents - YouTube Playlist
- Documentation Document AI
- Bibliothèque cliente Python Document AI
- Exemples Document AI
Licence
Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.