Используйте искусственный интеллект документов для интеллектуальной обработки рукописных форм (Node.js)

1. Обзор

Что такое Document AI?

API Document AI — это решение для анализа документов, которое обрабатывает неструктурированные данные, такие как документы, электронные письма и т. д., и упрощает их понимание, анализ и использование. API обеспечивает структурирование за счет классификации контента, извлечения сущностей, расширенного поиска и многого другого.

В этом уроке вы сосредоточитесь на использовании API Document AI с Node.js. В уроке показано, как анализировать простую медицинскую анкету.

Что вы узнаете

  • Как включить API Document AI
  • Как аутентифицировать запросы API
  • Как установить клиентскую библиотеку для Node.js
  • Как извлечь данные из отсканированной формы

Что вам понадобится

  • Проект Google Cloud
  • Браузер, например Chrome или Firefox.
  • Знание Node.js

Опрос

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Node.js?

Новичок Средний Профессионал

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud. (Ваше имя уже занято и вам не подойдёт, извините!). Этот идентификатор необходимо будет указать позже в формате PROJECT_ID .

  1. Далее, для использования ресурсов Google Cloud необходимо включить оплату в Cloud Console.

Обязательно следуйте инструкциям в разделе «Очистка». В этом разделе указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого руководства. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

В то время как в Google Cloud вы можете управлять им удаленно со своего ноутбука, в этом практическом занятии используется Google Cloud Shell — среда командной строки, работающая в облаке.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его содержимое. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

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

Подготовка и подключение к Cloud Shell займут всего несколько минут.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Cloud Shell предоставляет вам терминальный доступ к виртуальной машине, размещенной в облаке. Виртуальная машина включает в себя все необходимые инструменты разработки. Она предлагает постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.

После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

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

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

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Включите API Cloud Document AI.

Прежде чем начать использовать Document AI, необходимо включить API. Откройте консоль Cloud в браузере.

  1. Нажмите меню навигации ☰ > API и сервисы > Библиотека . API поиска
  2. Найдите "Document AI API", затем нажмите " Включить" , чтобы использовать API в своем проекте Google Cloud.

4. Создайте и протестируйте процессор.

Для использования в этом руководстве необходимо сначала создать экземпляр процессора Form Parser, который будет применяться в платформе Document AI.

  1. В консоли перейдите к разделу «Обзор платформы Document AI».
  2. Нажмите «Создать обработчик» и выберите «Парсер форм». Процессоры
  3. Укажите название процессора и выберите свой регион из списка.
  4. Нажмите «Создать» , чтобы создать свой процессор.
  5. Скопируйте идентификатор вашего процессора. Он понадобится вам в дальнейшем при работе с кодом.

(Необязательно) Вы можете протестировать свой процессор в консоли, загрузив документ. Нажмите «Загрузить документ» и выберите форму для анализа. Вы можете загрузить и использовать этот образец формы, если у вас нет подходящей формы.

Медицинская форма

Результат должен выглядеть примерно так: Разобранная форма

5. Аутентификация API-запросов

Для отправки запросов к API Document AI необходимо использовать сервисный аккаунт . Сервисный аккаунт принадлежит вашему проекту и используется библиотекой Google Client Node.js для отправки запросов к API. Как и любая другая учетная запись пользователя, сервисный аккаунт представлен адресом электронной почты. В этом разделе вы будете использовать Cloud SDK для создания сервисного аккаунта, а затем создадите учетные данные, необходимые для аутентификации в качестве сервисного аккаунта.

Сначала установите переменную окружения с вашим PROJECT_ID , которую вы будете использовать на протяжении всего этого практического занятия:

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

Далее создайте новую учетную запись службы для доступа к API Document AI, используя:

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

Далее создайте учетные данные, которые ваш код Node.js будет использовать для входа в систему под вашей новой учетной записью службы. Создайте эти учетные данные и сохраните их в виде JSON-файла " ~/key.json ", используя следующую команду:

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

Наконец, установите переменную среды GOOGLE_APPLICATION_CREDENTIALS , которая используется библиотекой для поиска ваших учетных данных. Подробнее об аутентификации через форму см. в руководстве . Переменная среды должна быть установлена ​​на полный путь к созданному вами JSON-файлу с учетными данными, используя:

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

6. Скачайте образец формы.

В нашем общедоступном хранилище образцов Google Cloud Storage хранится образец формы. Используйте следующую команду, чтобы загрузить его в свою рабочую директорию.

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

Убедитесь, что файл загружен в вашу облачную оболочку, используя следующую команду:

ls -ltr form.pdf

7. Установите клиентскую библиотеку.

Далее разместите свой код в рабочей директории.

Инициализируйте новый пакет Node.js:

npm init

Установите клиентскую библиотеку Document AI :

npm install @google-cloud/documentai

8. Создайте запрос на документацию по синхронному процессу.

На этом этапе вы выполняете вызов обработки документа, используя синхронную конечную точку. Для обработки больших объемов документов одновременно можно также использовать асинхронный API; чтобы узнать больше об использовании API парсера форм, ознакомьтесь с руководством здесь .

Создайте файл index.js и вставьте в него следующий код. Заполните соответствующие переменные информацией о вашем процессоре.

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

Запустите свой код, и в консоли должен отобразиться следующий текст.

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

На следующих этапах вы извлекаете структурированные данные, которые легче хранить в базах данных или использовать в других приложениях.

9. Извлеките пары ключ/значение из формы.

Теперь вы можете извлечь пары ключ-значение из формы и соответствующие им оценки достоверности. Объект ответа Document содержит список страниц из входного документа. Каждый объект page содержит список полей формы и их расположение в тексте.

Приведенный ниже код перебирает каждую страницу и извлекает каждый ключ, значение и оценку достоверности.

Добавьте следующую функцию в свой код.

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

Добавьте вызов функции extractFormData() внутрь основной функции и выведите полученный объект в виде таблицы.

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

Теперь запустите свой код. При использовании нашего примера документа вы должны увидеть следующий результат:

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. Поздравляем!

Поздравляем, вы успешно использовали API Document AI для извлечения данных из рукописной формы. Мы рекомендуем вам поэкспериментировать с другими изображениями форм.

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этом руководстве:

  • В консоли Cloud перейдите на страницу «Управление ресурсами» .
  • В списке проектов выберите свой проект и нажмите «Удалить».
  • В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.

Узнать больше

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.