Wyspecjalizowane procesory z Document AI (Python)

Wyspecjalizowane procesory z Document AI (Python)

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: kwi 3, 2023
account_circleAutorzy: Holt Skinner

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.

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.