Wyspecjalizowane procesory z Document AI (Python)

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:

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

  • Projekt Google Cloud
  • przeglądarkę, np. Chrome lub Firefox;
  • Wiedza na temat języka Python 3

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:

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.

  1. W konsoli przejdź do omówienia Document AI Platform.
  2. Kliknij Utwórz procesor, przewiń w dół do sekcji Specjalistyczne i wybierz Podział dokumentów zaopatrzenia.
  3. Nadaj mu nazwę „codelab-procurement-splitter”. (albo z czymś, co zapamiętasz) i wybierz na liście najbliższy region.
  4. Kliknij Utwórz, aby utworzyć procesor.
  5. Skopiuj identyfikator procesora. Będzie trzeba użyć go później w kodzie.
  6. 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ć.

google_invoice.png

Dane wyjściowe powinny wyglądać tak:

InvoiceParser.png

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)
  • 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ść

Parser amerykańskiego prawa jazdy

Pożyczki

Dzielący pożyczki Klasyfikator

Pożyczki

Parser W9

Umowy

Parser kontraktów

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.

Materiały

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.