الفصل 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
- معالجة مسبقة للصور - تصحيح الميل وتحسين التباين
- تحديد اللغة - يحسّن الدقة
- معالجة لاحقة للنص - إصلاح أخطاء OCR الشائعة
- درجات الثقة - علّم الاستخراجات منخفضة الثقة
التعامل مع الجداول
تتطلّب الجداول معالجة خاصة للحفاظ على البنية:
# 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 |
| Word | Docx2txtLoader | سريع وموثوق |
| HTML | UnstructuredHTMLLoader | يزيل الوسوم |
| CSV | CSVLoader | دفعات للملفات الكبيرة |
| صور | نماذج الرؤية | للصور المضمّنة |
النقاط الأساسية
- ملفات PDF معقّدة - استخدم المحمّل المناسب لاحتياجك
- OCR للوثائق الممسوحة - ضروري لملفات PDF القائمة على الصور
- الجداول تحتاج معالجة خاصة - لا تقسّم عبر الصفوف
- الصور تحتاج وصفًا - استخدم نماذج الرؤية
- اختبر خطك - بعينات تمثيلية
الخطوات التالية
اختبر معرفتك عبر اختبار الوحدة 2!