Używanie Document AI do inteligentnego przetwarzania odręcznych formularzy (Node.js)

Używanie Document AI do inteligentnego przetwarzania odręcznych formularzy (Node.js)

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: sie 9, 2022
account_circleAutorzy: Anu Srivastava

1. Omówienie

Co to jest Document AI?

Interfejs API Document AI to rozwiązanie do rozumienia dokumentów, które przyjmuje nieuporządkowane dane, takie jak dokumenty czy e-maile, oraz ułatwia ich analizowanie, analizowanie i wykorzystywanie. Zapewnia on strukturę dzięki klasyfikacji treści, wyodrębnianiu encji, wyszukiwaniu zaawansowanym i innym funkcjom.

Z tego samouczka dowiesz się, jak używać interfejsu Document AI API w środowisku Node.js. Samouczek pokazuje, jak przeanalizować prosty formularz sanitarny.

Czego się nauczysz

  • Jak włączyć interfejs Document AI API
  • Jak uwierzytelniać żądania do interfejsu API
  • Jak zainstalować bibliotekę klienta dla środowiska Node.js
  • Analizowanie danych ze zeskanowanego formularza

Czego potrzebujesz

  • Projekt Google Cloud
  • przeglądarkę, np. Chrome lub Firefox;
  • Znajomość środowiska Node.js

Ankieta

Jak wykorzystasz ten samouczek?

Jak oceniasz korzystanie z Node.js?

Jak oceniasz korzystanie z usług Google Cloud?

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć.

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud. (Twoja nazwa jest już zajęta i nie będzie Ci odpowiadać). Musisz podać ten identyfikator później jako PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.

Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” . W tej sekcji znajdziesz informacje na temat wyłączania zasobów, aby nie naliczać opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud możesz korzystać zdalnie z laptopa, ale to ćwiczenie w programowaniu wykorzystuje Google Cloud Shell – środowisko wiersza poleceń działające w Cloud.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jeśli dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:

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

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Cloud Shell zapewnia dostęp do terminala maszyny wirtualnej hostowanej w chmurze. Maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość czynności z tego ćwiczenia z programowania można wykonać w przeglądarce lub na Chromebooku.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Włączanie interfejsu Cloud Document AI API

Zanim zaczniesz korzystać z Document AI, musisz włączyć interfejs API. Otwórz konsolę Cloud w przeglądarce.

  1. Kliknij Menu nawigacyjne OK > Interfejsy API Usługi > Biblioteka. Interfejs API wyszukiwarki
  2. Wyszukaj „Document AI API”, a następnie kliknij Włącz, aby używać interfejsu API w projekcie Google Cloud.

4. Utwórz i przetestuj procesor

Musisz najpierw utworzyć instancję procesora parsera formularzy do użycia na platformie Document AI w tym samouczku.

  1. W konsoli przejdź do omówienia Document AI Platform.
  2. Kliknij Create Processor (Utwórz procesor) i wybierz Form Parser.Procesory
  3. Podaj nazwę procesora i wybierz region z listy.
  4. Kliknij Utwórz, aby utworzyć procesor.
  5. Skopiuj identyfikator podmiotu przetwarzającego. Będzie trzeba użyć go później w kodzie.

(Opcjonalnie) Możesz przetestować procesor w konsoli, przesyłając dokument. Kliknij Prześlij dokument i wybierz formularz do przeanalizowania. Jeśli nie masz jeszcze odpowiedniego formularza, możesz go pobrać i wykorzystać.

Formularz zdrowotny

Dane wyjściowe powinny wyglądać tak: Przeanalizowany formularz

5. Uwierzytelnianie żądań do interfejsu API

Aby wysyłać żądania do interfejsu Document AI API, musisz używać konta usługi. Konto usługi należy do Twojego projektu i jest używane przez bibliotekę klienta Google Node.js do wysyłania żądań do interfejsu API. Tak jak każde inne konto użytkownika, konto usługi jest reprezentowane przez adres e-mail. W tej sekcji utworzysz konto usługi za pomocą pakietu Cloud SDK, a następnie utworzysz dane logowania, których użyjesz do uwierzytelnienia jako konto usługi.

Najpierw ustaw zmienną środowiskową za pomocą parametru PROJECT_ID, którego będziesz używać podczas tego ćwiczenia z programowania:

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

Następnie utwórz nowe konto usługi z dostępem do interfejsu Document AI API, używając polecenia:

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

Następnie utwórz dane logowania, których Twój kod w Node.js będzie używać do logowania się na Twoje nowe konto usługi. Utwórz te dane i zapisz je w pliku JSON „~/key.json”. za pomocą tego polecenia:

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

Ostatnim krokiem jest utworzenie zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS, która będzie używana przez biblioteka do wyszukiwania Twoich danych logowania. Więcej informacji o uwierzytelnianiu za pomocą formularza znajdziesz w przewodniku. Zmienna środowiskowa powinna zawierać pełną ścieżkę do utworzonego przez Ciebie pliku JSON z danymi logowania za pomocą polecenia:

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

6. Pobierz przykładowy formularz

Udostępniamy przykładowy formularz do użycia w naszym publicznym zasobniku próbek w Google Cloud Storage. Użyj tego polecenia, aby pobrać go do katalogu roboczego.

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

Sprawdź, czy plik został pobrany do Cloud Shell, używając tego polecenia:

ls -ltr form.pdf

7. Instalowanie biblioteki klienta

Następnie skonfiguruj kod w katalogu roboczym.

Zainicjuj nowy pakiet Node.js:

npm init

Zainstaluj bibliotekę klienta Document AI:

npm install @google-cloud/documentai

8. Wykonywanie żądania dokumentu dotyczącego procesu synchronicznego

W tym kroku wykonasz wywołanie dokumentu procesu za pomocą synchronicznego punktu końcowego. Do przetwarzania dużej liczby dokumentów jednocześnie możesz użyć asynchronicznego interfejsu API. Więcej informacji o korzystaniu z interfejsów Form Parser API znajdziesz w tym przewodniku.

Utwórz plik index.js i wklej ten kod. W odpowiednich zmiennych wpisz informacje o procesorze.

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;
});

Uruchom ten kod teraz. W konsoli powinien się pojawić poniższy tekst.

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

W następnych krokach wyodrębnisz uporządkowane dane, które można łatwiej przechowywać w bazach danych lub używać ich w innych aplikacjach.

9. Wyodrębnianie par klucz-wartość formularza

Teraz możesz wyodrębnić pary klucz-wartość z formularza i odpowiadające im wskaźniki ufności. Obiekt odpowiedzi Document zawiera listę stron z dokumentu wejściowego. Każdy obiekt page zawiera listę pól formularza i ich lokalizacji w tekście.

Następujący kod wykona iterację na każdej stronie i wyodrębnia każdy klucz, wartość oraz wskaźnik ufności.

Dodaj do kodu poniższą funkcję.

/**
 * 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;
}

Dodaj wywołanie do funkcji extractFormData() z poziomu funkcji głównej i wydrukuj powstały obiekt w formie tabeli.

/**
 * 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);
}

Teraz uruchom kod. Jeśli korzystasz z przykładowego dokumentu, dane wyjściowe powinny wyglądać tak:

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. Gratulacje!

Gratulujemy! Udało Ci się użyć interfejsu Document AI API do wyodrębniania danych z odręcznego formularza. Zachęcamy do eksperymentowania z innymi obrazami formularza.

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku:

  • W konsoli Cloud otwórz stronę Zarządzanie zasobami.
  • Na liście projektów wybierz swój projekt i kliknij Usuń.
  • W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.