0Pricing
AI Engineering Academy · Pelajaran

Memuat Dokumen dan Mengekstrak Teks

Muat PDF, dokumen Word, dan berkas teks biasa menggunakan pustaka Python, bersihkan teks hasil ekstraksi, lalu siapkan untuk pembagian dan penyematan.

Memuat Dokumen dan Mengekstrak Teks adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Mengapa Pemuatan Dokumen Tidak Sederhana

Tahap pertama dalam setiap pipeline RAG adalah mendapatkan teks mentah dari dokumen Anda. Kedengarannya sederhana, tetapi dalam praktiknya ternyata cukup rumit. File PDF dapat menyematkan teks sebagai karakter, sebagai gambar, atau sebagai campuran keduanya. Dokumen Word berisi markup pemformatan yang harus Anda hapus. Halaman HTML menyertakan menu navigasi dan iklan bersama konten sebenarnya. Pemuat yang tangguh harus menangani semua kasus ini dan menghasilkan teks yang bersih serta koheren untuk pemotongan menjadi beberapa bagian.

Memuat PDF dengan pypdf

pypdf adalah pustaka Python standar untuk membaca file PDF yang berisi teks tertanam. Pustaka ini mengekstrak teks halaman demi halaman dan mempertahankan batas halaman asli yang merupakan metadata berharga. Namun, pypdf tidak dapat membaca PDF hasil pemindaian (gambar teks) — PDF tersebut memerlukan OCR. Selalu ekstrak nomor halaman bersama teks agar Anda dapat mencantumkan halaman yang tepat dalam kutipan RAG.

from pypdf import PdfReader

def load_pdf(file_path):
    reader = PdfReader(file_path)
    pages = []
    for page_num, page in enumerate(reader.pages, start=1):
        text = page.extract_text()
        if text and text.strip():  # skip blank pages
            pages.append({
                'text': text,
                'metadata': {
                    'source': file_path,
                    'page': page_num,
                    'doc_type': 'pdf'
                }
            })
    return pages

docs = load_pdf('annual_report.pdf')
print(f'Loaded {len(docs)} non-empty pages')

Memuat Dokumen Word dengan python-docx

File Microsoft Word (.docx) menyimpan konten dalam format XML. Pustaka python-docx mengurai XML ini dan menyediakan paragraf, tabel, serta judul sebagai objek Python. Ekstrak teks paragraf secara berurutan dan catat tingkat judul untuk mempertahankan struktur dokumen — judul bagian merupakan konteks berharga yang meningkatkan kualitas pemotongan dan pengambilan jika disertakan bersama teks yang diperkenalkannya.

from docx import Document

def load_docx(file_path):
    doc = Document(file_path)
    sections = []
    current_section = {'heading': '', 'text': ''}

    for para in doc.paragraphs:
        if para.style.name.startswith('Heading'):
            if current_section['text'].strip():
                sections.append(current_section.copy())
            current_section = {'heading': para.text, 'text': ''}
        else:
            current_section['text'] += para.text + '\n'

    if current_section['text'].strip():
        sections.append(current_section)

    return [{'text': f"{s['heading']}\n{s['text']}",
             'metadata': {'source': file_path, 'section': s['heading']}}
            for s in sections]

Memuat Halaman Web dan HTML

Halaman HTML berisi banyak gangguan: bilah navigasi, catatan kaki, spanduk cookie, dan blok iklan. Gunakan BeautifulSoup untuk mengurai HTML dan mengekstrak hanya area konten utama. Targetkan elemen seperti <article>, <main>, atau kelas CSS khusus konten. Hapus tag skrip, gaya, dan navigasi sebelum mengekstrak teks agar potongan Anda tidak tercemar oleh kode JavaScript atau item menu.

import requests
from bs4 import BeautifulSoup

def load_url(url):
    response = requests.get(url, timeout=10)
    response.raise_for_status()

    soup = BeautifulSoup(response.text, 'html.parser')

    # Remove noise elements
    for tag in soup(['script', 'style', 'nav', 'footer', 'header', 'aside']):
        tag.decompose()

    # Try to find main content
    main = soup.find('article') or soup.find('main') or soup.find('body')
    text = main.get_text(separator='\n', strip=True)

    return [{'text': text, 'metadata': {'source': url, 'doc_type': 'html'}}]

Menangani PDF Hasil Pemindaian dengan OCR

PDF hasil pemindaian menyimpan halaman sebagai gambar tanpa teks tersemat. Untuk mengekstrak teks, Anda memerlukan Pengenalan Karakter Optik (OCR). Pustaka pytesseract membungkus mesin OCR Tesseract dari Google. OCR lebih lambat dan kurang akurat daripada ekstraksi teks (akurasi karakter 80–95% pada hasil pemindaian yang baik), jadi selalu utamakan PDF digital jika tersedia. Tandai dalam metadata bahwa OCR digunakan agar Anda dapat meninjau hasil ekstraksi dengan tingkat kepercayaan rendah.

