Files
2026-11-02 01:41:24 -05:00

128 lines
3.7 KiB
Python

import random
from pathlib import Path
# FUNGSI MEMBACA PDF
def baca_pdf(path):
reader = PdfReader(path)
return "\n".join(
(p.extract_text() or "")
for p in reader.pages
)
# FUNGSI MEMOTONG TEKS (CHUNKING)
def potong(teks, ukuran=800, tumpang=100):
hasil = []
mulai = 0
while mulai < len(teks):
hasil.append(teks[mulai:mulai + ukuran])
mulai += ukuran - tumpang
return [h for h in hasil if h.strip()]
# MENCARI PDF DI FOLDER DOKUMEN
daftar_pdf = list(Path("dokumen").glob("*.pdf"))
if not daftar_pdf:
print("❌ Tidak ada file PDF di folder 'dokumen'! Pastikan Anda membuat folder bernama 'dokumen' dan memasukkan file PDF terkait KAI di dalamnya.")
else:
# Mengambil PDF pertama
pdf = daftar_pdf[0]
# Membaca isi PDF
teks = baca_pdf(pdf)
print(f"\n📄 Nama PDF: {pdf.name}")
print(f"📊 Total karakter: {len(teks)}")
# Menampilkan 500 karakter pertama
print("\n===== 500 KARAKTER PERTAMA =====")
print(teks[:500])
# Eksperimen tiga ukuran chunk
for ukuran in (500, 1000, 1500):
overlap = int(ukuran * 0.1)
chunks = potong(
teks,
ukuran=ukuran,
tumpang=overlap
)
print("\n" + "=" * 50)
print(f"UKURAN CHUNK: {ukuran}")
print(f"OVERLAP: {overlap}")
print(f"JUMLAH CHUNK: {len(chunks)}")
# Mengambil maksimal 3 chunk secara acak
sampel = random.sample(
range(len(chunks)),
min(3, len(chunks))
)
for nomor in sampel:
print(f"\n--- CHUNK {nomor} ---")
print(chunks[nomor])
# LAB 2: EMBEDDING DAN CHROMADB
if daftar_pdf:
# Model embedding multilingual
emb = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="paraphrase-multilingual-MiniLM-L12-v2"
)
# Membuat database lokal
client = chromadb.PersistentClient(path="./chroma_db")
def bangun_indeks(nama_koleksi, ukuran):
# Menghapus koleksi lama agar tidak tercampur
try:
client.delete_collection(name=nama_koleksi)
except Exception:
pass
# Membuat koleksi baru
koleksi = client.create_collection(
name=nama_koleksi,
embedding_function=emb,
metadata={"hnsw:space": "cosine"}
)
for pdf in daftar_pdf:
teks = baca_pdf(pdf)
overlap = int(ukuran * 0.1)
chunks = potong(
teks,
ukuran=ukuran,
tumpang=overlap
)
if not chunks:
print(pdf.name, "tidak memiliki teks.")
continue
koleksi.upsert(
ids=[
f"{pdf.stem}-{ukuran}-{i}"
for i in range(len(chunks))
],
documents=chunks,
metadatas=[
{
"sumber": pdf.name,
"chunk": i,
"ukuran": ukuran
}
for i in range(len(chunks))
]
)
print(pdf.name, "->", len(chunks), "chunk")
print(f"\n✅ Koleksi '{nama_koleksi}' berhasil dibuat.")
print("Total data dalam koleksi:", koleksi.count())
# Membuat dua koleksi untuk eksperimen
bangun_indeks("pedoman_500", 500)
bangun_indeks("pedoman_1000", 1000)
else:
print("⚠️ Indeks gagal dibuat karena tidak ada file PDF.")