1. Einführung
In diesem Codelab erfahren Sie, wie Sie mit dem Document AI-Formularparser ein handschriftliches Formular mit Python parsen.
Wir verwenden als Beispiel ein einfaches medizinisches Aufnahmeformular, aber dieses Verfahren funktioniert mit jeder von DocAI unterstützten allgemeinen Form.
Voraussetzungen
Dieses Codelab baut auf Inhalten aus anderen Document AI-Codelabs auf.
Bevor Sie fortfahren, sollten Sie die folgenden Codelabs absolvieren.
Aufgaben in diesem Lab
- Hier erfahren Sie, wie Sie Daten mit dem Document AI-Formularparser aus einem gescannten Formular parsen und extrahieren.
Voraussetzungen
Umfrage
Wie möchten Sie diese Anleitung nutzen?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrung mit Python bewerten?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud-Diensten bewerten?
<ph type="x-smartling-placeholder">2. Einrichtung und Anforderungen
In diesem Codelab wird davon ausgegangen, dass Sie die im Document AI-OCR-Codelab aufgeführten Document AI-Einrichtungsschritte abgeschlossen haben.
Führen Sie die folgenden Schritte aus, bevor Sie fortfahren:
Außerdem müssen Sie Pandas installieren, eine Open-Source-Datenanalysebibliothek für Python.
pip3 install --upgrade pandas
3. Formularparser-Prozessor erstellen
Sie müssen zuerst eine Formularparser-Prozessorinstanz zur Verwendung in Document AI Platform für diese Anleitung erstellen.
- Rufen Sie in der Console die Document AI Platform – Übersicht auf.
- Klicken Sie auf Create Processor (Prozessor erstellen) und wählen Sie Form Parser (Formularparser) aus.
- Geben Sie einen Prozessornamen an und wählen Sie Ihre Region aus der Liste aus.
- Klicken Sie auf Erstellen, um den Prozessor zu erstellen.
- Kopieren Sie Ihre Prozessor-ID. Sie müssen sie später in Ihrem Code verwenden.
Prozessor in der Cloud Console testen
Sie können den Prozessor in der Konsole testen, indem Sie ein Dokument hochladen. Klicken Sie auf Dokument hochladen und wählen Sie ein Formular zum Parsen aus. Sie können dieses Beispielformular herunterladen und verwenden, falls Sie keins haben.
Die Ausgabe sollte so aussehen:
4. Beispielformular herunterladen
Wir haben ein Beispieldokument, das ein einfaches medizinisches Aufnahmeformular enthält.
Sie können die PDF-Datei über den folgenden Link herunterladen. Laden Sie sie dann in die Cloud Shell-Instanz hoch.
Alternativ können Sie sie mithilfe von gsutil
aus unserem öffentlichen Google Cloud Storage-Bucket herunterladen.
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/intake-form.pdf .
Prüfen Sie mit dem folgenden Befehl, ob die Datei in Cloud Shell heruntergeladen wurde:
ls -ltr intake-form.pdf
5. Schlüssel/Wert-Paare in Form von Formularen extrahieren
In diesem Schritt verwenden Sie die Online-Verarbeitungs-API, um den zuvor erstellten Formularparserprozessor aufzurufen. Anschließend extrahieren Sie die im Dokument gefundenen Schlüssel/Wert-Paare.
Bei der Onlineverarbeitung wird ein einzelnes Dokument gesendet und auf die Antwort gewartet. Sie können die Batchverarbeitung auch verwenden, wenn Sie mehrere Dateien senden möchten oder wenn die Dateigröße die maximal zulässige Anzahl an Seiten für die Onlineverarbeitung überschreitet. Weitere Informationen hierzu finden Sie im OCR-Codelab.
Der Code zum Senden einer Prozessanfrage ist für jeden Prozessortyp mit Ausnahme der Prozessor-ID identisch.
Das Document-Antwortobjekt enthält eine Liste der Seiten aus dem Eingabedokument.
Jedes page
-Objekt enthält eine Liste von Formularfeldern und deren Positionen im Text.
Der folgende Code durchläuft jede Seite und extrahiert jeden Schlüssel, Wert und Konfidenzwert. Dabei handelt es sich um strukturierte Daten, die leichter in Datenbanken gespeichert oder in anderen Anwendungen verwendet werden können.
Erstellen Sie eine Datei mit dem Namen form_parser.py
und verwenden Sie den Code unten.
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)
Führen Sie jetzt Ihren Code aus. Der Text sollte extrahiert und in Ihrer Konsole ausgegeben werden.
Sie sollten die folgende Ausgabe sehen, wenn Sie unser Beispieldokument verwenden:
$ 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. Tabellen parsen
Mit dem Formularparser können auch Daten aus Tabellen in Dokumenten extrahiert werden. In diesem Schritt laden wir ein neues Beispieldokument herunter und extrahieren Daten aus der Tabelle. Da die Daten in Pandas geladen werden, können sie mit einem einzigen Methodenaufruf in eine CSV-Datei und viele andere Formate ausgegeben werden.
Beispielformular mit Tabellen herunterladen
Wir haben ein Beispieldokument, das ein Beispielformular und eine Tabelle enthält.
Sie können die PDF-Datei über den folgenden Link herunterladen. Laden Sie sie dann in die Cloud Shell-Instanz hoch.
Alternativ können Sie sie mithilfe von gsutil
aus unserem öffentlichen Google Cloud Storage-Bucket herunterladen.
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/form_with_tables.pdf .
Prüfen Sie mit dem folgenden Befehl, ob die Datei in Cloud Shell heruntergeladen wurde:
ls -ltr form_with_tables.pdf
Tabellendaten extrahieren
Die Verarbeitungsanfrage für Tabellendaten ist dieselbe wie beim Extrahieren von Schlüssel/Wert-Paaren. Der Unterschied besteht darin, aus welchen Feldern wir die Daten in der Antwort extrahieren. Tabellendaten werden im Feld pages[].tables[]
gespeichert.
In diesem Beispiel werden Informationen über aus den Kopfzeilen und Textzeilen der Tabelle für jede Tabelle und Seite extrahiert, die Tabelle dann ausgedruckt und als CSV-Datei gespeichert.
Erstellen Sie eine Datei mit dem Namen table_parsing.py
und verwenden Sie den Code unten.
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)
Führen Sie jetzt Ihren Code aus. Der Text sollte extrahiert und in Ihrer Konsole ausgegeben werden.
Sie sollten die folgende Ausgabe sehen, wenn Sie unser Beispieldokument verwenden:
$ 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
In dem Verzeichnis, in dem Sie den Code ausführen, sollten sich außerdem zwei neue CSV-Dateien befinden.
$ ls form_with_tables_pg1_tb0.csv form_with_tables_pg1_tb1.csv table_parsing.py
7. Glückwunsch
Herzlichen Glückwunsch! Sie haben mithilfe der Document AI API erfolgreich Daten aus einem handschriftlichen Formular extrahiert. Wir empfehlen Ihnen, mit anderen Formulardokumenten zu experimentieren.
Bereinigen
So vermeiden Sie, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:
- Rufen Sie in der Cloud Console die Seite Ressourcen verwalten auf.
- Wählen Sie Ihr Projekt in der Projektliste aus und klicken Sie auf „Löschen“.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie dann auf „Beenden“, um das Projekt zu löschen.
Weitere Informationen
In diesen Codelabs erfahren Sie mehr über Document AI.
- Spezialisierte Prozessoren mit Document AI (Python)
- Document AI-Prozessoren mit Python verwalten
- Document AI: Human in the Loop
Ressourcen
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.