1. Omówienie
Co to jest Document AI?
Document AI to rozwiązanie do rozumienia dokumentów, które wykorzystuje nieuporządkowane dane (np. dokumenty, e-maile, faktury, formularze itp.) i ułatwia ich analizowanie, analizowanie i wykorzystywanie. Zapewnia on strukturę dzięki klasyfikacji treści, wyodrębnianiu encji, wyszukiwaniu zaawansowanym i innym funkcjom.
W tym module dowiesz się, jak korzystać z optycznego rozpoznawania znaków za pomocą interfejsu Document AI API w języku Python.
Użyjemy pliku PDF z klasycznej powieści „Kubuś” autor: A.A. Milne, która niedawno stała się częścią domeny publicznej w Stanach Zjednoczonych. Ten plik został zeskanowany i przetworzony do postaci cyfrowej w Książkach Google.
Czego się nauczysz
- Jak włączyć interfejs Document AI API
- Jak uwierzytelniać żądania do interfejsu API
- Jak zainstalować bibliotekę klienta dla Pythona
- Jak korzystać z interfejsów API przetwarzania online i wsadowego
- Jak analizować tekst z pliku PDF
Czego potrzebujesz
Ankieta
Jak wykorzystasz ten samouczek?
Jak oceniasz swoje doświadczenia z językiem Python?
Jak oceniasz korzystanie z usług Google Cloud?
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.
Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud. (Powyższy identyfikator projektu jest już zajęty i nie sprawdzi się w Twoim przypadku). Musisz podać ten identyfikator później jako PROJECT_ID
.
- Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.
Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” . W tej sekcji znajdziesz informacje na temat wyłączania zasobów, aby nie naliczać opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.
Uruchamianie Cloud Shell
Z Google Cloud możesz korzystać zdalnie z laptopa, ale to ćwiczenie w programowaniu wykorzystuje Google Cloud Shell – środowisko wiersza poleceń działające w Cloud.
Aktywowanie Cloud Shell
- W konsoli Cloud kliknij Aktywuj Cloud Shell .
Jeśli dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:
Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
Cloud Shell zapewnia dostęp do terminala maszyny wirtualnej hostowanej w chmurze. Maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość czynności w ramach tego ćwiczenia z programowania można wykonać za pomocą przeglądarki.
Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.
- Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
Dane wyjściowe polecenia
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
Dane wyjściowe polecenia
[core] project = <PROJECT_ID>
Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Dane wyjściowe polecenia
Updated property [core/project].
3. Włączanie interfejsu Document AI API
Zanim zaczniesz korzystać z Document AI, musisz włączyć interfejs API. Możesz to zrobić za pomocą interfejsu wiersza poleceń gcloud
lub konsoli Cloud.
Użyj interfejsu wiersza poleceń gcloud
- Jeśli nie używasz Cloud Shell, wykonaj czynności opisane w artykule Instalowanie interfejsu wiersza poleceń
gcloud
na komputerze lokalnym. - Interfejsy API można włączyć za pomocą podanych niżej poleceń
gcloud
.
gcloud services enable documentai.googleapis.com storage.googleapis.com
Powinien pojawić się ekran podobny do tego:
Operation "operations/..." finished successfully.
Korzystanie z konsoli Google Cloud
Otwórz konsolę Cloud w przeglądarce.
- Na pasku wyszukiwania u góry konsoli wyszukaj „Document AI API”, a następnie kliknij Włącz, aby używać interfejsu API w projekcie Google Cloud
- Powtórz ten krok w przypadku interfejsu Google Cloud Storage API.
Teraz możesz korzystać z Document AI.
4. Utwórz i przetestuj procesor
Musisz najpierw utworzyć instancję procesora OCR w dokumencie, która przeprowadzi wyodrębnianie. Możesz to zrobić w konsoli Cloud lub za pomocą interfejsu Processor Management API.
Cloud Console
- W konsoli otwórz Omówienie platformy Document AI.
- Kliknij Poznaj procesory i wybierz OCR w dokumentach.
- Nadaj mu nazwę
codelab-ocr
(albo coś innego, co zapamiętasz) i wybierz na liście najbliższy region. - Kliknij Utwórz, aby utworzyć procesor.
- Skopiuj identyfikator podmiotu przetwarzającego. Należy użyć go później w kodzie.
Możesz przetestować procesor w konsoli, przesyłając dokument. Kliknij Prześlij dokument testowy i wybierz dokument do przeanalizowania.
Poniżej znajdziesz plik PDF, który zawiera pierwsze 3 strony naszej powieści.
Dane wyjściowe powinny wyglądać tak:
Biblioteka klienta Pythona
Wykonaj to ćwiczenia w Codelabs, aby dowiedzieć się, jak zarządzać procesorami Document AI za pomocą biblioteki klienta w Pythonie:
Zarządzanie procesorami Document AI za pomocą Pythona – ćwiczenia z programowania
5. Uwierzytelnianie żądań do interfejsu API
Aby wysyłać żądania do interfejsu Document AI API, musisz używać konta usługi. Konto usługi należy do Twojego projektu i jest używane przez bibliotekę klienta Pythona do wysyłania żądań do interfejsu API. Tak jak każde inne konto użytkownika, konto usługi jest reprezentowane przez adres e-mail. W tej sekcji utworzysz konto usługi za pomocą pakietu Cloud SDK, a następnie utworzysz dane logowania, których użyjesz do uwierzytelnienia jako konto usługi.
Najpierw otwórz Cloud Shell i ustaw zmienną środowiskową PROJECT_ID
, której będziesz używać podczas tego ćwiczenia w programowaniu:
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
Następnie utwórz nowe konto usługi z dostępem do interfejsu Document AI API, używając polecenia:
gcloud iam service-accounts create my-docai-sa \
--display-name "my-docai-service-account"
Następnie przyznaj kontu usługi uprawnienia dostępu do Document AI i Cloud Storage w projekcie.
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--role="roles/documentai.admin"
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--role="roles/storage.admin"
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
Następnie utwórz dane logowania, których Twój kod w Pythonie będzie używać do logowania się na Twoje nowe konto usługi. Utwórz te dane logowania i zapisz je w pliku JSON ~/key.json
za pomocą tego polecenia:
gcloud iam service-accounts keys create ~/key.json \
--iam-account my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
Ostatnim krokiem jest utworzenie zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS, która będzie używana przez biblioteka do wyszukiwania Twoich danych logowania. Więcej informacji o tej formie uwierzytelniania znajdziesz w przewodniku. Zmienna środowiskowa powinna zawierać pełną ścieżkę do utworzonego przez Ciebie pliku JSON z danymi logowania za pomocą polecenia:
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"
6. Instalowanie biblioteki klienta
Zainstaluj biblioteki klienta w Pythonie dla Document AI, Cloud Storage i Zestawu narzędzi Document AI:
pip3 install --upgrade google-cloud-documentai
pip3 install --upgrade google-cloud-storage
pip3 install --upgrade google-cloud-documentai-toolbox
Powinien pojawić się ekran podobny do tego:
... Installing collected packages: google-cloud-documentai Successfully installed google-cloud-documentai-2.15.0 . . Installing collected packages: google-cloud-storage Successfully installed google-cloud-storage-2.9.0 . . Installing collected packages: google-cloud-documentai-toolbox Successfully installed google-cloud-documentai-toolbox-0.6.0a0
Możesz teraz korzystać z interfejsu Document AI API.
7. Pobierz przykładowy plik PDF
Udostępniamy przykładowy dokument, który zawiera pierwsze 3 strony powieści.
Możesz pobrać plik PDF, klikając ten link. Następnie prześlij go do instancji Cloud Shell.
Możesz ją też pobrać z naszego publicznego zasobnika Google Cloud Storage za pomocą gsutil
.
gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh_3_Pages.pdf .
8. Złóż wniosek o przetwarzanie danych online
W tym kroku przetworzysz pierwsze 3 strony powieści, używając interfejsu API przetwarzania online (synchronicznego). Ta metoda najlepiej sprawdza się w przypadku mniejszych dokumentów przechowywanych lokalnie. Na pełnej liście procesorów znajdziesz maksymalną liczbę stron i rozmiar pliku dla każdego typu procesora.
Utwórz plik o nazwie online_processing.py
za pomocą edytora Cloud Shell lub edytora tekstu na komputerze lokalnym i użyj tego kodu.
Zastąp YOUR_PROJECT_ID
, YOUR_PROJECT_LOCATION
, YOUR_PROCESSOR_ID
i FILE_PATH
wartościami odpowiednimi dla Twojego środowiska.
online_processing.py
from google.api_core.client_options import ClientOptions
from google.cloud import documentai
PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION" # Format is 'us' or 'eu'
PROCESSOR_ID = "YOUR_PROCESSOR_ID" # Create processor in Cloud Console
# The local file in your current working directory
FILE_PATH = "Winnie_the_Pooh_3_Pages.pdf"
# Refer to https://cloud.google.com/document-ai/docs/file-types
# for supported file types
MIME_TYPE = "application/pdf"
# Instantiates a client
docai_client = documentai.DocumentProcessorServiceClient(
client_options=ClientOptions(api_endpoint=f"{LOCATION}-documentai.googleapis.com")
)
# 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 = docai_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 = docai_client.process_document(request=request)
document_object = result.document
print("Document processing complete.")
print(f"Text: {document_object.text}")
Uruchom kod, który wyodrębni tekst i wydrukuje go w konsoli.
Jeśli korzystasz z przykładowego dokumentu, dane wyjściowe powinny wyglądać tak:
Document processing complete. Text: CHAPTER I IN WHICH We Are Introduced to Winnie-the-Pooh and Some Bees, and the Stories Begin Here is Edward Bear, coming downstairs now, bump, bump, bump, on the back of his head, behind Christopher Robin. It is, as far as he knows, the only way of coming downstairs, but sometimes he feels that there really is another way, if only he could stop bumping for a moment and think of it. And then he feels that perhaps there isn't. Anyhow, here he is at the bottom, and ready to be introduced to you. Winnie-the-Pooh. When I first heard his name, I said, just as you are going to say, "But I thought he was a boy?" "So did I," said Christopher Robin. "Then you can't call him Winnie?" "I don't." "But you said " ... Digitized by Google
9. Wyślij żądanie przetwarzania zbiorczego
Załóżmy teraz, że chcesz przeczytać cały tekst z powieści.
- W ramach przetwarzania online obowiązują ograniczenia dotyczące liczby stron i rozmiaru pliku, które można wysłać. Zezwala też na przesłanie tylko 1 pliku dokumentu na wywołanie interfejsu API.
- Przetwarzanie wsadowe umożliwia przetwarzanie większych/wielu plików przy użyciu metody asynchronicznej.
Na tym etapie przetworzymy całą planetę „Kubuś” za pomocą interfejsu Document AI Batch Processing API i przesłać tekst do zasobnika Google Cloud Storage.
Przetwarzanie wsadowe wykorzystuje długie operacje do zarządzania żądaniami w sposób asynchroniczny, dlatego musimy wysłać żądanie i pobrać dane wyjściowe w inny sposób niż przetwarzanie online. Dane wyjściowe będą jednak w tym samym formacie obiektu Document
niezależnie od tego, czy korzystasz z przetwarzania online czy wsadowego.
Ten krok pokazuje, jak dostarczyć określone dokumenty do przetworzenia przez Document AI. W kolejnym kroku pokazujemy, jak przetworzyć cały katalog dokumentów.
Prześlij plik PDF do Cloud Storage
Obecnie metoda batch_process_documents()
akceptuje pliki z Google Cloud Storage. Więcej informacji o strukturze obiektów znajdziesz w artykule documentai_v1.types.BatchProcessRequest
.
W tym przykładzie możesz odczytać plik bezpośrednio z naszego przykładowego zasobnika.
Możesz też skopiować plik do swojego zasobnika za pomocą narzędzia gsutil
...
gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf gs://YOUR_BUCKET_NAME/
...możesz też pobrać przykładowy plik powieści z linku poniżej i przesłać go do swojego zasobnika.
Będziesz też potrzebować zasobnika GCS do przechowywania danych wyjściowych interfejsu API.
Informacje o tym, jak tworzyć zasobniki na dane, znajdziesz w dokumentacji Cloud Storage.
Korzystanie z metody batch_process_documents()
Utwórz plik o nazwie batch_processing.py
i użyj poniższego kodu.
Zastąp YOUR_PROJECT_ID
, YOUR_PROCESSOR_LOCATION
, YOUR_PROCESSOR_ID
, YOUR_INPUT_URI
i YOUR_OUTPUT_URI
wartościami odpowiednimi dla Twojego środowiska.
Upewnij się, że atrybut YOUR_INPUT_URI
wskazuje bezpośrednio na plik PDF, np. gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf
.
batch_processing.py
"""
Makes a Batch Processing Request to Document AI
"""
import re
from google.api_core.client_options import ClientOptions
from google.api_core.exceptions import InternalServerError
from google.api_core.exceptions import RetryError
from google.cloud import documentai
from google.cloud import storage
# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION" # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID" # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI" # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
"YOUR_PROCESSOR_VERSION_ID" # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)
# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI" # Format: `gs://bucket/directory/file.pdf` or `gs://bucket/directory/`
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber" # Optional. The fields to return in the Document object.
def batch_process_documents(
project_id: str,
location: str,
processor_id: str,
gcs_input_uri: str,
gcs_output_uri: str,
processor_version_id: str = None,
input_mime_type: str = None,
field_mask: str = None,
timeout: int = 400,
):
# You must set the api_endpoint if you use a location other than "us".
opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")
client = documentai.DocumentProcessorServiceClient(client_options=opts)
if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
# Specify specific GCS URIs to process individual documents
gcs_document = documentai.GcsDocument(
gcs_uri=gcs_input_uri, mime_type=input_mime_type
)
# Load GCS Input URI into a List of document files
gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
else:
# Specify a GCS URI Prefix to process an entire directory
gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)
# Cloud Storage URI for the Output Directory
gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
gcs_uri=gcs_output_uri, field_mask=field_mask
)
# Where to write results
output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)
if processor_version_id:
# The full resource name of the processor version, e.g.:
# projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
name = client.processor_version_path(
project_id, location, processor_id, processor_version_id
)
else:
# The full resource name of the processor, e.g.:
# projects/{project_id}/locations/{location}/processors/{processor_id}
name = client.processor_path(project_id, location, processor_id)
request = documentai.BatchProcessRequest(
name=name,
input_documents=input_config,
document_output_config=output_config,
)
# BatchProcess returns a Long Running Operation (LRO)
operation = client.batch_process_documents(request)
# Continually polls the operation until it is complete.
# This could take some time for larger files
# Format: projects/{project_id}/locations/{location}/operations/{operation_id}
try:
print(f"Waiting for operation {operation.operation.name} to complete...")
operation.result(timeout=timeout)
# Catch exception when operation doesn"t finish before timeout
except (RetryError, InternalServerError) as e:
print(e.message)
# NOTE: Can also use callbacks for asynchronous processing
#
# def my_callback(future):
# result = future.result()
#
# operation.add_done_callback(my_callback)
# Once the operation is complete,
# get output document information from operation metadata
metadata = documentai.BatchProcessMetadata(operation.metadata)
if metadata.state != documentai.BatchProcessMetadata.State.SUCCEEDED:
raise ValueError(f"Batch Process Failed: {metadata.state_message}")
storage_client = storage.Client()
print("Output files:")
# One process per Input Document
for process in list(metadata.individual_process_statuses):
# output_gcs_destination format: gs://BUCKET/PREFIX/OPERATION_NUMBER/INPUT_FILE_NUMBER/
# The Cloud Storage API requires the bucket name and URI prefix separately
matches = re.match(r"gs://(.*?)/(.*)", process.output_gcs_destination)
if not matches:
print(
"Could not parse output GCS destination:",
process.output_gcs_destination,
)
continue
output_bucket, output_prefix = matches.groups()
# Get List of Document Objects from the Output Bucket
output_blobs = storage_client.list_blobs(output_bucket, prefix=output_prefix)
# Document AI may output multiple JSON files per source file
for blob in output_blobs:
# Document AI should only output JSON files to GCS
if blob.content_type != "application/json":
print(
f"Skipping non-supported file: {blob.name} - Mimetype: {blob.content_type}"
)
continue
# Download JSON File as bytes object and convert to Document Object
print(f"Fetching {blob.name}")
document = documentai.Document.from_json(
blob.download_as_bytes(), ignore_unknown_fields=True
)
# For a full list of Document object attributes, please reference this page:
# https://cloud.google.com/python/docs/reference/documentai/latest/google.cloud.documentai_v1.types.Document
# Read the text recognition output from the processor
print("The document contains the following text:")
print(document.text)
if __name__ == "__main__":
batch_process_documents(
project_id=project_id,
location=location,
processor_id=processor_id,
gcs_input_uri=gcs_input_uri,
gcs_output_uri=gcs_output_uri,
input_mime_type=input_mime_type,
field_mask=field_mask,
)
Uruchom kod, a cały tekst powieści powinien zostać wyodrębniony i wydrukowany w konsoli.
Może to zająć trochę czasu, ponieważ plik jest znacznie większy niż w poprzednim przykładzie. (Ach, irytację...)
Jednak dzięki interfejsowi Batch Processing API otrzymasz identyfikator operacji, którego można użyć do pobrania danych wyjściowych z GCS po zakończeniu zadania.
Dane wyjściowe powinny wyglądać mniej więcej tak:
Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete... Document processing complete. Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-0.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-1.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-10.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-11.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-12.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-13.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-14.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-15.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-16.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-17.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-18.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-2.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-3.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-4.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-5.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-6.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-7.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-8.json Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-9.json This is a reproduction of a library book that was digitized by Google as part of an ongoing effort to preserve the information in books and make it universally accessible. TM Google books https://books.google.com ..... He nodded and went out ... and in a moment I heard Winnie-the-Pooh -bump, bump, bump-go-ing up the stairs behind him. Digitized by Google
10. Tworzenie żądania przetwarzania wsadowego dla katalogu
Czasami może być potrzebne przetwarzanie całego katalogu dokumentów bez wyświetlania każdego dokumentu oddzielnie. Metoda batch_process_documents()
obsługuje wprowadzanie listy konkretnych dokumentów lub ścieżki katalogu.
W tym kroku pokazujemy, jak przetworzyć pełny katalog plików dokumentów. Większość kodu działa tak samo jak w poprzednim kroku, jedyną różnicą jest identyfikator URI GCS wysyłany za pomocą BatchProcessRequest
.
W naszym przykładowym zasobniku znajduje się katalog zawierający wiele stron powieści w osobnych plikach.
gs://cloud-samples-data/documentai/codelabs/ocr/multi-document/
Możesz odczytać pliki bezpośrednio lub skopiować je do własnego zasobnika Cloud Storage.
Uruchom ponownie kod z poprzedniego kroku, zastępując YOUR_INPUT_URI
katalogiem w Cloud Storage.
Uruchom kod – powinien być widoczny wyodrębniony tekst ze wszystkich plików dokumentów w katalogu Cloud Storage.
Dane wyjściowe powinny wyglądać mniej więcej tak:
Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete... Document processing complete. Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh_Page_0-0.json Fetching docai-output/OPERATION_NUMBER/1/Winnie_the_Pooh_Page_1-0.json Fetching docai-output/OPERATION_NUMBER/2/Winnie_the_Pooh_Page_10-0.json Fetching docai-output/OPERATION_NUMBER/3/Winnie_the_Pooh_Page_12-0.json Fetching docai-output/OPERATION_NUMBER/4/Winnie_the_Pooh_Page_16-0.json Fetching docai-output/OPERATION_NUMBER/5/Winnie_the_Pooh_Page_7-0.json Introduction (I₂ F YOU happen to have read another book about Christopher Robin, you may remember th CHAPTER I IN WHICH We Are Introduced to Winnie-the-Pooh and Some Bees, and the Stories Begin HERE is 10 WINNIE-THE-POOH "I wonder if you've got such a thing as a balloon about you?" "A balloon?" "Yes, 12 WINNIE-THE-POOH and you took your gun with you, just in case, as you always did, and Winnie-the-P 16 WINNIE-THE-POOH this song, and one bee sat down on the nose of the cloud for a moment, and then g WE ARE INTRODUCED 7 "Oh, help!" said Pooh, as he dropped ten feet on the branch below him. "If only
11. Przetwarzanie odpowiedzi wsadowej za pomocą Zestawu narzędzi Document AI
Ze względu na integrację z Cloud Storage przetwarzanie wsadowe wymaga wykonania kilku czynności. Dane wyjściowe funkcji Document
mogą być również „podzielone na fragmenty” na wiele plików .json
w zależności od rozmiaru dokumentu wejściowego.
Pakiet Document AI Toolbox w Pythonie został stworzony, aby uprościć przetwarzanie i inne typowe zadania w Document AI. Ta biblioteka ma być uzupełnieniem biblioteki klienta Document AI, a nie jej zamiennikiem. Pełną specyfikację znajdziesz w dokumentacji referencyjnej.
Ten krok pokazuje, jak utworzyć żądanie przetwarzania wsadowego i pobrać dane wyjściowe za pomocą Zestawu narzędzi Document AI.
batch_processing_toolbox.py
"""
Makes a Batch Processing Request to Document AI using Document AI Toolbox
"""
from google.api_core.client_options import ClientOptions
from google.cloud import documentai
from google.cloud import documentai_toolbox
# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION" # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID" # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI" # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
"YOUR_PROCESSOR_VERSION_ID" # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)
# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI" # Format: `gs://bucket/directory/file.pdf`` or `gs://bucket/directory/``
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber" # Optional. The fields to return in the Document object.
def batch_process_toolbox(
project_id: str,
location: str,
processor_id: str,
gcs_input_uri: str,
gcs_output_uri: str,
processor_version_id: str = None,
input_mime_type: str = None,
field_mask: str = None,
):
# You must set the api_endpoint if you use a location other than "us".
opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")
client = documentai.DocumentProcessorServiceClient(client_options=opts)
if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
# Specify specific GCS URIs to process individual documents
gcs_document = documentai.GcsDocument(
gcs_uri=gcs_input_uri, mime_type=input_mime_type
)
# Load GCS Input URI into a List of document files
gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
else:
# Specify a GCS URI Prefix to process an entire directory
gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)
# Cloud Storage URI for the Output Directory
gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
gcs_uri=gcs_output_uri, field_mask=field_mask
)
# Where to write results
output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)
if processor_version_id:
# The full resource name of the processor version, e.g.:
# projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
name = client.processor_version_path(
project_id, location, processor_id, processor_version_id
)
else:
# The full resource name of the processor, e.g.:
# projects/{project_id}/locations/{location}/processors/{processor_id}
name = client.processor_path(project_id, location, processor_id)
request = documentai.BatchProcessRequest(
name=name,
input_documents=input_config,
document_output_config=output_config,
)
# BatchProcess returns a Long Running Operation (LRO)
operation = client.batch_process_documents(request)
# Operation Name Format: projects/{project_id}/locations/{location}/operations/{operation_id}
documents = documentai_toolbox.document.Document.from_batch_process_operation(
location=location, operation_name=operation.operation.name
)
for document in documents:
# Read the text recognition output from the processor
print("The document contains the following text:")
# Truncated at 100 characters for brevity
print(document.text[:100])
if __name__ == "__main__":
batch_process_toolbox(
project_id=project_id,
location=location,
processor_id=processor_id,
gcs_input_uri=gcs_input_uri,
gcs_output_uri=gcs_output_uri,
input_mime_type=input_mime_type,
field_mask=field_mask,
)
12. Gratulacje
Udało Ci się wykorzystać Document AI do wyodrębniania tekstu z powieści przy użyciu przetwarzania online, przetwarzania wsadowego i zestawu narzędzi Document AI.
Zachęcamy do eksperymentowania z innymi dokumentami i zapoznania się z innymi platformami przetwarzania danych dostępnymi na platformie.
Czyszczenie danych
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.
- Analiza formularzy przy użyciu Document AI (Python)
- Specjalne procesory z Document AI (Python)
- Zarządzanie procesorami Document AI w Pythonie
- Document AI: człowiek na zmianę
Materiały
- Przyszłość dokumentów – playlista w YouTube
- Dokumentacja Document AI
- Biblioteka klienta Document AI w Pythonie
- Repozytorium próbek Document AI
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.