إنتقل إلى المحتوى الرئيسي

الفصل 3: التعامل مع أنواع الملفات المختلفة

مقدمة​

تأتي وثائق العالم الحقيقي بصيغ كثيرة، ولكل منها تحديات فريدة. يغطّي هذا الفصل استراتيجيات التعامل مع PDF والصور والجداول والبيانات المنظّمة.

تحديات PDF​

ملفات PDF هي الصيغة الأكثر شيوعًا، لكنها أيضًا الأكثر صعوبة:

مناطق المشكلات​

التحديالوصفالحل
PDF ممسوحصور وليست نصًامعالجة OCR
الجداولفقدان البنيةمستخرجات متخصّصة
أعمدة متعددةترتيب قراءة خاطئتحليل التخطيط
الترويسات/التذييلاتضوضاء متكرّرةالتصفية

خيارات استخراج PDF​

# Option 1: Basic (PyPDF2/PyPDFLoader)
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("document.pdf")
# Pros: Fast, simple
# Cons: Poor with complex layouts

# Option 2: Better tables (PDFPlumber)
from langchain.document_loaders import PDFPlumberLoader
loader = PDFPlumberLoader("document.pdf")
# Pros: Better table extraction
# Cons: Slower

# Option 3: Best quality (Unstructured)
from langchain.document_loaders import UnstructuredPDFLoader
loader = UnstructuredPDFLoader(
"document.pdf",
mode="elements", # Preserves structure
strategy="hi_res" # Best quality
)
# Pros: Best overall quality
# Cons: Requires additional dependencies

OCR للوثائق الممسوحة​

لملفات PDF الممسوحة والصور:

# Using Tesseract OCR
from langchain.document_loaders import UnstructuredPDFLoader

loader = UnstructuredPDFLoader(
"scanned_document.pdf",
strategy="ocr_only",
ocr_languages="eng"
)
documents = loader.load()

# Using Amazon Textract
from langchain.document_loaders import AmazonTextractPDFLoader

loader = AmazonTextractPDFLoader(
"scanned.pdf",
client=textract_client
)

أفضل ممارسات OCR​

  1. معالجة مسبقة للصور - تصحيح الميل وتحسين التباين
  2. تحديد اللغة - يحسّن الدقة
  3. معالجة لاحقة للنص - إصلاح أخطاء OCR الشائعة
  4. درجات الثقة - علّم الاستخراجات منخفضة الثقة

التعامل مع الجداول​

تتطلّب الجداول معالجة خاصة للحفاظ على البنية:

# Method 1: Convert to Markdown
from langchain.document_loaders import UnstructuredPDFLoader

loader = UnstructuredPDFLoader(
"report.pdf",
mode="elements"
)
docs = loader.load()

# Tables come as structured elements
for doc in docs:
if doc.metadata.get("category") == "Table":
# Process table specially
table_markdown = convert_table_to_markdown(doc)

# Method 2: Using Camelot for PDFs
import camelot

tables = camelot.read_pdf("document.pdf", pages="all")
for table in tables:
df = table.df
markdown = df.to_markdown()

استراتيجية Chunking للجداول​

def chunk_with_tables(documents):
chunks = []

for doc in documents:
if is_table(doc):
# Keep tables as single chunks
chunks.append(doc)
else:
# Normal chunking for text
text_chunks = splitter.split_documents([doc])
chunks.extend(text_chunks)

return chunks

الصور في الوثائق​

استخرج الصور وعالجها:

# Extract images from PDF
import fitz # PyMuPDF

doc = fitz.open("document.pdf")
for page_num, page in enumerate(doc):
images = page.get_images()
for img_index, img in enumerate(images):
# Extract image
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]

# Process with vision model
description = vision_model.describe(image_bytes)

# Add description to document

دمج نماذج الرؤية​

from langchain.chat_models import ChatOpenAI

# Use GPT-4 Vision for image understanding
vision_llm = ChatOpenAI(model="gpt-4-vision-preview")

def describe_image(image_path):
response = vision_llm.invoke([
{
"type": "image_url",
"image_url": f"data:image/jpeg;base64,{base64_image}"
},
{
"type": "text",
"text": "Describe this image in detail for document search."
}
])
return response.content

البيانات المنظّمة​

JSON/JSONL​

from langchain.document_loaders import JSONLoader

loader = JSONLoader(
file_path="data.json",
jq_schema=".data[].content",
text_content=False
)

CSV​

from langchain.document_loaders import CSVLoader

loader = CSVLoader(
file_path="data.csv",
csv_args={"delimiter": ","},
source_column="source"
)

# For large CSVs, process in batches
import pandas as pd

def load_csv_in_batches(file_path, batch_size=1000):
for chunk in pd.read_csv(file_path, chunksize=batch_size):
yield from chunk.to_dict('records')

قواعد بيانات SQL​

from langchain.document_loaders import SQLDatabaseLoader
from langchain.utilities import SQLDatabase

db = SQLDatabase.from_uri("postgresql://user:pass@localhost/db")

loader = SQLDatabaseLoader(
db=db,
query="SELECT id, content, metadata FROM documents WHERE active = true"
)

خط المعالجة الكامل​

from pathlib import Path

def process_document(file_path: str):
"""Universal document processor"""
path = Path(file_path)
extension = path.suffix.lower()

loaders = {
".pdf": lambda p: UnstructuredPDFLoader(p, strategy="hi_res"),
".docx": lambda p: Docx2txtLoader(p),
".txt": lambda p: TextLoader(p, encoding="utf-8"),
".html": lambda p: UnstructuredHTMLLoader(p),
".md": lambda p: UnstructuredMarkdownLoader(p),
".csv": lambda p: CSVLoader(p),
".json": lambda p: JSONLoader(p, jq_schema=".[]")
}

if extension not in loaders:
raise ValueError(f"Unsupported file type: {extension}")

loader = loaders[extension](str(path))
documents = loader.load()

# Add file metadata
for doc in documents:
doc.metadata["file_name"] = path.name
doc.metadata["file_type"] = extension
doc.metadata["file_size"] = path.stat().st_size

return documents

ملخص​

نوع الملفأفضل محمّلملاحظات
PDF (نص)PDFPlumberLoaderدعم جيد للجداول
PDF (ممسوح)UnstructuredPDFLoader + OCRاستخدم استراتيجية hi_res
WordDocx2txtLoaderسريع وموثوق
HTMLUnstructuredHTMLLoaderيزيل الوسوم
CSVCSVLoaderدفعات للملفات الكبيرة
صورنماذج الرؤيةللصور المضمّنة

النقاط الأساسية​

  1. ملفات PDF معقّدة - استخدم المحمّل المناسب لاحتياجك
  2. OCR للوثائق الممسوحة - ضروري لملفات PDF القائمة على الصور
  3. الجداول تحتاج معالجة خاصة - لا تقسّم عبر الصفوف
  4. الصور تحتاج وصفًا - استخدم نماذج الرؤية
  5. اختبر خطك - بعينات تمثيلية

الخطوات التالية​

اختبر معرفتك عبر اختبار الوحدة 2!