Специализированные процессоры с искусственным интеллектом документов (Python)

1. Введение

В этом практическом занятии вы научитесь использовать специализированные процессоры Document AI для классификации и анализа специализированных документов с помощью Python. Для классификации и разделения мы будем использовать пример PDF-файла, содержащего счета-фактуры, квитанции и выписки по коммунальным услугам. Затем, для анализа и извлечения сущностей, мы будем использовать в качестве примера счет-фактуру.

Данная процедура и пример кода будут работать с любым специализированным документом, поддерживаемым Document AI.

Предварительные требования

Данный практический семинар основан на материалах других практических семинаров по искусственному интеллекту для работы с документами.

Перед продолжением рекомендуется выполнить следующие практические задания:

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

  • Как классифицировать и выявлять точки разделения для специализированных документов.
  • Как извлекать схематизированные сущности с помощью специализированных процессоров.

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

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

2. Настройка

В этом практическом занятии предполагается, что вы выполнили шаги по настройке Document AI, описанные во вводном практическом занятии .

Перед продолжением выполните следующие шаги:

Вам также потребуется установить Pandas , популярную библиотеку для анализа данных в Python.

pip3 install --upgrade pandas

3. Создание специализированных процессоров

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

  1. В консоли перейдите к разделу «Обзор платформы Document AI».
  2. Нажмите «Создать обработчик» , прокрутите вниз до раздела «Специализированные» и выберите «Разделитель закупочных документов» .
  3. Присвойте ему имя "codelab-procurement-splitter" (или что-нибудь другое, что вы запомните) и выберите ближайший регион из списка.
  4. Нажмите «Создать» , чтобы создать свой процессор.
  5. Скопируйте идентификатор процессора. Он понадобится вам в дальнейшем при работе с кодом.
  6. Повторите шаги 2-6 с парсером счетов (который можно назвать "codelab-invoice-parser")

Тестовый процессор в консоли

Вы можете протестировать парсер счетов в консоли, загрузив документ.

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

google_invoice.png

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

InvoiceParser.png

4. Скачать образцы документов

У нас есть несколько образцов документов, которые можно использовать для этой лабораторной работы.

Вы можете скачать PDF-файлы, используя следующие ссылки. Затем загрузите их в экземпляр Cloud Shell .

В качестве альтернативы вы можете загрузить их из нашего общедоступного облачного хранилища с помощью команды gsutil .

gsutil cp gs://cloud-samples-data/documentai/codelabs/specialized-processors/procurement_multi_document.pdf .

gsutil cp gs://cloud-samples-data/documentai/codelabs/specialized-processors/google_invoice.pdf .

5. Классифицируйте и разделите документы.

На этом этапе вы будете использовать API онлайн-обработки для классификации и обнаружения логических точек разделения в многостраничном документе.

Вы также можете использовать API пакетной обработки, если хотите отправить несколько файлов или если размер файла превышает максимальное количество страниц, разрешенное для онлайн-обработки . Инструкции по этому поводу можно найти в руководстве Document AI OCR Codelab .

Код для выполнения запроса к API идентичен для обычного процессора, за исключением идентификатора процессора.

Разделитель/классификатор закупок

Создайте файл с именем classification.py и используйте приведенный ниже код.

Замените PROCUREMENT_SPLITTER_ID на идентификатор созданного вами ранее процессора разделения закупок. Замените YOUR_PROJECT_ID и YOUR_PROJECT_LOCATION на идентификатор вашего облачного проекта и местоположение процессора соответственно.

classification.py

import pandas as pd
from google.cloud import documentai_v1 as documentai


