Pemuatan Dokumen dan Pengekstrakan Teks
Muatkan PDF, dokumen Word dan fail teks biasa menggunakan pustaka Python, bersihkan teks yang diekstrak, dan sediakannya untuk pemecahan serta pembenaman.
Pemuatan Dokumen dan Pengekstrakan Teks ialah pelajaran AI Engineering Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran AI Engineering Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus AI Engineering Academy merangkumi sejumlah 4 pelajaran.
Mengapa Pemuatan Dokumen Tidak Semudah yang Disangka
Peringkat pertama bagi mana-mana pipeline RAG ialah mendapatkan teks mentah daripada dokumen anda. Perkara ini kedengaran mudah tetapi sebenarnya agak rumit dalam amalan. Fail PDF mungkin membenamkan teks sebagai aksara, sebagai imej atau sebagai gabungan kedua-duanya. Dokumen Word mengandungi penanda format yang mesti anda buang. Halaman HTML menyertakan menu navigasi dan iklan di samping kandungan sebenar. Pemuat yang teguh mesti mengendalikan semua keadaan ini dan menghasilkan teks yang bersih serta koheren untuk pembahagian kepada serpihan.
Memuatkan PDF dengan pypdf
pypdf ialah pustaka Python standard untuk membaca fail PDF yang mengandungi teks terbenam. Pustaka ini mengekstrak teks halaman demi halaman sambil mengekalkan sempadan halaman asal, yang merupakan metadata berharga. Walau bagaimanapun, pypdf tidak boleh membaca PDF yang diimbas (imej teks) — PDF tersebut memerlukan OCR. Sentiasa ekstrak nombor halaman bersama-sama teks supaya anda boleh memetik halaman yang tepat dalam petikan RAG anda.
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')Memuatkan Dokumen Word dengan python-docx
Fail Microsoft Word (.docx) menyimpan kandungan dalam format XML. Pustaka python-docx menghuraikan XML ini dan mendedahkan perenggan, jadual serta pengepala sebagai objek Python. Ekstrak teks perenggan secara berurutan dan catat aras pengepala untuk mengekalkan struktur dokumen — pengepala bahagian ialah konteks berharga yang meningkatkan kualiti pembahagian kepada serpihan dan pemerolehan apabila 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]Memuatkan Halaman Web dan HTML
Halaman HTML mengandungi banyak gangguan: bar navigasi, pengaki, sepanduk kuki dan blok iklan. Gunakan BeautifulSoup untuk menghuraikan HTML dan mengekstrak hanya kawasan kandungan utama. Sasarkan elemen seperti <article>, <main> atau kelas CSS khusus kandungan. Buang tag skrip, gaya dan navigasi sebelum mengekstrak teks supaya serpihan anda tidak tercemar oleh kod 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'}}]Mengendalikan PDF yang Diimbas dengan OCR
PDF yang diimbas menyimpan halaman sebagai imej tanpa teks terbenam. Untuk mengekstrak teks, anda memerlukan Pengecaman Aksara Optik (OCR). Pustaka pytesseract membungkus enjin OCR Tesseract Google. OCR lebih perlahan dan kurang tepat berbanding pengekstrakan teks (ketepatan aksara 80–95% pada imbasan yang baik), jadi sentiasa utamakan PDF digital apabila tersedia. Tandakan dalam metadata bahawa OCR telah digunakan supaya anda boleh menyemak hasil pengekstrakan yang keyakinannya 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 resultsMenggunakan Unstructured untuk Sebarang Format
Pustaka unstructured ialah alat serba guna untuk memuatkan dokumen yang mengendalikan PDF, Word, Excel, PowerPoint, HTML, e-mel dan banyak lagi melalui API yang seragam. Pustaka ini menggunakan heuristik untuk mengenal pasti elemen dokumen (tajuk, teks naratif, jadual, pengepala) dan mengembalikannya sebagai objek berstruktur. Ini amat berguna apabila korpus anda mengandungi jenis dokumen bercampur dan anda mahukan metadata pada peringkat elemen tanpa menulis penghurai khusus 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 Selepas Pengekstrakan
Teks mentah yang diekstrak jarang sekali bersih. Pengekstrakan PDF sering menghasilkan pemutusan baris bersempang daripada susun atur lajur, ruang kosong tambahan, pengepala halaman yang diulang pada setiap halaman dan aksara khas yang rosak. Gunakan saluran paip pembersihan: buang ruang kosong berlebihan, cantumkan semula perkataan bersempang merentasi pemutusan baris, buang pengepala dan pengaki halaman yang dikenal pasti melalui padanan corak, serta normalkan aksara Unicode. Teks yang bersih menghasilkan koheren ketulan 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()Memuatkan daripada Pangkalan Data dan API
Tidak semua pengetahuan berada dalam fail. Pangkalan data dalaman, sistem CRM, alat pengurusan tiket dan API REST juga merupakan sumber. Muatkan baris pangkalan data berstruktur dengan mencantumkan jadual yang berkaitan dan menggabungkan nilai medan menjadi perenggan bahasa semula jadi yang boleh difahami oleh model pembenaman. Bagi API, dapatkan hasil berhalaman dan siri setiap rekod 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 docsMenjejaki Asal Usul Dokumen
Setiap dokumen yang dimuatkan hendaklah membawa metadata asal usul sepanjang saluran paip: URL sumber atau laluan fail, tajuk dokumen, pengarang, tarikh penciptaan dan tarikh pengubahsuaian terakhir. Metadata ini bergerak bersama setiap ketulan ke dalam stor vektor dan muncul dalam petikan LLM. Tanpa asal usul, anda tidak dapat memberitahu pengguna dari mana jawapan datang, tidak dapat mengemas kini dokumen tertentu dalam indeks dan tidak dapat menapis 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 pagesMemuatkan Kumpulan Koleksi Dokumen Besar
Apabila mengindeks ribuan dokumen, muatkannya secara selari menggunakan concurrent.futures untuk memaksimumkan penggunaan sumber I/O dan CPU. Laksanakan penjejak kemajuan dan log ralat supaya kegagalan pemuatan dokumen tidak menggugurkan kandungan daripada indeks anda secara senyap. Jangan biarkan satu fail rosak menyebabkan keseluruhan tugas pemuatan terhenti — tangkap pengecualian bagi setiap dokumen dan teruskan ke dokumen seterusnya.
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, errorsMengesahkan Kualiti Kandungan yang Dimuatkan
Selepas memuatkan kandungan, sahkan bahawa anda telah mengekstrak kandungan yang bermakna. Semak: panjang teks minimum (langkau ketulan yang mempunyai kurang daripada 50 aksara), pengesanan bahasa (jika RAG anda hanya untuk bahasa Inggeris, tapis halaman bukan bahasa Inggeris) dan pengesanan teks rosak (nisbah aksara bukan ASCII yang tinggi mungkin menunjukkan kegagalan OCR atau masalah pengekodan). Catat statistik seperti bilangan halaman yang dimuatkan, panjang halaman purata dan kadar ralat untuk mengesan masalah pemuatan lebih 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 validSemakan Pantas
Uji pemahaman anda tentang konsep Kejuruteraan AI daripada 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 yang diimbas dengan OCR, pustaka unstructured sebagai pemuat pelbagai format yang seragam, serta amalan terbaik untuk persekitaran produksi termasuk pembersihan teks, metadata asal usul, pemuatan kelompok secara selari dan pengesahan kandungan. Seterusnya kita akan membincangkan strategi pemecahan yang menentukan cara teks yang diambil dipetakan kepada konteks model.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Pemuatan Dokumen dan Pengekstrakan Teks” percuma?
Ya — teks penuh “Pemuatan Dokumen dan Pengekstrakan Teks” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus AI Engineering Academy, tingkat taraf kepada CoddyKit PRO. Kursus AI Engineering Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pemuatan Dokumen dan Pengekstrakan Teks”?
Muatkan PDF, dokumen Word dan fail teks biasa menggunakan pustaka Python, bersihkan teks yang diekstrak, dan sediakannya untuk pemecahan serta pembenaman. Anda berlatih AI Engineering Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan AI Engineering Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran AI Engineering Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Pemuatan Dokumen dan Pengekstrakan Teks” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pemuatan Dokumen dan Pengekstrakan Teks
- Strategi Pemecahan: Tetap berbanding Ayat berbanding Rekursif
- Pengindeksan: Membenamkan dan Menyimpan Bahagian
- Membuat Pertanyaan, Mendapatkan dan Menjana