1. Введение
В этом практическом занятии вы узнаете, как использовать Document AI Form Parser для анализа рукописных форм с помощью Python.
В качестве примера мы будем использовать простую медицинскую анкету, но эта процедура будет работать с любой обобщенной формой, поддерживаемой DocAI.
Предварительные требования
Данный практический семинар основан на материалах других практических семинаров по искусственному интеллекту для работы с документами.
Перед продолжением рекомендуется выполнить следующие практические задания (Codelabs).
Что вы узнаете
- Как анализировать и извлекать данные из отсканированной формы с помощью Document AI Form Parser.
Что вам понадобится
Опрос
Как вы будете использовать этот учебный материал?
Как бы вы оценили свой опыт работы с Python?
Как бы вы оценили свой опыт использования сервисов Google Cloud?
2. Настройка и требования
В этом практическом занятии предполагается, что вы выполнили шаги по настройке Document AI, описанные в практическом занятии по OCR в Document AI .
Перед продолжением выполните следующие шаги:
Вам также потребуется установить Pandas — библиотеку для анализа данных с открытым исходным кодом, предназначенную для Python.
pip3 install --upgrade pandas
3. Создайте обработчик Form Parser.
Для использования в этом руководстве необходимо сначала создать экземпляр обработчика Form Parser в платформе Document AI.
- В консоли перейдите к разделу «Обзор платформы Document AI».
- Нажмите «Создать обработчик» и выберите «Парсер форм».

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

