1. Wprowadzenie
Z tego ćwiczenia w Codelabs dowiesz się, jak używać specjalistycznych procesorów Document AI do klasyfikowania i analizowania specjalistycznych dokumentów w Pythonie. Do klasyfikacji i podziału wykorzystamy przykładowy plik PDF zawierający faktury, paragony i wyciągi za media. Następnie do analizy i wyodrębnienia encji użyjemy faktury jako przykładu.
Ta procedura i przykładowy kod będą działać z każdym specjalnym dokumentem obsługiwanym przez Document AI.
Wymagania wstępne
To ćwiczenie w Codelabs opiera się na materiałach prezentowanych w innych ćwiczeniach z programowania Document AI.
Przed kontynuowaniem zalecamy ukończenie tych ćwiczeń z programowania:
- Optyczne rozpoznawanie znaków (OCR) w Document AI i Python
- Analiza formularzy przy użyciu Document AI (Python)
Czego się nauczysz
- Jak klasyfikować i identyfikować punkty podziału w wyspecjalizowanych dokumentach.
- Jak wyodrębniać zwizualizowane encje przy użyciu specjalistycznych procesorów.
Czego potrzebujesz
2. Przygotowanie
W tym ćwiczeniu w programowaniu zakładamy, że masz już za sobą kroki konfiguracji Document AI wymienione w podstawowych ćwiczeniach z programowania.
Zanim przejdziesz dalej, wykonaj te czynności:
- Uruchamianie Cloud Shell
- Włączanie interfejsu Document AI API
- Instalowanie biblioteki klienta Pythona
Musisz też zainstalować Pandas, popularną bibliotekę analizy danych dla Pythona.
pip3 install --upgrade pandas
3. Utwórz specjalne procesory
Najpierw musisz utworzyć instancje procesorów, których będziesz używać w tym samouczku.
- W konsoli przejdź do omówienia Document AI Platform.
- Kliknij Utwórz procesor, przewiń w dół do sekcji Specjalistyczne i wybierz Podział dokumentów zaopatrzenia.
- Nadaj mu nazwę „codelab-procurement-splitter”. (albo z czymś, co zapamiętasz) i wybierz na liście najbliższy region.
- Kliknij Utwórz, aby utworzyć procesor.
- Skopiuj identyfikator procesora. Będzie trzeba użyć go później w kodzie.
- Powtórz kroki 2–6 przy użyciu parsera faktur (możesz go nazwać „codelab-invoice-parser”).
Przetestuj procesor w konsoli
Możesz przetestować parser faktur w konsoli, przesyłając dokument.
Kliknij Prześlij dokument i wybierz fakturę do przeanalizowania. Jeśli nie masz dostępu do tej przykładowej faktury, możesz ją pobrać i wykorzystać.
Dane wyjściowe powinny wyglądać tak:
4. Pobierz przykładowe dokumenty
Mamy kilka przykładowych dokumentów do wykorzystania w tym module.
Pliki PDF możesz pobrać, korzystając z tych linków. Następnie prześlij je do instancji Cloud Shell.
Możesz też pobrać je z naszego publicznego zasobnika Cloud Storage za pomocą 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. Klasyfikuj i podziel dokumenty
W tym kroku użyjesz interfejsu API przetwarzania online, aby sklasyfikować i wykryć logiczne punkty podziału w przypadku dokumentu wielostronicowego.
Interfejsu API przetwarzania wsadowego możesz też użyć, jeśli chcesz wysyłać wiele plików lub jeśli rozmiar pliku przekracza maksymalną liczbę stron przetwarzania online. Więcej informacji o tym, jak to zrobić, znajdziesz w ćwiczeniach z programowania OCR w Document AI.
Kod służący do tworzenia żądania do interfejsu API jest taki sam w przypadku ogólnego procesora oprócz identyfikatora procesora.
Podział/klasyfikator zaopatrzenia
Utwórz plik o nazwie classification.py
i użyj poniższego kodu.
Zastąp PROCUREMENT_SPLITTER_ID
identyfikatorem utworzonego wcześniej podmiotu przetwarzającego rozdzielanie zamówień. Zastąp YOUR_PROJECT_ID
i YOUR_PROJECT_LOCATION
odpowiednio identyfikatorem projektu Cloud i lokalizacją procesora.
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)
Dane wyjściowe powinny wyglądać mniej więcej tak:
$ 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]
Zwróć uwagę na to, że podział/klasyfikator zaopatrzenia prawidłowo zidentyfikował typy dokumentów na stronach 0–1 i 3–4.
Strona 2 zawiera ogólny formularz przyjmowania leków, więc klasyfikator poprawnie zidentyfikował go jako other
.
6. Wyodrębnianie encji
Teraz możesz wyodrębnić z plików schematowane encje, w tym wskaźniki ufności, właściwości i znormalizowane wartości.
Kod żądania do interfejsu API jest taki sam jak w poprzednim kroku i można go wykonać przy użyciu żądań online lub zbiorczych.
Będziemy uzyskiwać dostęp do następujących informacji od podmiotów:
- Typ podmiotu
- (np.
invoice_date
,receiver_name
,total_amount
)
- (np.
- Wartości nieprzetworzone
- Wartości danych zgodne z oryginalnym plikiem dokumentu.
- Znormalizowane wartości
- Wartości danych w znormalizowanym i standardowym formacie, jeśli ma to zastosowanie.
- Może też obejmować wzbogacanie informacji z Enterprise Knowledge Graph.
- Wartości ufności
- Jak „na pewno” model polega na tym, że wartości są dokładne.
Niektóre typy elementów, takie jak line_item
, mogą też zawierać właściwości, które są elementami zagnieżdżonymi, np. line_item/unit_price
i line_item/description
.
W tym przykładzie zagnieżdżona struktura została spłaszczona, aby ułatwić przeglądanie.
Analizujący faktury
Utwórz plik o nazwie extraction.py
i użyj poniższego kodu.
Zastąp INVOICE_PARSER_ID
identyfikatorem utworzonego wcześniej procesora parsera faktur i użyj pliku 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)
Dane wyjściowe powinny wyglądać mniej więcej tak:
$ 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. Opcjonalnie: wypróbuj inne specjalistyczne procesory
Udało Ci się użyć Document AI for Procurement do klasyfikowania dokumentów i analizowania faktury. Document AI obsługuje też inne specjalistyczne rozwiązania wymienione tutaj:
Możesz zastosować tę samą procedurę i ten sam kod do obsługi wyspecjalizowanych procesorów.
Jeśli chcesz wypróbować inne wyspecjalizowane rozwiązania, możesz uruchomić moduł ponownie z innymi typami procesorów i specjalnymi przykładowymi dokumentami.
Przykładowe dokumenty
Poniżej znajdziesz przykładowe dokumenty, które możesz wykorzystać do wypróbowania innych specjalistycznych procesorów.
Rozwiązanie | Typ procesora | Dokument |
Tożsamość | ||
Pożyczki | ||
Pożyczki | ||
Umowy |
Inne przykładowe dokumenty i dane wyjściowe procesora znajdziesz w dokumentacji.
8. Gratulacje
Gratulujemy. Udało Ci się już korzystać z Document AI do klasyfikowania i wyodrębniania danych z wyspecjalizowanych dokumentów. Zachęcamy do eksperymentowania z innymi specjalistycznymi typami dokumentów.
Czyszczenie
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku:
- W konsoli Cloud otwórz stronę Zarządzanie zasobami.
- Na liście projektów wybierz swój projekt i kliknij Usuń.
- W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
Więcej informacji
Dowiedz się więcej o Document AI dzięki tym dodatkowym ćwiczeniom z programowania.
- Zarządzanie procesorami Document AI w Pythonie
- Document AI: człowiek na zmianę
- Document AI Workbench: trenowanie wyższego poziomu
- Document AI Workbench: procesory niestandardowe
Materiały
- Przyszłość dokumentów – playlista w YouTube
- Dokumentacja Document AI
- Biblioteka klienta Document AI w Pythonie
- Przykłady Document AI
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.