def online_process(
    project_id: str,
    location: str,
    processor_id: str,
    file_path: str,
    mime_type: str,
) -> documentai.Document:
    """
    Processes a document using the Document AI Online Processing API.
    """

    opts = {"api_endpoint": f"{location}-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # 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
    resource_name = documentai_client.processor_path(project_id, location, processor_id)

    # Read the file into memory
    with open(file_path, "rb") as file:
        file_content = file.read()

    # Load Binary Data into Document AI RawDocument Object
    raw_document = documentai.RawDocument(content=file_content, mime_type=mime_type)

    # Configure the process request
    request = documentai.ProcessRequest(name=resource_name, raw_document=raw_document)

    # Use the Document AI client to process the sample form
    result = documentai_client.process_document(request=request)

    return result.document


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "PROCUREMENT_SPLITTER_ID"  # Create processor in Cloud Console

# The local file in your current working directory
FILE_PATH = "procurement_multi_document.pdf"
# Refer to https://cloud.google.com/document-ai/docs/processors-list
# for supported file types
MIME_TYPE = "application/pdf"

document = online_process(
    project_id=PROJECT_ID,
    location=LOCATION,
    processor_id=PROCESSOR_ID,
    file_path=FILE_PATH,
    mime_type=MIME_TYPE,
)

print("Document processing complete.")

types = []
confidence = []
pages = []

# Each Document.entity is a classification
for entity in document.entities:
    classification = entity.type_
    types.append(classification)
    confidence.append(f"{entity.confidence:.0%}")

    # entity.page_ref contains the pages that match the classification
    pages_list = []
    for page_ref in entity.page_anchor.page_refs:
        pages_list.append(page_ref.page)
    pages.append(pages_list)

# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame({"Classification": types, "Confidence": confidence, "Pages": pages})

print(df)

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

$ python3 classification.py
Document processing complete.
         Classification Confidence Pages
0     invoice_statement       100%   [0]
1     receipt_statement        98%   [1]
2                 other        81%   [2]
3     utility_statement       100%   [3]
4  restaurant_statement       100%   [4]

Обратите внимание, что инструмент разделения/классификации закупок правильно определил типы документов на страницах 0-1 и 3-4.

На странице 2 находится типовая медицинская анкета, поэтому классификатор правильно определил ее как other .

6. Извлеките сущности.

Теперь вы можете извлечь из файлов схематизированные сущности, включая оценки достоверности, свойства и нормализованные значения.

Код для выполнения запроса к API идентичен предыдущему шагу, и его можно выполнить как с помощью онлайн-запросов, так и пакетных запросов.

Мы получим следующую информацию от этих организаций:

  • Тип сущности
    • (например, invoice_date , receiver_name , total_amount )
  • Исходные значения
    • Значения данных представлены в исходном файле документа.
  • Нормализованные значения
    • Значения данных представлены в нормализованном и стандартном формате, если применимо.
    • Также может включать обогащение данных из корпоративного графа знаний.
  • Значения уверенности
    • Насколько "уверена" модель в точности полученных значений.

Некоторые типы сущностей, такие как line_item могут также включать свойства, являющиеся вложенными сущностями, например line_item/unit_price и line_item/description .

В этом примере вложенная структура сведена к одному уровню для удобства просмотра.

Парсер счетов-фактур

Создайте файл с именем extraction.py и используйте приведенный ниже код.

Замените INVOICE_PARSER_ID на идентификатор созданного вами ранее процессора парсинга счетов и используйте файл google_invoice.pdf

extraction.py

import pandas as pd
from google.cloud import documentai_v1 as documentai


def online_process(
    project_id: str,
    location: str,
    processor_id: str,
    file_path: str,
    mime_type: str,
) -> documentai.Document:
    """
    Processes a document using the Document AI Online Processing API.
    """

    opts = {"api_endpoint": f"{location}-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # 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
    resource_name = documentai_client.processor_path(project_id, location, processor_id)

    # Read the file into memory
    with open(file_path, "rb") as file:
        file_content = file.read()

    # Load Binary Data into Document AI RawDocument Object
    raw_document = documentai.RawDocument(content=file_content, mime_type=mime_type)

    # Configure the process request
    request = documentai.ProcessRequest(name=resource_name, raw_document=raw_document)

    # Use the Document AI client to process the sample form
    result = documentai_client.process_document(request=request)

    return result.document


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "INVOICE_PARSER_ID"  # Create processor in Cloud Console

# The local file in your current working directory
FILE_PATH = "google_invoice.pdf"
# Refer to https://cloud.google.com/document-ai/docs/processors-list
# for supported file types
MIME_TYPE = "application/pdf"

document = online_process(
    project_id=PROJECT_ID,
    location=LOCATION,
    processor_id=PROCESSOR_ID,
    file_path=FILE_PATH,
    mime_type=MIME_TYPE,
)

types = []
raw_values = []
normalized_values = []
confidence = []

# Grab each key/value pair and their corresponding confidence scores.
for entity in document.entities:
    types.append(entity.type_)
    raw_values.append(entity.mention_text)
    normalized_values.append(entity.normalized_value.text)
    confidence.append(f"{entity.confidence:.0%}")

    # Get Properties (Sub-Entities) with confidence scores
    for prop in entity.properties:
        types.append(prop.type_)
        raw_values.append(prop.mention_text)
        normalized_values.append(prop.normalized_value.text)
        confidence.append(f"{prop.confidence:.0%}")

# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
    {
        "Type": types,
        "Raw Value": raw_values,
        "Normalized Value": normalized_values,
        "Confidence": confidence,
    }
)

print(df)

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

$ python3 extraction.py
                     Type                                         Raw Value Normalized Value Confidence
0                     vat                                         $1,767.97                        100%
1          vat/tax_amount                                         $1,767.97      1767.97 USD         0%
2            invoice_date                                      Sep 24, 2019       2019-09-24        99%
3                due_date                                      Sep 30, 2019       2019-09-30        99%
4            total_amount                                         19,647.68         19647.68        97%
5        total_tax_amount                                         $1,767.97      1767.97 USD        92%
6              net_amount                                         22,379.39         22379.39        91%
7           receiver_name                                       Jane Smith,                         83%
8              invoice_id                                         23413561D                         67%
9        receiver_address  1600 Amphitheatre Pkway\nMountain View, CA 94043                         66%
10         freight_amount                                           $199.99       199.99 USD        56%
11               currency                                                 $              USD        53%
12          supplier_name                                        John Smith                         19%
13         purchase_order                                         23413561D                          1%
14        receiver_tax_id                                         23413561D                          0%
15          supplier_iban                                         23413561D                          0%
16              line_item                   9.99 12 12 ft HDMI cable 119.88                        100%
17   line_item/unit_price                                              9.99             9.99        90%
18     line_item/quantity                                                12               12        77%
19  line_item/description                                  12 ft HDMI cable                         39%
20       line_item/amount                                            119.88           119.88        92%
21              line_item           12 399.99 27" Computer Monitor 4,799.88                        100%
22     line_item/quantity                                                12               12        80%
23   line_item/unit_price                                            399.99           399.99        91%
24  line_item/description                              27" Computer Monitor                         15%
25       line_item/amount                                          4,799.88          4799.88        94%
26              line_item                Ergonomic Keyboard 12 59.99 719.88                        100%
27  line_item/description                                Ergonomic Keyboard                         32%
28     line_item/quantity                                                12               12        76%
29   line_item/unit_price                                             59.99            59.99        92%
30       line_item/amount                                            719.88           719.88        94%
31              line_item                     Optical mouse 12 19.99 239.88                        100%
32  line_item/description                                     Optical mouse                         26%
33     line_item/quantity                                                12               12        78%
34   line_item/unit_price                                             19.99            19.99        91%
35       line_item/amount                                            239.88           239.88        94%
36              line_item                      Laptop 12 1,299.99 15,599.88                        100%
37  line_item/description                                            Laptop                         83%
38     line_item/quantity                                                12               12        76%
39   line_item/unit_price                                          1,299.99          1299.99        90%
40       line_item/amount                                         15,599.88         15599.88        94%
41              line_item              Misc processing fees 899.99 899.99 1                        100%
42  line_item/description                              Misc processing fees                         22%
43   line_item/unit_price                                            899.99           899.99        91%
44       line_item/amount                                            899.99           899.99        94%
45     line_item/quantity                                                 1                1        63%

7. Дополнительно: Попробуйте другие специализированные процессоры.

Вы успешно использовали Document AI для управления закупками, чтобы классифицировать документы и проанализировать счет-фактуру. Document AI также поддерживает другие специализированные решения, перечисленные здесь:

Вы можете следовать той же процедуре и использовать тот же код для обработки любого специализированного процессора.

Если вы хотите опробовать другие специализированные решения, вы можете повторно запустить лабораторную работу с другими типами процессоров и специализированными примерами документов.

Образцы документов

Вот несколько примеров документов, которые вы можете использовать, чтобы опробовать другие специализированные процессоры.

Решение

Тип процессора

Документ

Личность

Парсер водительских прав США

Кредитование

Разделитель и классификатор кредитов

Кредитование

Парсер W9

Контракты

Парсер контрактов

Другие примеры документов и результаты работы процессора можно найти в документации .

8. Поздравляем!

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

Уборка

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

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

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

Продолжите изучение Document AI с помощью этих дополнительных практических занятий.

Ресурсы

Лицензия

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