استخراج داده ها از اسناد بدون ساختار


نویسنده (ها): فلیکس پاپ

در ابتدا منتشر شده در به سمت هوش مصنوعیبشر

تصویر ایجاد شده توسط نویسنده با استفاده از GPT-image-1

مقدمه

در گذشته ، استخراج اطلاعات خاص از اسناد یا تصاویر با استفاده از روشهای سنتی می توانست به سرعت دست و پا گیر و ناامید کننده شود ، به خصوص هنگامی که نتایج نهایی از آنچه شما قصد داشتید دور است. دلایل این امر می تواند متنوع باشد ، از چیدمان های بیش از حد پیچیده اسناد گرفته تا پرونده های فرمت شده نادرست یا بهمن عناصر بصری ، که ماشین ها برای تفسیر تلاش می کنند.

با این حال ، مدل های زبان با قابلیت دید (VLMS) به نجات رسیده اند. طی ماهها و سالهای گذشته ، این مدل ها قابلیت های همیشه رشد را به دست آورده اند ، از توضیحات تصویر خشن گرفته تا استخراج متن دقیق. نکته قابل توجه ، استخراج اطلاعات متنی پیچیده از تصاویر ، پیشرفت حیرت انگیزی داشته است. این امر باعث می شود تا دانش سریع دانش از انواع متنوع اسناد بدون سیستم های شکننده و مبتنی بر قانون که به محض تغییر ساختار اسناد-و بدون آموزش تخصصی زمان ، داده و هزینه های تخصصی مدل های سفارشی-شکسته می شوند.

با این حال ، یک نقص وجود دارد: VLMS ، مانند همتایان متن آنها ، تمایل به تولید خروجی کلامی در اطراف اطلاعاتی که در واقع می خواهید تولید می کنند. عباراتی مانند “البته ، در اینجا اطلاعاتی که شما درخواست کرده اید” است یا “این اطلاعات استخراج شده در مورد XYZ است” معمولاً محتوای اساسی را احاطه کرده است.

شما می توانید از عبارات منظم به همراه مهندسی سریع پیشرفته برای محدود کردن VLM برای خروجی فقط اطلاعات درخواست شده استفاده کنید. با این حال ، ساختن regex سریع و تطبیق مناسب برای یک کار معین دشوار است و نیاز به آزمایش و خطای زیادی دارد. در این پست وبلاگ ، من می خواهم یک رویکرد ساده تر را معرفی کنم: ترکیب قابلیت های غنی VLLMS با اعتبار دقیق ارائه شده توسط کلاس های Pydantic برای استخراج دقیقاً اطلاعات مورد نظر برای خط لوله پردازش اسناد.

توضیحات مربوط به ارسال شده

مثال در این پست وبلاگ وضعیتی را توصیف می کند که همه کار متقاضی احتمالاً بارها تجربه کرده است. من از آن مطمئن هستم
بعد از اینکه CV خود را با دقت و کاملاً ایجاد کرده اید ، در مورد هر کلمه و حتی هر حرف فکر می کنید ، پرونده را در یک درگاه شغلی بارگذاری می کنید. اما پس از بارگذاری موفقیت آمیز پرونده ، از جمله تمام اطلاعات درخواستی ، از شما خواسته می شود با کپی کردن و چسباندن اطلاعات از CV خود در قسمتهای صحیح ، همان جزئیات را در فرم های استاندارد HTML پر کنید.
برخی از شرکت ها سعی می کنند این زمینه ها را بر اساس اطلاعاتی که از CV شما استخراج شده است ، خودکار کنند ، اما نتایج اغلب به دور از دقیق یا کامل نیست.

در کد زیر ، من Pixstral ، Langchain و Pydantic را با هم ترکیب می کنم تا یک راه حل ساده ارائه دهم.
در صورت وجود ، کد نام ، نام خانوادگی ، شماره تلفن ، ایمیل و تولد را از CV استخراج می کند. این به ساده نگه داشتن مثال کمک می کند و بر جنبه های فنی تمرکز دارد.
این کد را می توان به راحتی برای سایر موارد استفاده سازگار کرد یا برای استخراج کلیه اطلاعات مورد نیاز از CV گسترش یافت.

