ใช้ Document AI เพื่อประมวลผลแบบฟอร์มที่เขียนด้วยลายมือของคุณ (Node.js) อย่างชาญฉลาด

1. ภาพรวม

Document AI คืออะไร

Document AI API เป็นโซลูชันการทำความเข้าใจเอกสารซึ่งนำข้อมูลที่ไม่มีโครงสร้างมาใช้ เช่น เอกสาร อีเมล และอื่นๆ และทำให้เข้าใจ วิเคราะห์ และใช้ข้อมูลได้ง่ายขึ้น โดย API นี้ให้โครงสร้างผ่านการจัดประเภทเนื้อหา การแยกเอนทิตี การค้นหาขั้นสูง และอีกมากมาย

ในบทแนะนำนี้ คุณจะมุ่งเน้นที่การใช้ Document AI API กับ Node.js บทแนะนำจะสาธิตวิธีแยกวิเคราะห์แบบฟอร์มทางการแพทย์พื้นฐาน

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเปิดใช้ Document AI API
  • วิธีตรวจสอบสิทธิ์คำขอ API
  • วิธีติดตั้งไลบรารีของไคลเอ็นต์สำหรับ Node.js
  • วิธีแยกวิเคราะห์ข้อมูลจากแบบฟอร์มที่สแกน

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud
  • เบราว์เซอร์ เช่น 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 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่ Codelab นี้ใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell กริ๊งๆๆๆ จาก Cloud Console

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 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ 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. เปิดใช้ Cloud Document AI API

ก่อนที่จะเริ่มใช้ Document AI คุณต้องเปิดใช้ API เปิด Cloud Console ในเบราว์เซอร์

  1. คลิกเมนูนำทาง ☰ > API และ บริการ > คลัง API การค้นหา
  2. ค้นหา "Document AI API" แล้วคลิกเปิดใช้เพื่อใช้ API ในโปรเจ็กต์ Google Cloud

4. สร้างและทดสอบโปรเซสเซอร์

ก่อนอื่น คุณต้องสร้างอินสแตนซ์ของโปรแกรมแยกวิเคราะห์แบบฟอร์มเพื่อใช้ใน Document AI Platform สำหรับบทแนะนำนี้

  1. ในคอนโซล ให้ไปที่ภาพรวมของ Document AI Platform
  2. คลิกสร้างตัวประมวลผลแล้วเลือกโปรแกรมแยกวิเคราะห์แบบฟอร์มโปรเซสเซอร์
  3. ระบุชื่อผู้ประมวลผลข้อมูลและเลือกภูมิภาคของคุณจากรายการ
  4. คลิกสร้างเพื่อสร้างโปรเซสเซอร์
  5. คัดลอกรหัสผู้ประมวลผลข้อมูล คุณต้องใช้สิ่งนี้ในรหัสในภายหลัง

(ไม่บังคับ) คุณทดสอบโปรเซสเซอร์ในคอนโซลได้โดยการอัปโหลดเอกสาร คลิกอัปโหลดเอกสารและเลือกแบบฟอร์มที่จะแยกวิเคราะห์ คุณจะดาวน์โหลดและใช้ตัวอย่างแบบฟอร์มได้หากไม่มีแบบฟอร์มให้ใช้

แบบฟอร์มสุขภาพ

เอาต์พุตควรมีลักษณะดังนี้ แบบฟอร์มที่แยกวิเคราะห์

5. ตรวจสอบสิทธิ์คำขอ API

หากต้องการส่งคำขอไปยัง Document AI API คุณต้องใช้บัญชีบริการ บัญชีบริการเป็นของโปรเจ็กต์และไลบรารี Google Client Node.js จะใช้บัญชีนี้เพื่อสร้างคำขอ API บัญชีบริการจะแสดงด้วยอีเมลเช่นเดียวกับบัญชีผู้ใช้อื่นๆ ในส่วนนี้ คุณจะใช้ Cloud SDK เพื่อสร้างบัญชีบริการ จากนั้นจึงสร้างข้อมูลเข้าสู่ระบบที่ต้องใช้เพื่อตรวจสอบสิทธิ์ว่าเป็นบัญชีบริการ

ก่อนอื่นให้ตั้งค่าตัวแปรสภาพแวดล้อมด้วย PROJECT_ID ซึ่งคุณจะใช้ตลอดทั้ง Codelab นี้

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 .

ยืนยันว่าดาวน์โหลดไฟล์ไปยัง Cloud Shell แล้วโดยใช้คำสั่งด้านล่าง

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. ดึงข้อมูลคู่คีย์/ค่าของแบบฟอร์ม

ตอนนี้คุณสามารถดึงคู่คีย์-ค่าจากแบบฟอร์มและคะแนนความเชื่อมั่นที่เกี่ยวข้องได้แล้ว ออบเจ็กต์การตอบกลับเอกสารมีรายการหน้าจากเอกสารอินพุต ออบเจ็กต์ 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 Console ให้ไปที่หน้าจัดการทรัพยากร
  • ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ของคุณ แล้วคลิกลบ
  • ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์แล้วคลิกปิดเครื่องเพื่อลบโปรเจ็กต์

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0