1. Giriş
Bu codelab'de, el yazısıyla yazılmış bir formu Python ile ayrıştırmak için Document AI Form Ayrıştırıcı'yı nasıl kullanacağınızı öğreneceksiniz.
Örnek olarak basit bir tıbbi giriş formu kullanacağız ancak bu prosedür, DocAI tarafından desteklenen tüm genelleştirilmiş formlarda kullanılabilir.
Ön koşullar
Bu codelab'de, diğer Document AI Codelab'lerinde sunulan içerikler temel alınır.
Devam etmeden önce aşağıdaki Codelab'leri tamamlamanız önerilir.
Neler öğreneceksiniz?
- Document AI Form Ayrıştırıcı'yı kullanarak taranmış bir formdan verileri ayrıştırma ve ayıklama.
Gerekenler
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Bu codelab'de, Document AI OCR Codelab'de listelenen Document AI kurulum adımlarını tamamladığınız varsayılır.
Devam etmeden önce lütfen aşağıdaki adımları tamamlayın:
Python için açık kaynaklı bir veri analizi kitaplığı olan Pandas'ı da yüklemeniz gerekir.
pip3 install --upgrade pandas
3. Form Ayrıştırıcı işlemcisi oluşturma
Bu eğitim için önce Document AI Platform'da kullanılacak bir Form Ayrıştırıcı işlemci örneği oluşturmanız gerekir.
- Konsolda Document AI Platformuna Genel Bakış'a gidin
- Create Processor'ı (İşlemci Oluştur) tıklayın ve Form Ayrıştırıcı'yı seçin.
- Bir işlemci adı belirtin ve listeden bölgenizi seçin.
- İşleyicinizi oluşturmak için Oluştur'u tıklayın.
- İşlemci kimliğinizi kopyalayın. Bunu daha sonra kodunuzda kullanmanız gerekir.
Cloud Console'da işlemciyi test etme
Bir belge yükleyerek konsolda işlemcinizi test edebilirsiniz. Doküman Yükle'yi tıklayın ve ayrıştırılacak bir form seçin. Kullanabileceğiniz örnek formu yoksa indirip kullanabilirsiniz.
Çıkışınız şu şekilde görünmelidir:
4. Örnek Formu İndirin
Basit bir tıbbi giriş formu içeren örnek bir dokümanımız var.
PDF dosyasını aşağıdaki bağlantıyı kullanarak indirebilirsiniz. Daha sonra bunu Cloud Shell örneğine yükleyin.
Alternatif olarak, gsutil
kullanarak herkese açık Google Cloud Storage paketimizden indirebilirsiniz.
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/intake-form.pdf .
Aşağıdaki komutu kullanarak dosyanın Cloud Shell'inize indirildiğini onaylayın:
ls -ltr intake-form.pdf
5. Form Anahtar/Değer Çiftlerini Ayıklama
Bu adımda, daha önce oluşturduğunuz form ayrıştırıcı işlemcisini çağırmak için çevrimiçi işleme API'sini kullanacaksınız. Ardından, dokümanda bulunan anahtar/değer çiftlerini çıkaracaksınız.
Online işleme, tek bir doküman gönderip yanıt beklemek için yapılır. Birden fazla dosya göndermek isterseniz veya dosya boyutu online işleme maksimum sayfa sayısını aşarsa da toplu işlemeyi kullanabilirsiniz. Bunu nasıl yapacağınızı OCR Codelab'de inceleyebilirsiniz.
İşlem isteğinde bulunma kodu, İşleyen Kimliği dışında her işlemci türü için aynıdır.
Document yanıt nesnesi, giriş belgesindeki sayfaların listesini içerir.
Her page
nesnesi, form alanlarının ve metindeki konumlarının bir listesini içerir.
Aşağıdaki kod her sayfada yineleme yaparak her bir anahtar, değer ve güven puanını ayıklar. Bunlar, veritabanlarında daha kolay depolanabilen veya diğer uygulamalarda kullanılabilen yapılandırılmış verilerdir.
form_parser.py
adında bir dosya oluşturun ve aşağıdaki kodu kullanın.
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)
Kodunuzu şimdi çalıştırın. Metin çıkarılıp konsolunuzda yazdırılır.
Örnek dokümanımızı kullandığınızda aşağıdaki çıkışı görürsünüz:
$ 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. Tabloları Ayrıştırma
Form Ayrıştırıcı, dokümanların içindeki tablolardan da veri çıkarabilir. Bu adımda yeni bir örnek belge indireceğiz ve tablodan veri çıkaracağız. Verileri Pandas'a yüklediğimizden, bu veriler tek bir yöntem çağrısıyla CSV dosyası ve başka birçok biçimde çıkarılabilir.
Örnek Formu Tablolarla İndirme
Örnek bir form ve tablo içeren örnek bir dokümanımız var.
PDF dosyasını aşağıdaki bağlantıyı kullanarak indirebilirsiniz. Daha sonra bunu Cloud Shell örneğine yükleyin.
Alternatif olarak, gsutil
kullanarak herkese açık Google Cloud Storage paketimizden indirebilirsiniz.
gsutil cp gs://cloud-samples-data/documentai/codelabs/form-parser/form_with_tables.pdf .
Aşağıdaki komutu kullanarak dosyanın Cloud Shell'inize indirildiğini onaylayın:
ls -ltr form_with_tables.pdf
Tablo Verilerini Çıkarın
Tablo verilerine yönelik işleme isteği, anahtar/değer çiftlerini ayıklama işlemine ilişkin istekle tam olarak aynıdır. Aradaki fark, yanıtta verileri çıkardığımız alanlardır. Tablo verileri pages[].tables[]
alanında depolanır.
Bu örnekte, her bir tablo ve sayfa için tablo başlığı satırlarından ve gövde satırlarından bilgi ayıklanır, ardından tabloyu yazdırır ve tabloyu CSV dosyası olarak kaydeder.
table_parsing.py
adında bir dosya oluşturun ve aşağıdaki kodu kullanın.
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)
Kodunuzu şimdi çalıştırın. Metin çıkarılıp konsolunuzda yazdırılır.
Örnek dokümanımızı kullandığınızda aşağıdaki çıkışı görürsünüz:
$ 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
Ayrıca, kodu çalıştırdığınız dizinde iki yeni CSV dosyanız olmalıdır.
$ ls form_with_tables_pg1_tb0.csv form_with_tables_pg1_tb1.csv table_parsing.py
7. Tebrikler
Tebrikler, Document AI API'yi başarıyla kullanarak elle yazılmış bir formdan veri ayıkladınız. Diğer form belgeleriyle denemeler yapmanızı öneririz.
Temizleme
Bu eğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini önlemek amacıyla:
- Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinden projenizi seçin ve ardından Sil'i tıklayın.
- İletişim kutusuna proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
Daha Fazla Bilgi
Takip eden Codelab uygulamaları ile Document AI hakkında bilgi edinmeye devam edin.
- Document AI (Python) kullanan Özel İşlemciler
- Document AI işlemcilerini Python ile yönetme
- Document AI: Döngüdeki İnsan
Kaynaklar
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.