بنابراین بگذارید وارد کد شویم.

کدگذاری کد

وارد کردن کتابخانه های مورد نیاز

در مرحله اول ، کتابخانه های مورد نیاز وارد می شوند ، از جمله:

  • osبا pathlibوت typing برای ماژول های استاندارد پایتون که دسترسی به سیستم فایل را فراهم می کنند و حاشیه نویسی را تایپ می کنند
  • base64 برای رمزگذاری داده های باینری به عنوان متن
  • dontenv برای بارگیری متغیرهای محیط از a .env به os.environ
  • pydantic برای تعریف یک طرح برای ساختار LLM خروجی
  • ChatMistralAI از ادغام mistral Langchain به عنوان قابلیت بینایی LLM رابط
  • PIL برای باز کردن و تغییر اندازه تصاویر
import os
import base64
from pathlib import Path
from typing import Optional
from dotenv import load_dotenv
from pydantic import BaseModel, Field
from langchain_mistralai.chat_models import ChatMistralAI
from langchain_core.messages import HumanMessage
from PIL import Image

متغیرهای محیط بارگیری

پس از آن ، متغیرهای محیط با استفاده از آن بارگیری می شوند load_dotenv()، و MISTRAL_API_KEY بازیابی می شود

load_dotenv()
MISTRAL_API_KEY = os.getenv("MISTRAL_API_KEY")
if not MISTRAL_API_KEY:
raise ValueError("MISTRAL_API_KEY not set in environment")

تعریف طرح خروجی با Pydantic

پس از آن ، طرح خروجی با استفاده از Pydantic تعریف می شود. Pydantic یک کتابخانه پایتون برای تجزیه و اعتبار داده ها بر اساس نکات نوع پایتون است. در هسته آن ، Pydantic’s BaseModel ویژگی های مفید مختلفی مانند اعلام انواع داده ها را ارائه می دهد (به عنوان مثال strبا intبا List[str]، مدل های تو در تو و غیره) و اجبار خودکار داده های دریافتی در انواع مورد نیاز در صورت امکان (به عنوان مثال ، تبدیل "102" به 102).
علاوه بر این ، تأیید می کند که آیا داده های دریافتی با طرح از پیش تعریف شده مطابقت دارند و در صورت عدم وجود خطایی ایجاد می کنند. با تشکر از این طرح های کاملاً مشخص ، داده ها می توانند به سرعت در قالب های دیگری مانند JSON سریال شوند. به همین ترتیب ، Pydantic همچنین امکان ایجاد زمینه های اسناد را با ابرداده ای فراهم می کند که ابزارهایی مانند LLM ها می توانند از آنها بازرسی و استفاده کنند.
بلوک کد بعدی ساختار خروجی مورد انتظار را با استفاده از Pydantic تعریف می کند. اینها نقاط داده ای هستند که مدل باید از تصویر CV استخراج کند.

class BasicCV(BaseModel):
first_name: Optional[str] = Field(None, description="first name")
last_name: Optional[str] = Field(None, description="last name")
phone: Optional[str] = Field(None, description="Telephone number")
email: Optional[str] = Field(None, description="Email address")
birthday: Optional[str] = Field(None, description="Date of birth (e.g., YYYY-MM-DD)")

تبدیل تصاویر به Base64

پس از آن ، اولین عملکرد برای فیلمنامه تعریف شده است. تابع encode_image_to_base64() دقیقاً همان چیزی را که نام آن نشان می دهد انجام می دهد. یک تصویر را بارگیری می کند و آن را به یک رشته Base64 تبدیل می کند ، که بعداً به VLM منتقل می شود.

علاوه بر این ، یک عامل افزایشی یکپارچه شده است. اگرچه هیچ اطلاعات اضافی با افزایش ارتفاع و عرض به دست نمی آید ، اما در تجربه من ، نتایج به ویژه در شرایطی که وضوح اصلی تصویر کم باشد ، بهبود می یابد.

