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

1. ภาพรวม

Document AI คืออะไร

API ของ Document AI เป็นโซลูชันการทำความเข้าใจเอกสารที่ใช้ Unstructured Data เช่น เอกสาร อีเมล และอื่นๆ แล้วทำให้ข้อมูลเข้าใจ วิเคราะห์ และนำไปใช้ได้ง่ายขึ้น 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 จากแล็ปท็อประยะไกลได้ แต่โค้ดแล็บนี้จะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

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

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

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

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

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

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

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

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

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

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

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

หากต้องการส่งคำขอไปยัง Document AI API คุณต้องใช้บัญชีบริการ บัญชีบริการเป็นของโปรเจ็กต์ของคุณ และไลบรารี Node.js ของไคลเอ็นต์ Google จะใช้บัญชีนี้เพื่อส่งคำขอ 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. ดาวน์โหลดแบบฟอร์มตัวอย่าง

เรามีแบบฟอร์มตัวอย่างให้ใช้ซึ่งจัดเก็บไว้ใน Bucket ตัวอย่างของ 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 แบบไม่พร้อมกันได้ด้วย หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Form Parser 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

ในขั้นตอนถัดไป คุณจะแยก Structured Data ที่จัดเก็บในฐานข้อมูลได้ง่ายขึ้น หรือใช้ในแอปพลิเคชันอื่นๆ ได้

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

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป