Lesson 48 — Intermediate

Data Ingestion & Document Processing

RAG ki quality us data se banti hai jo index mein jaata hai. Is lesson mein hum PDF, HTML aur DOCX se text nikalna, OCR ka decision, structure ke saath cleaning, duplicates pehchanna aur incremental re-indexing — sab ek chhote Python pipeline ke saath dekhenge.

⏱ 20 min• Intermediate• Basic computer usage

Ingestion kya hai

Kya hai?

Ingestion matlab raw documents (PDF, HTML, DOCX, emails, scans) ko clean, structured aur de-duplicated text mein badalna — chunking aur embedding se pehle ka step. Ganda data daaloge toh retrieval bhi ganda milega.

Kab kaam aata hai?

Jab bhi naya corpus index mein jaaye — policy manuals, invoices, Notion exports, website crawl, purane scanned files. Aur jab document update ho: sirf badla hua hissa dobara process karna padta hai.

Kahan milta hai?

Ingestion scripts (Python), document loaders ke andar, ETL jobs mein, ya kisi RAG service ke background worker mein. Tumhara ye wala step aksar ek CLI script ya scheduled job hota hai.

Funda simple hai: extraction sahi nahi hua toh chunk sahi nahi banega, chunk sahi nahi banega toh embedding bekaar. Isliye ingestion par debugging pehle karo — har doc pe ek sample nikaal ke padho, andhere mein batch mat chalao.

Rule of thumb: Pipeline ka har stage ek sample data pe manually check karo: raw file → extracted text → cleaned text. Ek baar ye 3 checkpoints clear ho jaayein, tabhi batch run karo.

PDF, HTML aur DOCX se extract karna

from pathlib import Path

def extract(path: Path):
    suffix = path.suffix.lower()
    if suffix == ".pdf":
        return extract_pdf(path)      # text layer ho toh seedha, warna OCR
    if suffix in (".html", ".htm"):
        return extract_html(path)     # tags hatao, main content chhodo
    if suffix == ".docx":
        return extract_docx(path)     # headings + paragraphs ke saath
    raise ValueError("unsupported format: " + suffix)


def needs_ocr(sample_text: str) -> bool:
    letters = sum(ch.isalpha() for ch in sample_text)
    return letters < 30               # page bhar ka text khali = scan hai
Pehle check phir OCR: OCR dheere aur mehnga chalta hai. Ek page ka text nikaalo, letters gin lo, tabhi decide karo. Do-column ya table-wale scanned pages pe reading order bigadta hai — extract ke baad text zaroor padh ke verify karo.

Cleaning — structure bachaate hue

import re

FOOTER = re.compile(r"Page \d+ of \d+")

def clean(text: str) -> str:
    text = text.replace("\u00a0", " ")      # non-breaking space
    text = FOOTER.sub("", text)             # har page ka footer hatao
    text = re.sub(r"[ \t]+", " ", text)     # extra spaces -> ek space
    text = re.sub(r"\n{3,}", "\n\n", text)  # 3+ newlines -> 2
    return text.strip()
Structure = context: Heading hata diya toh chunk akela padhne mein samajh nahi aayega ki wo kis section ka hai. Heading, doc title aur page number ko chunk ke metadata mein carry karo — retrieval quality aur citation dono isi se behtar hote hain.

Duplicates, updates aur re-indexing

import hashlib

def fingerprint(text: str) -> str:
    norm = " ".join(text.lower().split())   # case + space normalize
    return hashlib.sha256(norm.encode()).hexdigest()[:16]

# Har doc ke liye stored state (manifest):
# old = {"doc-7": fingerprint, ...}
# naya fingerprint same  -> skip (embedding bach gaye)
# naya fingerprint alag  -> re-extract + re-chunk + re-embed
naya doc      -> fingerprint naya    -> extract -> chunk -> embed -> index
updated doc   -> fingerprint alag    -> purane chunks delete -> naye embed
del doc       -> sirf chunks delete (embedding compute hi nahi)
same doc      -> skip (poora embedding bach gaye)
Manifest rakho: Ek chhota state file ya table rakho jisme har source ka fingerprint aur last-indexed time ho. Ye tumhari re-indexing ki Gaadi hai — bina iske har run pe poora corpus dobara embed karna padega.

Ingestion ke common traps

Debug mantra: Agar retrieval kharab hai toh pehle ingestion dekho, embedding model ko dosh mat do. Ek-ek doc ka extracted text khol ke padho — aadhi RAG problems wahi khatam ho jaati hain.

Exercise

Question: Scanned PDF mein text layer nahi hai — usse text banane ka process kya kehlata hai?

Question: Duplicate document pehchanne ke liye content ka chhota fingerprint banane mein kaunsa hash common hai?

Question: DOCX se headings aur paragraphs nikalne ke liye kaunsi Python library common hai? (python-docx / pypdf)

Question: Har page pe repeat hone wala footer text ko cleaning mein kya karte hain — remove ya keep?

Common mistakes

Desi example: Purane library register ka data entry

Register mein entries hain, kai jagah ink phail gaya, page numbers neeche bikhre hain. Data entry wala pehle entry padhta hai (extract), daag hataata hai (clean), aur check karta hai ki yehi entry pehle se toh nahi (dedupe) — seedha photocopy nahi chaapta:

text
raw page  -> entry nikalo (extract)
          -> daag-dhabbe hatao (clean)
          -> fingerprint match? (dedupe)
          -> register mein daalo (index)
warna: photostat = ganda data register mein, baad mein dhoondhna impossible
Interview angle — yahan se sawaal aate hain
  • Q: PDF se text nikalte waqt sabse pehla check kya hai? — Text layer hai ya scan (OCR wala decision).
  • Q: Cleaning ke baavjood structure kyun bachate hain? — Headings/page numbers se chunk ka context milta hai aur citation trace ho sake.
  • Q: Duplicate docs se kya hota hai? — Top-k ka space waste, answer ek hi baat doharata hai, scores bhi skewed.
  • Q: Incremental re-indexing kaise karte ho? — Content fingerprint se diff nikaal ke sirf badle hue documents re-process.
Lesson complete?

Ingestion clear — ab tum PDF/HTML/DOCX se saaf structured data nikaal sakte ho, duplicates hata sakte ho. Agla lesson — Chunking Strategies — mein dekhenge inhi documents ko retrieval ke liye chhote pieces mein kaise toda jaata hai.

Popular courses: Data Science Course in Lucknow · AI Course in Lucknow · Python Course in Lucknow · Power BI Course · Data Analytics Course