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

1. Przegląd

Co to jest Document AI?

Interfejs Document AI to rozwiązanie do analizy dokumentów, które przetwarza dane nieustrukturyzowane, takie jak dokumenty, e-maile itp., i ułatwia ich zrozumienie, analizowanie i wykorzystywanie. Interfejs API zapewnia strukturę dzięki klasyfikacji treści, wyodrębnianiu encji, wyszukiwaniu zaawansowanemu i innym funkcjom.

W tym samouczku skupisz się na korzystaniu z interfejsu Document AI API w Node.js. W tym samouczku pokazujemy, jak przeanalizować prosty formularz przyjęcia do szpitala.

Czego się nauczysz

  • Jak włączyć interfejs Document AI API
  • Uwierzytelnianie żądań do interfejsu API
  • Instalowanie biblioteki klienta dla Node.js
  • Jak analizować dane ze zeskanowanego formularza

Czego potrzebujesz

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

Ankieta

Jak zamierzasz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie z Node.js?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

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

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud. (Twoje imię i nazwisko powyżej są już zajęte i nie będą działać. Przepraszamy!). Musisz podać ten identyfikator później jako PROJECT_ID.

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

Pamiętaj, aby postępować zgodnie z instrukcjami w sekcji „Czyszczenie”. W tej sekcji znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Po zalogowaniu się w Google Cloud możesz zdalnie korzystać z tej usługi na laptopie. W tym ćwiczeniu programistycznym używamy Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni (część strony widoczna po przewinięciu) z opisem tego środowiska. W takim przypadku kliknij Dalej, a ten ekran nie będzie się już wyświetlać. Ten wyświetlany jednorazowo ekran wygląda tak:

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Cloud Shell zapewnia dostęp z terminala do maszyny wirtualnej hostowanej w chmurze. Maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce lub na Chromebooku.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik 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

Wynik polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Wynik 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 Cloud Console w przeglądarce.

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

4. Tworzenie i testowanie procesora

Aby skorzystać z tego samouczka, musisz najpierw utworzyć instancję procesora Form Parser do użycia na platformie Document AI.

  1. W konsoli otwórz Przegląd platformy Document AI.
  2. Kliknij Utwórz procesor i wybierz Form Parser.Procesory
  3. Wpisz nazwę procesora i wybierz region z listy.
  4. Kliknij Utwórz, aby utworzyć procesor.
  5. Skopiuj identyfikator procesora. 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 dostępnego formularza, możesz pobrać i użyć tego przykładowego formularza.

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żyć konta usługi. Konto usługi należy do Twojego projektu i jest używane przez bibliotekę klienta Google Node.js do tworzenia żądań interfejsu API. Podobnie jak każde inne konto użytkownika, konto usługi jest reprezentowane przez adres e-mail. W tej sekcji użyjesz pakietu SDK Cloud, aby utworzyć konto usługi, a następnie utworzysz dane logowania potrzebne do uwierzytelnienia się jako konto usługi.

Najpierw ustaw zmienną środowiskową wykorzystującą Twój PROJECT_ID, której będziesz używać podczas naszych ćwiczeń z programowania:

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

Następnie utwórz nowe konto usługi, aby uzyskać dostęp do interfejsu Document AI API, korzystając z:

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

Następnie utwórz dane logowania, których kod Node.js będzie używać do logowania się na nowe konto usługi. Utworzone dane zapisz w pliku JSON „~/key.json” przy użyciu następującego polecenia:

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

Na koniec ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS, która jest używana przez bibliotekę do znajdowania danych logowania. Więcej informacji o uwierzytelnianiu za pomocą formularza znajdziesz w tym przewodniku. Zmienna środowiskowa powinna zawierać pełną ścieżkę do utworzonego przez Ciebie pliku JSON z danymi logowania. Aby to zrobić, użyj tego polecenia:

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

6. Pobieranie przykładowego formularza

W naszym publicznym przykładowym zasobniku Google Cloud Storage mamy przykładowy formularz. Aby pobrać go do katalogu roboczego, użyj tego polecenia:

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. Tworzenie synchronicznego żądania dokumentu procesu

Na tym etapie wywołujesz dokument procesu za pomocą synchronicznego punktu końcowego. Do przetwarzania dużej liczby dokumentów naraz możesz też używać interfejsu API do przetwarzania asynchronicznego. Więcej informacji o korzystaniu z interfejsów Form Parser API znajdziesz w tym przewodniku tutaj.

Utwórz plik index.js i wklej ten kod. Wypełnij odpowiednie zmienne informacjami 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 teraz kod. W konsoli powinien pojawić się ten 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 kolejnych krokach wyodrębnisz dane strukturalne, które można łatwiej przechowywać w bazach danych lub wykorzystywać w innych aplikacjach.

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

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

Poniższy kod przechodzi przez każdą stronę i wyodrębnia każdy klucz, wartość i wynik ufności.

Dodaj do kodu tę 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 funkcji extractFormData() w funkcji głównej i wydrukuj wynikowy 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 używasz naszego przykładowego dokumentu, powinny się wyświetlić te dane wyjściowe:

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!

Gratulacje! Udało Ci się wyodrębnić dane z odręcznego formularza za pomocą interfejsu Document AI API. Zachęcamy do eksperymentowania z innymi obrazami formularzy.

Czyszczenie danych

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

  • W Cloud Console otwórz stronę Zarządzanie zasobami.
  • Na liście projektów wybierz projekt, a następnie 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.