Результат должен выглядеть примерно так: 
4. Скачайте образец формы.
У нас есть образец документа, содержащий простую анкету для сбора медицинских данных.
Вы можете скачать PDF-файл по следующей ссылке. Затем загрузите его в экземпляр Cloud Shell .
В качестве альтернативы вы можете загрузить его из нашего общедоступного хранилища Google Cloud Storage с помощью команды gsutil .
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/intake-form.pdf .
Убедитесь, что файл загружен в вашу облачную оболочку, используя следующую команду:
ls -ltr intake-form.pdf
5. Извлечение пар ключ/значение из формы
На этом этапе вы воспользуетесь API онлайн-обработки, чтобы вызвать созданный ранее обработчик парсера форм. Затем вы извлечете пары ключ-значение, найденные в документе.
Онлайн-обработка предназначена для отправки одного документа и ожидания ответа. Также можно использовать пакетную обработку, если необходимо отправить несколько файлов или если размер файла превышает максимально допустимое количество страниц для онлайн-обработки . Инструкции по этому поводу можно найти в руководстве по OCR Codelab .
Код для отправки запроса на обработку идентичен для всех типов процессоров, за исключением идентификатора процессора.
Объект ответа Document содержит список страниц из входного документа.
Каждый объект page содержит список полей формы и их расположение в тексте.
Приведенный ниже код перебирает каждую страницу и извлекает каждый ключ, значение и оценку достоверности. Это структурированные данные, которые проще хранить в базах данных или использовать в других приложениях.
Создайте файл с именем form_parser.py и используйте приведенный ниже код.
form_parser.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 image:
image_content = image.read()
# Load Binary Data into Document AI RawDocument Object
raw_document = documentai.RawDocument(
content=image_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
def trim_text(text: str):
"""
Remove extra space characters from text (blank, newline, tab, etc.)
"""
return text.strip().replace("\n", " ")
PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION" # Format is 'us' or 'eu'
PROCESSOR_ID = "FORM_PARSER_ID" # Create processor in Cloud Console
# The local file in your current working directory
FILE_PATH = "intake-form.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,
)
names = []
name_confidence = []
values = []
value_confidence = []
for page in document.pages:
for field in page.form_fields:
# Get the extracted field names
names.append(trim_text(field.field_name.text_anchor.content))
# Confidence - How "sure" the Model is that the text is correct
name_confidence.append(field.field_name.confidence)
values.append(trim_text(field.field_value.text_anchor.content))
value_confidence.append(field.field_value.confidence)
# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
{
"Field Name": names,
"Field Name Confidence": name_confidence,
"Field Value": values,
"Field Value Confidence": value_confidence,
}
)
print(df)
Запустите свой код, и вы увидите извлеченный и выведенный в консоль текст.
При использовании нашего примера документа вы должны увидеть следующий результат:
$ python3 form_parser.py
Field Name Field Name Confidence Field Value Field Value Confidence
0 Phone #: 0.999982 (906) 917-3486 0.999982
1 Emergency Contact: 0.999972 Eva Walker 0.999972
2 Marital Status: 0.999951 Single 0.999951
3 Gender: 0.999933 F 0.999933
4 Occupation: 0.999914 Software Engineer 0.999914
5 Referred By: 0.999862 None 0.999862
6 Date: 0.999858 9/14/19 0.999858
7 DOB: 0.999716 09/04/1986 0.999716
8 Address: 0.999147 24 Barney Lane 0.999147
9 City: 0.997718 Towaco 0.997718
10 Name: 0.997345 Sally Walker 0.997345
11 State: 0.996944 NJ 0.996944
...
6. Анализ таблиц
Парсер форм также способен извлекать данные из таблиц внутри документов. На этом шаге мы загрузим новый образец документа и извлечем данные из таблицы. Поскольку мы загружаем данные в Pandas, эти данные можно вывести в CSV-файл и множество других форматов с помощью одного вызова метода.
Скачайте образец формы с таблицами.
У нас есть образец документа, содержащий типовую форму и таблицу.
Вы можете скачать PDF-файл по следующей ссылке. Затем загрузите его в экземпляр Cloud Shell .
В качестве альтернативы вы можете загрузить его из нашего общедоступного хранилища Google Cloud Storage с помощью команды gsutil .
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/form_with_tables.pdf .
Убедитесь, что файл загружен в вашу облачную оболочку, используя следующую команду:
ls -ltr form_with_tables.pdf
Извлечение данных из таблицы
Обработка запроса на данные таблицы точно такая же, как и при извлечении пар ключ-значение. Разница заключается в том, из каких полей мы извлекаем данные в ответе. Данные таблицы хранятся в поле pages[].tables[] .
В этом примере извлекается информация из строк заголовка и содержимого таблицы для каждой таблицы и страницы, затем таблица выводится на экран и сохраняется в виде CSV-файла.
Создайте файл с именем table_parsing.py и используйте приведенный ниже код.
table_parsing.py
# type: ignore[1]
"""
Uses Document AI online processing to call a form parser processor
Extracts the tables and data in the document.
"""
from os.path import splitext
from typing import List, Sequence
import pandas as pd
from google.cloud import 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 image:
image_content = image.read()
# Load Binary Data into Document AI RawDocument Object
raw_document = documentai.RawDocument(
content=image_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
def get_table_data(
rows: Sequence[documentai.Document.Page.Table.TableRow], text: str
) -> List[List[str]]:
"""
Get Text data from table rows
"""
all_values: List[List[str]] = []
for row in rows:
current_row_values: List[str] = []
for cell in row.cells:
current_row_values.append(
text_anchor_to_text(cell.layout.text_anchor, text)
)
all_values.append(current_row_values)
return all_values
def text_anchor_to_text(text_anchor: documentai.Document.TextAnchor, text: str) -> str:
"""
Document AI identifies table data by their offsets in the entirety of the
document's text. This function converts offsets to a string.
"""
response = ""
# If a text segment spans several lines, it will
# be stored in different text segments.
for segment in text_anchor.text_segments:
start_index = int(segment.start_index)
end_index = int(segment.end_index)
response += text[start_index:end_index]
return response.strip().replace("\n", " ")
PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION" # Format is 'us' or 'eu'
PROCESSOR_ID = "FORM_PARSER_ID" # Create processor before running sample
# The local file in your current working directory
FILE_PATH = "form_with_tables.pdf"
# Refer to https://cloud.google.com/document-ai/docs/file-types
# 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,
)
header_row_values: List[List[str]] = []
body_row_values: List[List[str]] = []
# Input Filename without extension
output_file_prefix = splitext(FILE_PATH)[0]
for page in document.pages:
for index, table in enumerate(page.tables):
header_row_values = get_table_data(table.header_rows, document.text)
body_row_values = get_table_data(table.body_rows, document.text)
# Create a Pandas Dataframe to print the values in tabular format.
df = pd.DataFrame(
data=body_row_values,
columns=pd.MultiIndex.from_arrays(header_row_values),
)
print(f"Page {page.page_number} - Table {index}")
print(df)
# Save each table as a CSV file
output_filename = f"{output_file_prefix}_pg{page.page_number}_tb{index}.csv"
df.to_csv(output_filename, index=False)
Запустите свой код, и вы увидите извлеченный и выведенный в консоль текст.
При использовании нашего примера документа вы должны увидеть следующий результат:
$ python3 table_parsing.py
Page 1 - Table 0
Item Description
0 Item 1 Description 1
1 Item 2 Description 2
2 Item 3 Description 3
Page 1 - Table 1
Form Number: 12345678
0 Form Date: 2020/10/01
1 Name: First Last
2 Address: 123 Fake St
В директории, из которой вы запускаете код, также должны появиться два новых CSV-файла.
$ ls form_with_tables_pg1_tb0.csv form_with_tables_pg1_tb1.csv table_parsing.py
7. Поздравляем!
Поздравляем, вы успешно использовали API Document AI для извлечения данных из рукописной формы. Мы рекомендуем вам поэкспериментировать с другими типами форм.
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этом руководстве:
- В консоли Cloud перейдите на страницу «Управление ресурсами» .
- В списке проектов выберите свой проект и нажмите «Удалить».
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.
Узнать больше
Продолжите изучение Document AI с помощью этих дополнительных практических занятий.
- Специализированные процессоры с поддержкой искусственного интеллекта для обработки документов (Python)
- Управление обработчиками документов с помощью ИИ на Python
- Искусственный интеллект для создания документов: участие человека.
Ресурсы
- Документация по искусственному интеллекту
- Библиотека клиента Document AI Python
- Примеры документов, созданных с помощью ИИ.
Лицензия
Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.