import pytesseract
from pdf2image import convert_from_path

def load_scanned_pdf(file_path):
    # Convert PDF pages to PIL images
    pages_as_images = convert_from_path(file_path, dpi=300)
    results = []
    for page_num, img in enumerate(pages_as_images, start=1):
        text = pytesseract.image_to_string(img, lang='eng')
        results.append({
            'text': text,
            'metadata': {
                'source': file_path,
                'page': page_num,
                'ocr': True  # flag for quality review
            }
        })
    return results

Menggunakan Unstructured untuk Format Apa Pun

Pustaka unstructured adalah alat serbaguna untuk memuat dokumen yang menangani PDF, Word, Excel, PowerPoint, HTML, email, dan banyak lagi melalui API terpadu. Pustaka ini menggunakan heuristik untuk mengenali elemen dokumen (judul, teks naratif, tabel, header) dan mengembalikannya sebagai objek terstruktur. Hal ini sangat berguna ketika korpus Anda berisi beragam jenis dokumen dan Anda menginginkan metadata pada tingkat elemen tanpa menulis pengurai khusus untuk setiap format.

from unstructured.partition.auto import partition

def load_any_document(file_path):
    elements = partition(filename=file_path)
    docs = []
    for element in elements:
        docs.append({
            'text': str(element),
            'metadata': {
                'source': file_path,
                'element_type': type(element).__name__,
                'category': element.category
            }
        })
    return docs

# Works on .pdf, .docx, .pptx, .html, .eml, .xlsx
docs = load_any_document('presentation.pptx')

Pembersihan Teks Setelah Ekstraksi

Teks mentah hasil ekstraksi jarang benar-benar bersih. Ekstraksi PDF sering menghasilkan pemutusan baris dengan tanda hubung akibat tata letak kolom, spasi kosong berlebih, header halaman yang diulang pada setiap halaman, dan karakter khusus yang kacau. Terapkan alur pembersihan: hapus spasi kosong berlebih, gabungkan kembali kata bertanda hubung yang terpisah oleh pemutusan baris, hapus header dan footer halaman yang dikenali melalui pencocokan pola, lalu normalkan karakter Unicode. Teks yang bersih menghasilkan koherensi potongan yang jauh lebih baik.

import re

def clean_text(text):
    # Rejoin hyphenated line breaks (PDF column artifacts)
    text = re.sub(r'-(\n)([a-z])', r'\2', text)
    # Normalize whitespace
    text = re.sub(r' +', ' ', text)
    text = re.sub(r'\n{3,}', '\n\n', text)
    # Remove page numbers standing alone on a line
    text = re.sub(r'^\d+$', '', text, flags=re.MULTILINE)
    # Strip leading/trailing whitespace from each line
    lines = [line.strip() for line in text.split('\n')]
    return '\n'.join(lines).strip()

Memuat dari Basis Data dan API

Tidak semua pengetahuan tersimpan dalam file. Basis data internal, sistem CRM, alat pengelolaan tiket, dan API REST juga merupakan sumber data. Muat baris basis data terstruktur dengan menggabungkan tabel yang relevan dan menggabungkan nilai bidang menjadi paragraf berbahasa alami yang dapat dipahami model penyematan. Untuk API, ambil hasil yang terbagi dalam beberapa halaman dan serialisasikan setiap rekaman sebagai dokumen teks dengan pasangan kunci-nilai.

import psycopg2

def load_from_database(conn_string, query):
    conn = psycopg2.connect(conn_string)
    cursor = conn.cursor()
    cursor.execute(query)
    columns = [desc[0] for desc in cursor.description]
    docs = []
    for row in cursor.fetchall():
        # Convert row to natural language text
        parts = [f'{col}: {val}' for col, val in zip(columns, row) if val]
        text = '\n'.join(parts)
        docs.append({'text': text, 'metadata': {'source': 'database'}})
    conn.close()
    return docs

Melacak Asal Dokumen

Setiap dokumen yang dimuat harus membawa metadata asal di sepanjang seluruh alur: URL sumber atau jalur file, judul dokumen, penulis, tanggal pembuatan, dan tanggal terakhir diubah. Metadata ini ikut terbawa bersama setiap potongan ke penyimpanan vektor dan ditampilkan dalam sitasi LLM. Tanpa informasi asal, Anda tidak dapat memberi tahu pengguna dari mana jawaban berasal, tidak dapat memperbarui dokumen tertentu dalam indeks, dan tidak dapat memfilter pengambilan berdasarkan atribut sumber.