def encode_image_to_base64(image_path: Path, upscale_factor: float = 1.0) -> str:
with Image.open(image_path) as img:
if upscale_factor != 1.0:
new_size = (int(img.width * upscale_factor), int(img.height * upscale_factor))
img = img.resize(new_size, Image.LANCZOS)
from io import BytesIO
buffer = BytesIO()
img.save(buffer, format="PNG")
image_bytes = buffer.getvalue()
return base64.b64encode(image_bytes).decode()

پردازش CV با یک مدل زبان بینایی

حال ، بیایید به عملکرد اصلی این اسکریپت حرکت کنیم. در process_cv() عملکرد با شروع رابط MISTRAL با استفاده از یک کلید API که قبلاً تولید شده است ، آغاز می شود. این مدل سپس با استفاده از .with_structured_output(BasicCV) تابع ، که در آن مدل Pydantic تعریف شده در بالا به عنوان ورودی منتقل می شود. اگر از VLM متفاوت استفاده می کنید ، اطمینان حاصل کنید که از خروجی ساختاری پشتیبانی می کند ، همانطور که همه VLM ها انجام نمی دهند.

پس از آن ، تصویر ورودی به یک رشته Base64 (B64) تبدیل می شود ، که سپس با اتصال یک رشته ابرداده در جلوی رشته B64 به یک شناسه منبع یکنواخت (URI) تبدیل می شود.

در مرحله بعد ، یک سریع سیستم ساده تعریف شده است ، که فضای لازم برای بهبود کارهای پیچیده تر استخراج را ترک می کند اما برای این سناریو کاملاً کار می کند.

سرانجام ، URI و System Prompt در یک لانگچین ترکیب می شوند HumanMessage، که به VLM ساختاری منتقل می شود. سپس مدل اطلاعات درخواستی را در قالب Pydantic قبلاً تعریف شده بازگرداند.

def process_cv(
image_path: Path,
api_key: Optional[str] = None
) -> BasicCV:

llm = ChatMistralAI(
model="pixtral-12b-latest",
mistral_api_key=api_key or MISTRAL_API_KEY,
)

structured_llm = llm.with_structured_output(BasicCV)

image_b64 = encode_image_to_base64(image_path)
data_uri = f"data:image/png;base64,{image_b64}"

system_text = (
"Extract only the following fields from this CV: first name, last name, "
"telephone number, email address, and birthday. Return JSON matching the schema."
)

message = HumanMessage(
content=[
{"type": "text", "text": system_text},
{"type": "image_url", "image_url": data_uri},
]
)

result: BasicCV = structured_llm.invoke([message])

return result

اجرای فیلمنامه

این عملکرد توسط اصلی اجرا می شود ، جایی که مسیر تعریف شده و اطلاعات نهایی چاپ می شود.

if __name__ == "__main__":
image_file = Path("cv-test.png")
cv_data = process_cv(image_file)

print(f"First Name: {cv_data.first_name}")
print(f"Last Name: {cv_data.last_name}")
print(f"Phone: {cv_data.phone}")
print(f"Email: {cv_data.email}")
print(f"Birthday: {cv_data.birthday}")

پایان

این اسکریپت ساده پایتون تنها تصور اول را در مورد چگونگی تبدیل شدن VLM های قدرتمند و انعطاف پذیر ارائه می دهد. در ترکیب با Pydantic و با پشتیبانی از چارچوب قدرتمند Langchain ، VLM ها را می توان به یک راه حل معنی دار برای بسیاری از گردش کار پردازش اسناد ، مانند پردازش برنامه یا رسیدگی به فاکتور تبدیل کرد.

چه تجربه ای با مدل های بزرگ زبان Vision داشته اید؟
آیا زمینه های دیگری را در ذهن دارید که چنین گردش کار مفید باشد؟

منبع

felix-pappe.medium.com/subscribs 🔔
www.linkedin.com/in/felix-pappe 🔗
https://felixpappe.de🌐

منتشر شده از طریق به سمت هوش مصنوعی



منبع: https://towardsai.net/p/l/extracting-data-from-unstructured-documents

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *