Utiliser Document AI pour traiter intelligemment vos formulaires écrits à la main (Node.js)

1. Présentation

Qu'est-ce que Document AI ?

L'API Document AI est une solution de reconnaissance de documents qui exploite des données non structurées, telles que des documents et des e-mails, et en facilite la compréhension, l'analyse et l'utilisation. L'API fournit une structure via la classification de contenu, l'extraction d'entités, la recherche avancée, etc.

Dans ce tutoriel, vous allez vous concentrer sur l'utilisation de l'API Document AI avec Node.js. Ce tutoriel explique comment analyser un simple formulaire d'admission médicale.

Points abordés

  • Activer l'API Document AI
  • Authentifier les requêtes API
  • Installer la bibliothèque cliente pour Node.js
  • Analyser des données à partir d'un formulaire scanné

Prérequis

  • Un projet Google Cloud
  • Un navigateur tel que Chrome ou Firefox
  • Connaissance de Node.js

Enquête

Comment allez-vous utiliser ce tutoriel ?

Je vais le lire uniquement Je vais le lire et effectuer les exercices

Comment évalueriez-vous votre expérience avec Node.js ?

Débutant Intermédiaire Expert

Quel est votre niveau d'expérience avec les services Google Cloud ?

<ph type="x-smartling-placeholder"></ph> Débutant Intermédiaire Expert
.

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à Cloud Console, puis créez un projet ou réutilisez un projet existant. (Si vous n'avez pas encore de compte Gmail ou G Suite, vous devez en créer un.)

Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud. (Le nom ci-dessus est déjà pris. Vous devez en trouver un autre.) Vous devrez indiquer cet ID ultérieurement en tant que PROJECT_ID.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

Veillez à suivre les instructions figurant dans la section "Effectuer un nettoyage". Cette section vous indique comment arrêter les ressources afin d'éviter qu'elles ne vous soient facturées au-delà de ce tutoriel. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que vous puissiez exécuter Google Cloud à distance depuis votre ordinateur portable, vous allez utiliser Google Cloud Shell, un environnement de ligne de commande exécuté dans le cloud, lors de cet atelier de programmation.

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Si vous n'avez jamais démarré Cloud Shell auparavant, un écran intermédiaire s'affiche en dessous de la ligne de flottaison, décrivant de quoi il s'agit. Si tel est le cas, cliquez sur Continuer. Cet écran ne s'affiche qu'une seule fois. Voici à quoi il ressemble :

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Cloud Shell vous permet d'accéder au terminal d'une machine virtuelle hébergée dans le cloud. La machine virtuelle contient tous les outils de développement nécessaires. Elle intègre un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier dans un simple navigateur ou sur votre Chromebook.

Une fois connecté à Cloud Shell, vous êtes en principe authentifié et le projet est défini avec votre ID de projet.

  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list

Résultat de la commande

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Si vous obtenez un résultat différent, exécutez cette commande :

gcloud config set project <PROJECT_ID>

Résultat de la commande

Updated property [core/project].

3. Activer l'API Cloud Document AI

Avant de pouvoir utiliser Document AI, vous devez activer l'API. Ouvrez Cloud Console dans votre navigateur.

  1. Cliquez sur le menu de navigation ☰ > API et services > Bibliothèque. API Search
  2. Recherchez "API Document AI", puis cliquez sur Activer pour utiliser l'API dans votre projet Google Cloud.

4. Créer et tester un outil de traitement

Vous devez d'abord créer une instance du processeur de l'analyseur de formulaires à utiliser dans la plate-forme Document AI lors de ce tutoriel.

  1. Dans la console, accédez à la page de présentation de la plate-forme Document AI.
  2. Cliquez sur Create Processor (Créer un processeur), puis sélectionnez Form ParserProcesseurs (Analyseur de formulaires).
  3. Spécifiez un nom de processeur, puis sélectionnez votre région dans la liste.
  4. Cliquez sur Créer pour créer le processeur.
  5. Copiez votre ID de processeur. Vous devrez l'utiliser ultérieurement dans votre code.

(Facultatif) Vous pouvez tester votre processeur dans la console en important un document. Cliquez sur Upload Document (Importer un document), puis sélectionnez un formulaire à analyser. Vous pouvez télécharger et utiliser cet exemple de formulaire si vous n'en avez pas.

Formulaire médical

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

5. Authentifier les requêtes API

Pour envoyer des requêtes à l'API Document AI, vous devez utiliser un compte de service. Un compte de service appartient à votre projet. Il permet à la bibliothèque cliente Node.js de Google d'envoyer des requêtes API. Comme tout autre compte utilisateur, un compte de service est représenté par une adresse e-mail. Dans cette section, vous allez utiliser le SDK Cloud pour créer un compte de service, puis créer les identifiants nécessaires pour vous authentifier en tant que compte de service.

Commencez par définir une variable d'environnement avec votre PROJECT_ID, que vous utiliserez tout au long de cet atelier de programmation :

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

Créez ensuite un compte de service pour accéder à l'API Document AI à l'aide de la commande suivante :

gcloud iam service-accounts create my-docai-sa \
  --display-name "my-docai-service-account"

Ensuite, créez des identifiants que votre code Node.js utilisera pour se connecter en tant que nouveau compte de service. et enregistrez-les dans un fichier JSON ~/key.json à l'aide de la commande suivante :

gcloud iam service-accounts keys create ~/key.json \
  --iam-account  my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

Enfin, définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS, qui permet à la bibliothèque de rechercher vos identifiants. Pour en savoir plus sur l'authentification de ce formulaire, consultez ce guide. La variable d'environnement doit être définie sur le chemin d'accès complet au fichier JSON d'identifiants que vous avez créé, à l'aide de la commande suivante :

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

6. Télécharger le formulaire d'exemple

Nous disposons d'un exemple de formulaire à utiliser, stocké dans notre bucket d'échantillons Google Cloud Storage public. Exécutez la commande suivante pour le télécharger dans votre répertoire de travail.

gsutil cp gs://cloud-samples-data/documentai/form.pdf .

Vérifiez que le fichier a bien été téléchargé dans Cloud Shell à l'aide de la commande suivante :

ls -ltr form.pdf

7. Installer la bibliothèque cliente

Configurez ensuite votre code dans votre répertoire de travail.

Initialisez un nouveau package Node.js:

npm init

Installez la bibliothèque cliente Document AI:

npm install @google-cloud/documentai

8. Envoyer une requête de traitement de document synchrone

Au cours de cette étape, vous allez effectuer un appel de document de processus à l'aide du point de terminaison synchrone. Pour traiter des volumes importants de documents à la fois, vous pouvez également utiliser l'API asynchrone. Pour en savoir plus sur l'utilisation des API de l'analyseur de formulaires, cliquez ici.

Créez un fichier index.js et collez le code suivant. Renseignez les variables applicables avec les informations de votre organisme de traitement.

const { DocumentProcessorServiceClient } = require('@google-cloud/documentai').v1;
const fs = require('fs');

/**
 * Runs the sample document through Document AI to get key/value pairs and
 * confidence scores.
 */
async function processDocument(projectId, location, processorId, filePath, mimeType) {
    // Instantiates a client
    const documentaiClient = new DocumentProcessorServiceClient();

    // 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
    const resourceName = documentaiClient.processorPath(projectId, location, processorId);

    // Read the file into memory.
    const imageFile = fs.readFileSync(filePath);

    // Convert the image data to a Buffer and base64 encode it.
    const encodedImage = Buffer.from(imageFile).toString('base64');

    // Load Binary Data into Document AI RawDocument Object
    const rawDocument = {
        content: encodedImage,
        mimeType: mimeType,
    };

    // Configure ProcessRequest Object
    const request = {
        name: resourceName,
        rawDocument: rawDocument
    };

    // Use the Document AI client to process the sample form
    const [result] = await documentaiClient.processDocument(request);

    return result.document;
}

/**
 * Run the codelab.
 */
async function main() {
    const projectId = 'YOUR_PROJECT_ID';
    const location = 'YOUR_PROJECT_LOCATION'; // Format is 'us' or 'eu'
    const processorId = 'YOUR_PROCESSOR_ID'; // Should be a Hexadecimal string

    // Supported File Types
    // https://cloud.google.com/document-ai/docs/processors-list#processor_form-parser
    filePath = 'form.pdf'; // The local file in your current working directory
    mimeType = 'application/pdf';

    const document = await processDocument(projectId, location, processorId, filePath, mimeType);
    console.log("Document Processing Complete");

    // Print the document text as one big string
    console.log(`Text: ${document.text}`);
}

main(...process.argv.slice(2)).catch(err => {
    console.error(err);
    process.exitCode = 1;
});

Exécutez votre code maintenant. Le texte suivant devrait s'afficher dans votre console.

Text: FakeDoc M.D.
HEALTH INTAKE FORM
Please fill out the questionnaire carefully. The information you provide will be used to complete
your health profile and will be kept confidential.
Name:
Date:
Sally
Walker
DOB: 09/04/1986
Address: 24 Barney Lane City: Towalo State: NJ Zip: 07082
Email: Sally, waller@cmail.com Phone #: (906) 917-3486
Gender:
Marital Status: Single Occupation: Software Engineer
Referred By: None
Emergency Contact: Eva Walker Emergency Contact Phone: (906) 334-8926
Describe your medical concerns (symptoms, diagnoses, etc):
Runny nose, mucas in throat, weakness,
aches, chills, tired
Are you currently taking any medication? (If yes, please describe):
Vyvanse (25mg) daily for attention

Au cours des prochaines étapes, vous allez extraire les données structurées pouvant être plus facilement stockées dans des bases de données ou utilisées dans d'autres applications.

9. Extraire les paires clé/valeur du formulaire

Vous pouvez à présent extraire les paires clé/valeur du formulaire et les scores de confiance correspondants. L'objet de réponse Document contient une liste de pages du document d'entrée. Chaque objet page contient une liste de champs de formulaire et leur emplacement dans le texte.

Le code suivant parcourt chaque page et extrait chaque clé, valeur et score de confiance.

Ajoutez la fonction suivante à votre code.

/**
 * Extract form data and confidence from processed document.
 */
function extractFormData(document) {
    // Extract shards from the text field
    function getText(textAnchor, document) {
        if (!textAnchor.textSegments || textAnchor.textSegments.length === 0) {
            return '';
        }

        // First shard in document doesn't have startIndex property
        const startIndex = textAnchor.textSegments[0].startIndex || 0;
        const endIndex = textAnchor.textSegments[0].endIndex;

        return document.text.substring(startIndex, endIndex);
    }

    var formData = [];

    const pages = document.pages;

    pages.forEach((page) => {
        const formFields = page.formFields;
        formFields.forEach((field) => {
            // Get the extracted field names and remove extra space from text
            const fieldName = getText(field.fieldName.textAnchor, document);
            // Confidence - How "sure" the API is that the text is correct
            const nameConfidence = field.fieldName.confidence.toFixed(4);

            const fieldValue = getText(field.fieldValue.textAnchor, document);
            const valueConfidence = field.fieldValue.confidence.toFixed(4);

            formData.push({
                fieldName: fieldName,
                fieldValue: fieldValue,
                nameConfidence: nameConfidence,
                valueConfidence: valueConfidence
            });
        });
    });

    return formData;
}

Ajoutez un appel à la fonction extractFormData() depuis la fonction principale et imprimez l'objet obtenu sous forme de table.

/**
 * Run the codelab.
 */
async function main() {
    const projectId = 'YOUR_PROJECT_ID';
    const location = 'YOUR_PROJECT_LOCATION'; // Format is 'us' or 'eu'
    const processorId = 'YOUR_PROCESSOR_ID'; // Should be a Hexadecimal string

    // Supported File Types
    // https://cloud.google.com/document-ai/docs/processors-list#processor_form-parser
    filePath = 'form.pdf'; // The local file in your current working directory
    mimeType = 'application/pdf';

    const document = await processDocument(projectId, location, processorId, filePath, mimeType);
    const formData = extractFormData(document);

    console.log('\nThe following form key/value pairs were detected:');
    console.table(formData);
}

Exécutez maintenant votre code. Si vous utilisez notre exemple de document, vous devriez obtenir le résultat suivant :

The following form key/value pairs were detected:
┌─────────┬────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────┬────────────────┬─────────────────┐
│ (index) │                           fieldName                            │                            fieldValue                            │ nameConfidence │ valueConfidence │
├─────────┼────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────┼────────────────┼─────────────────┤
│    0    │                       'Marital Status: '                       │                            'Single '                             │    '1.0000'    │    '1.0000'     │
│    1    │                            'DOB: '                             │                          '09/04/1986\n'                          │    '0.9999'    │    '0.9999'     │
│    2    │                            'City: '                            │                            'Towalo '                             │    '0.9996'    │    '0.9996'     │
│    3    │                          'Address: '                           │                        '24 Barney Lane '                         │    '0.9994'    │    '0.9994'     │
│    4    │                        'Referred By: '                         │                             'None\n'                             │    '0.9968'    │    '0.9968'     │
│    5    │                          'Phone #: '                           │                        '(906) 917-3486\n'                        │    '0.9961'    │    '0.9961'     │
│    6    │                           'State: '                            │                              'NJ '                               │    '0.9960'    │    '0.9960'     │
│    7    │                  'Emergency Contact Phone: '                   │                        '(906) 334-8926\n'                        │    '0.9925'    │    '0.9925'     │
│    8    │                           'Name:\n'                            │                        'Sally\nWalker\n'                         │    '0.9922'    │    '0.9922'     │
│    9    │                         'Occupation: '                         │                      'Software Engineer\n'                       │    '0.9914'    │    '0.9914'     │
│   10    │                            'Zip: '                             │                            '07082\n'                             │    '0.9904'    │    '0.9904'     │
│   11    │                           'Email: '                            │                    'Sally, waller@cmail.com '                    │    '0.9681'    │    '0.9681'     │
│   12    │                     'Emergency Contact: '                      │                          'Eva Walker '                           │    '0.9430'    │    '0.9430'     │
│   13    │ 'Describe your medical concerns (symptoms, diagnoses, etc):\n' │ 'Runny nose, mucas in throat, weakness,\naches, chills, tired\n' │    '0.7817'    │    '0.7817'     │
└─────────┴────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────┴────────────────┴─────────────────┘

10. Félicitations !

Félicitations, vous avez bien extrait des données d'un formulaire manuscrit à l'aide de l'API Document AI. Nous vous encourageons à tester d'autres images de formulaires.

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

Licence

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