Document AI를 사용하여 필기 입력 양식 (Node.js)을 지능적으로 처리

1. 개요

Document AI란?

Document AI API는 문서, 이메일 등과 같은 구조화되지 않은 데이터를 가져와 데이터의 이해, 분석, 사용을 쉽게 만들어 주는 문서 이해 솔루션입니다. 이 API는 콘텐츠 분류, 항목 추출, 고급 검색 등을 통해 구조를 제공합니다.

이 튜토리얼에서는 Node.js와 함께 Document AI API를 사용하는 데 중점을 둡니다. 이 튜토리얼에서는 간단한 의료 섭취 양식을 파싱하는 방법을 보여줍니다.

학습 내용

  • Document AI API를 사용 설정하는 방법
  • API 요청을 인증하는 방법
  • Node.js용 클라이언트 라이브러리를 설치하는 방법
  • 스캔한 양식에서 데이터를 파싱하는 방법

필요한 사항

  • Google Cloud 프로젝트
  • 브라우저(Chrome 또는 Firefox 등)
  • Node.js에 관한 지식

설문조사

이 튜토리얼을 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다 읽은 다음 연습 활동을 완료할 계획입니다

귀하의 Node.js 사용 경험을 평가해 주세요.

초급 중급 고급

귀하의 Google Cloud 서비스 사용 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 설정 및 요구사항

자습형 환경 설정

  1. Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억해 두세요. (위의 이름은 이미 사용 중이므로 사용할 수 없습니다.) 나중에 이 ID를 PROJECT_ID로 제공해야 합니다.

  1. 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud 콘솔에서 결제를 사용 설정해야 합니다.

'삭제' 섹션의 안내를 따르세요. 이 섹션에서는 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하는 방법을 알려줍니다 Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 시작

노트북에서 Google를 원격으로 운영할 수도 있지만, 이 Codelab에서는 클라우드에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud Console에서 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은 클라우드에 호스팅된 가상 머신에 대한 터미널 액세스를 제공합니다. 필요한 모든 개발 도구는 가상 머신에 포함되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.

  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. Cloud Document AI API 사용 설정

Document AI 사용을 시작하려면 우선 API를 사용 설정해야 합니다. 브라우저에서 Cloud 콘솔을 엽니다.

  1. 탐색 메뉴 > API 및 서비스 > 라이브러리 Search API를 클릭합니다.
  2. 'Document AI API'를 검색한 후 사용 설정을 클릭하여 Google Cloud 프로젝트에서 API를 사용합니다.

4. 프로세서 만들기 및 테스트

먼저 이 튜토리얼의 Document AI Platform에서 사용할 양식 파서 프로세서의 인스턴스를 만들어야 합니다.

  1. 콘솔에서 Document AI Platform 개요로 이동합니다.
  2. 프로세서 만들기를 클릭하고 양식 파서프로세서를 선택합니다.
  3. 프로세서 이름을 지정하고 목록에서 리전을 선택합니다.
  4. 만들기를 클릭하여 프로세서를 만듭니다.
  5. 프로세서 ID를 복사합니다. 나중에 코드에서 이 ID를 사용해야 합니다.

(선택사항) 콘솔에서 문서를 업로드하여 프로세서를 테스트할 수 있습니다. 문서 업로드를 클릭하고 파싱할 양식을 선택합니다. 사용할 수 있는 샘플 양식이 없는 경우 이 샘플 양식을 다운로드하여 사용할 수 있습니다.

상태 양식

출력은 다음과 같이 표시됩니다. 파싱된 양식

5. API 요청 인증

Document AI API에 요청을 수행하려면 서비스 계정을 사용해야 합니다. 서비스 계정은 프로젝트에 속하며 Google 클라이언트 Node.js 라이브러리에서 API 요청을 하는 데 사용됩니다. 다른 사용자 계정과 마찬가지로 서비스 계정은 이메일 주소로 표현됩니다. 이 섹션에서는 Cloud SDK를 사용하여 서비스 계정을 만든 후 서비스 계정으로 인증하는 데 필요한 사용자 인증 정보를 만듭니다.

먼저 이 Codelab 전체에서 사용할 PROJECT_ID로 환경 변수를 설정합니다.

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

그런 후, 다음을 사용하여 Document AI API에 액세스할 새 서비스 계정을 만듭니다.

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. 축하합니다.

수고하셨습니다. Document AI API를 사용하여 필기 입력 양식에서 데이터를 추출했습니다. 다른 양식 이미지를 사용해 보시기 바랍니다.

삭제

이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.

  • Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
  • 프로젝트 목록에서 해당 프로젝트를 선택한 후 삭제를 클릭합니다.
  • 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

자세히 알아보기

라이선스

이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.