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

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?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz korzystanie z Node.js?

Początkujący Poziom średnio zaawansowany Biegły

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

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.