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

1. Обзор

Что такое ИИ документов?

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

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

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

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

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

  • Облачный проект Google
  • Браузер, например Chrome или Firefox.
  • Знание Node.js

Опрос

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

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

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

Новичок Средний Опытный

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

Новичок Средний Опытный

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

Самостоятельная настройка среды

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

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

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

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

Запустить Cloud Shell

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

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

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWapJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecH rbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbha

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

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

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

Сначала необходимо создать экземпляр процессора синтаксического анализатора форм для использования в платформе Document AI для этого руководства.

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

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

Форма здоровья

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

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

Чтобы отправлять запросы к API Document AI, вы должны использовать учетную запись службы . Учетная запись службы принадлежит вашему проекту и используется клиентской библиотекой Google 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 Form Parser, прочитайте руководство здесь .

Создайте файл 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. Извлеките пары ключ/значение формы.

Теперь вы можете извлечь из формы пары ключ-значение и соответствующие им показатели достоверности. Объект ответа документа содержит список страниц входного документа. Каждый объект 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 Console перейдите на страницу «Управление ресурсами» .
  • В списке проектов выберите свой проект и нажмите «Удалить».
  • В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу», чтобы удалить проект.

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

Лицензия

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