import os
from datetime import datetime

def load_pdf_with_provenance(file_path):
    from pypdf import PdfReader
    reader = PdfReader(file_path)
    stat = os.stat(file_path)
    base_metadata = {
        'source': file_path,
        'title': reader.metadata.get('/Title', os.path.basename(file_path)),
        'author': reader.metadata.get('/Author', 'Unknown'),
        'doc_type': 'pdf',
        'file_size_kb': stat.st_size // 1024,
        'loaded_at': datetime.utcnow().isoformat()
    }
    pages = []
    for i, page in enumerate(reader.pages, 1):
        text = page.extract_text()
        if text and text.strip():
            pages.append({'text': text, 'metadata': {**base_metadata, 'page': i}})
    return pages

Memuat Kumpulan Dokumen Besar Secara Berkelompok

Saat mengindeks ribuan dokumen, muat dokumen tersebut secara paralel menggunakan concurrent.futures agar sumber daya I/O dan CPU termanfaatkan secara maksimal. Terapkan pelacak kemajuan dan log kesalahan agar kegagalan pemuatan dokumen tidak diam-diam menghilangkan konten dari indeks Anda. Jangan pernah membiarkan satu file rusak menghentikan seluruh pekerjaan pemuatan — tangkap pengecualian untuk setiap dokumen dan lanjutkan ke dokumen berikutnya.

from concurrent.futures import ThreadPoolExecutor, as_completed

def batch_load_documents(file_paths, max_workers=8):
    all_docs = []
    errors = []
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        future_to_path = {
            executor.submit(load_pdf_with_provenance, p): p
            for p in file_paths
        }
        for future in as_completed(future_to_path):
            path = future_to_path[future]
            try:
                docs = future.result()
                all_docs.extend(docs)
                print(f'Loaded {len(docs)} pages from {path}')
            except Exception as e:
                errors.append({'path': path, 'error': str(e)})
    return all_docs, errors

Memvalidasi Kualitas Konten yang Dimuat

Setelah pemuatan, validasikan bahwa Anda mengekstrak konten yang bermakna. Periksa hal-hal berikut: panjang teks minimum (lewati potongan yang berisi kurang dari 50 karakter), deteksi bahasa (jika RAG Anda hanya menggunakan bahasa Inggris, saring halaman non-Inggris), dan deteksi teks yang kacau (rasio karakter non-ASCII yang tinggi dapat menunjukkan kegagalan OCR atau masalah pengodean). Catat statistik seperti jumlah halaman yang dimuat, rata-rata panjang halaman, dan tingkat kesalahan untuk mendeteksi masalah pemuatan sejak awal.

def validate_documents(docs, min_length=100):
    valid = []
    skipped = 0
    for doc in docs:
        text = doc['text']
        if len(text) < min_length:
            skipped += 1
            continue
        # Check for high non-ASCII ratio (garbled OCR)
        non_ascii = sum(1 for c in text if ord(c) > 127)
        if non_ascii / max(len(text), 1) > 0.3:
            skipped += 1
            continue
        valid.append(doc)
    print(f'Valid: {len(valid)}, Skipped: {skipped}')
    return valid

Pemeriksaan Singkat

Uji pemahaman Anda tentang konsep Rekayasa AI dari pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini Anda mempelajari: pemuat khusus format untuk PDF dengan pypdf, dokumen Word dengan python-docx, HTML dengan BeautifulSoup, dan dokumen hasil pemindaian dengan OCR; pustaka unstructured sebagai pemuat terpadu untuk berbagai format; serta praktik terbaik untuk penggunaan produksi, termasuk pembersihan teks, metadata asal, pemuatan paralel secara berkelompok, dan validasi konten. Selanjutnya kita akan membahas strategi pembagian potongan yang menentukan cara teks yang diambil dipetakan ke konteks model.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memuat Dokumen dan Mengekstrak Teks” gratis?

Ya — teks lengkap “Memuat Dokumen dan Mengekstrak Teks” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memuat Dokumen dan Mengekstrak Teks”?

Muat PDF, dokumen Word, dan berkas teks biasa menggunakan pustaka Python, bersihkan teks hasil ekstraksi, lalu siapkan untuk pembagian dan penyematan. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?

Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Memuat Dokumen dan Mengekstrak Teks” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?

Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Memuat Dokumen dan Mengekstrak Teks
  2. Strategi Pembagian: Tetap vs Kalimat vs Rekursif
  3. Pengindeksan: Menyematkan dan Menyimpan Bagian
  4. Mengueri, Mengambil, dan Menghasilkan
← Kembali ke AI Engineering Academy