<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=LLM%3A_Extract_.jsonl_dari_file_pdf</id>
	<title>LLM: Extract .jsonl dari file pdf - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=LLM%3A_Extract_.jsonl_dari_file_pdf"/>
	<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=LLM:_Extract_.jsonl_dari_file_pdf&amp;action=history"/>
	<updated>2026-04-19T22:08:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=LLM:_Extract_.jsonl_dari_file_pdf&amp;diff=72957&amp;oldid=prev</id>
		<title>Unknown user: Created page with &quot;Untuk mengenerate file `.jsonl` dari sebuah referensi buku dalam format PDF, Anda perlu mengekstrak konten dari PDF, memprosesnya menjadi format terstruktur (misalnya, pasanga...&quot;</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=LLM:_Extract_.jsonl_dari_file_pdf&amp;diff=72957&amp;oldid=prev"/>
		<updated>2025-10-04T22:07:30Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Untuk mengenerate file `.jsonl` dari sebuah referensi buku dalam format PDF, Anda perlu mengekstrak konten dari PDF, memprosesnya menjadi format terstruktur (misalnya, pasanga...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Untuk mengenerate file `.jsonl` dari sebuah referensi buku dalam format PDF, Anda perlu mengekstrak konten dari PDF, memprosesnya menjadi format terstruktur (misalnya, pasangan instruction-output atau Q&amp;amp;A), dan menyimpannya sebagai file JSONL. Berikut adalah panduan langkah demi langkah menggunakan Python, dengan asumsi tujuan Anda adalah membuat dataset untuk fine-tuning model seperti Qwen2. Proses ini mencakup ekstraksi teks, preprocessing, dan konversi ke format JSONL.&lt;br /&gt;
&lt;br /&gt;
**Prasyarat:**&lt;br /&gt;
- Python 3.10+ terinstal.&lt;br /&gt;
- Library: `PyPDF2`, `pdfplumber`, atau `pypdf` untuk ekstraksi PDF; `pandas` untuk manipulasi data; `json` untuk format JSONL.&lt;br /&gt;
- File PDF (misalnya, `buku.pdf`).&lt;br /&gt;
- GPU tidak wajib, karena ini adalah preprocessing.&lt;br /&gt;
&lt;br /&gt;
### Langkah-Langkah&lt;br /&gt;
&lt;br /&gt;
#### Step 1: Instalasi Library&lt;br /&gt;
Jalankan perintah berikut di terminal atau Colab untuk menginstal library yang diperlukan:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
pip install pdfplumber pandas&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Catatan:** `pdfplumber` lebih akurat untuk ekstraksi teks dan tabel dibandingkan `PyPDF2`. Gunakan `pypdf` jika PDF kompleks (misalnya, berisi gambar teks).&lt;br /&gt;
&lt;br /&gt;
#### Step 2: Ekstraksi Teks dari PDF&lt;br /&gt;
Gunakan `pdfplumber` untuk mengekstrak teks dari file PDF. Berikut contoh kode untuk mengekstrak semua teks:&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
import pdfplumber&lt;br /&gt;
&lt;br /&gt;
def extract_text_from_pdf(pdf_path):&lt;br /&gt;
    text = &amp;quot;&amp;quot;&lt;br /&gt;
    with pdfplumber.open(pdf_path) as pdf:&lt;br /&gt;
        for page in pdf.pages:&lt;br /&gt;
            text += page.extract_text() or &amp;quot;&amp;quot;&lt;br /&gt;
    return text&lt;br /&gt;
&lt;br /&gt;
# Ganti dengan path file PDF Anda&lt;br /&gt;
pdf_path = &amp;quot;path/to/buku.pdf&amp;quot;&lt;br /&gt;
raw_text = extract_text_from_pdf(pdf_path)&lt;br /&gt;
print(raw_text[:500])  # Cek 500 karakter pertama&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Alternatif (Jika PDF Berbasis Gambar):**&lt;br /&gt;
Jika PDF berisi teks dalam gambar (scanned), gunakan OCR seperti `tesseract`. Instal dulu:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
pip install pytesseract&lt;br /&gt;
sudo apt-get install tesseract-ocr  # Untuk Linux, atau unduh untuk Windows/Mac&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Kode dengan OCR:&lt;br /&gt;
```python&lt;br /&gt;
from pdf2image import convert_from_path&lt;br /&gt;
import pytesseract&lt;br /&gt;
&lt;br /&gt;
def extract_text_with_ocr(pdf_path):&lt;br /&gt;
    images = convert_from_path(pdf_path)&lt;br /&gt;
    text = &amp;quot;&amp;quot;&lt;br /&gt;
    for image in images:&lt;br /&gt;
        text += pytesseract.image_to_string(image, lang=&amp;#039;eng+ind&amp;#039;)  # Tambah &amp;#039;ind&amp;#039; untuk bahasa Indonesia&lt;br /&gt;
    return text&lt;br /&gt;
&lt;br /&gt;
raw_text = extract_text_with_ocr(pdf_path)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Catatan:** Anda perlu `poppler-utils` untuk `pdf2image`. Instal dengan `sudo apt-get install poppler-utils` atau unduh dari Poppler.&lt;br /&gt;
&lt;br /&gt;
#### Step 3: Preprocessing Teks&lt;br /&gt;
Teks dari PDF sering kali berantakan (misalnya, baris baru acak, header/footer). Bersihkan teks dan ubah menjadi format terstruktur (misalnya, instruction-output untuk fine-tuning).&lt;br /&gt;
&lt;br /&gt;
**Contoh:** Misalkan buku PDF berisi bab-bab dengan penjelasan konsep. Anda ingin membuat dataset Q&amp;amp;A seperti:&lt;br /&gt;
```json&lt;br /&gt;
{&amp;quot;instruction&amp;quot;: &amp;quot;Jelaskan konsep X dari buku tersebut.&amp;quot;, &amp;quot;output&amp;quot;: &amp;quot;Konsep X adalah...&amp;quot;}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Kode preprocessing sederhana:&lt;br /&gt;
```python&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
def clean_text(text):&lt;br /&gt;
    # Hapus baris kosong berlebih, nomor halaman, header/footer&lt;br /&gt;
    text = re.sub(r&amp;#039;\n\s*\n&amp;#039;, &amp;#039;\n&amp;#039;, text)  # Ganti baris kosong berulang&lt;br /&gt;
    text = re.sub(r&amp;#039;Page \d+&amp;#039;, &amp;#039;&amp;#039;, text)  # Hapus nomor halaman&lt;br /&gt;
    text = text.strip()&lt;br /&gt;
    return text&lt;br /&gt;
&lt;br /&gt;
cleaned_text = clean_text(raw_text)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Strukturkan Data:**&lt;br /&gt;
Misalnya, Anda ingin membuat Q&amp;amp;A berdasarkan subjudul atau paragraf. Anda bisa melakukannya secara manual atau otomatis. Contoh otomatis dengan asumsi subjudul dipisahkan oleh pola tertentu (misalnya, huruf kapital atau nomor bab):&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
def create_qa_pairs(text):&lt;br /&gt;
    qa_pairs = []&lt;br /&gt;
    # Contoh: Split berdasarkan subjudul (misalnya, &amp;quot;1.1 Judul&amp;quot;)&lt;br /&gt;
    sections = re.split(r&amp;#039;\d+\.\d+\s+[A-Z][a-zA-Z\s]+&amp;#039;, text)&lt;br /&gt;
    headers = re.findall(r&amp;#039;\d+\.\d+\s+[A-Z][a-zA-Z\s]+&amp;#039;, text)&lt;br /&gt;
    &lt;br /&gt;
    for header, content in zip(headers, sections[1:]):  # Skip pertama jika kosong&lt;br /&gt;
        instruction = f&amp;quot;Jelaskan {header.strip()} dari buku tersebut.&amp;quot;&lt;br /&gt;
        output = content.strip()[:500]  # Batasi panjang output&lt;br /&gt;
        qa_pairs.append({&amp;quot;instruction&amp;quot;: instruction, &amp;quot;output&amp;quot;: output})&lt;br /&gt;
    &lt;br /&gt;
    return qa_pairs&lt;br /&gt;
&lt;br /&gt;
qa_pairs = create_qa_pairs(cleaned_text)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Catatan:** Logika splitting di atas sederhana. Jika struktur buku kompleks (misalnya, tabel atau daftar isi), gunakan `pdfplumber` untuk ekstrak tabel atau metadata, lalu sesuaikan logika. Anda mungkin perlu manual curation untuk hasil terbaik.&lt;br /&gt;
&lt;br /&gt;
#### Step 4: Simpan ke File JSONL&lt;br /&gt;
Simpan data terstruktur ke format JSONL (satu JSON object per baris).&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
def save_to_jsonl(qa_pairs, output_path):&lt;br /&gt;
    with open(output_path, &amp;#039;w&amp;#039;, encoding=&amp;#039;utf-8&amp;#039;) as f:&lt;br /&gt;
        for pair in qa_pairs:&lt;br /&gt;
            json.dump(pair, f, ensure_ascii=False)&lt;br /&gt;
            f.write(&amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# Simpan ke file&lt;br /&gt;
output_path = &amp;quot;dataset.jsonl&amp;quot;&lt;br /&gt;
save_to_jsonl(qa_pairs, output_path)&lt;br /&gt;
&lt;br /&gt;
# Cek isi file&lt;br /&gt;
with open(output_path, &amp;#039;r&amp;#039;, encoding=&amp;#039;utf-8&amp;#039;) as f:&lt;br /&gt;
    for i, line in enumerate(f):&lt;br /&gt;
        print(line.strip())&lt;br /&gt;
        if i &amp;gt;= 2:  # Cek 3 baris pertama&lt;br /&gt;
            break&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Contoh Isi `dataset.jsonl`:**&lt;br /&gt;
```json&lt;br /&gt;
{&amp;quot;instruction&amp;quot;: &amp;quot;Jelaskan 1.1 Pengantar Machine Learning dari buku tersebut.&amp;quot;, &amp;quot;output&amp;quot;: &amp;quot;Machine Learning adalah cabang AI yang fokus pada...&amp;quot;}&lt;br /&gt;
{&amp;quot;instruction&amp;quot;: &amp;quot;Jelaskan 1.2 Algoritma Dasar dari buku tersebut.&amp;quot;, &amp;quot;output&amp;quot;: &amp;quot;Algoritma dasar meliputi regresi linier, SVM, dan...&amp;quot;}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
#### Step 5: Verifikasi untuk Fine-Tuning&lt;br /&gt;
Pastikan format JSONL sesuai dengan kebutuhan fine-tuning (misalnya, Alpaca-style untuk Qwen2). Jika model Qwen2 membutuhkan format lain (misalnya, hanya `&amp;quot;text&amp;quot;` dengan template khusus), ubah struktur di Step 3. Contoh untuk format `&amp;quot;text&amp;quot;`:&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
alpaca_prompt = &amp;quot;&amp;quot;&amp;quot;&amp;lt;|im_start|&amp;gt;system&lt;br /&gt;
You are a helpful assistant.&amp;lt;|im_end|&amp;gt;&lt;br /&gt;
&amp;lt;|im_start|&amp;gt;user&lt;br /&gt;
{}&amp;lt;|im_end|&amp;gt;&lt;br /&gt;
&amp;lt;|im_start|&amp;gt;assistant&lt;br /&gt;
{}&amp;lt;|im_end|&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def create_text_format(qa_pairs):&lt;br /&gt;
    texts = []&lt;br /&gt;
    for pair in qa_pairs:&lt;br /&gt;
        text = alpaca_prompt.format(pair[&amp;quot;instruction&amp;quot;], pair[&amp;quot;output&amp;quot;])&lt;br /&gt;
        texts.append({&amp;quot;text&amp;quot;: text})&lt;br /&gt;
    return texts&lt;br /&gt;
&lt;br /&gt;
text_data = create_text_format(qa_pairs)&lt;br /&gt;
save_to_jsonl(text_data, &amp;quot;dataset_text.jsonl&amp;quot;)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
#### Step 6: Validasi untuk Ollama&lt;br /&gt;
Setelah fine-tuning (sesuai panduan sebelumnya), pastikan dataset JSONL:&lt;br /&gt;
- Tidak ada baris kosong atau JSON rusak.&lt;br /&gt;
- Teks dalam bahasa yang konsisten (misalnya, Indonesia jika model di-fine-tune untuk bahasa Indonesia).&lt;br /&gt;
- Panjang sequence sesuai (misalnya, &amp;lt;2048 token untuk Qwen2-1.5B).&lt;br /&gt;
&lt;br /&gt;
Gunakan `datasets` untuk validasi:&lt;br /&gt;
```python&lt;br /&gt;
from datasets import load_dataset&lt;br /&gt;
&lt;br /&gt;
dataset = load_dataset(&amp;quot;json&amp;quot;, data_files={&amp;quot;train&amp;quot;: &amp;quot;dataset.jsonl&amp;quot;}, split=&amp;quot;train&amp;quot;)&lt;br /&gt;
print(dataset[0])  # Cek baris pertama&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
#### Tips Tambahan:&lt;br /&gt;
- **PDF Kompleks:** Jika PDF berisi tabel, gunakan `pdfplumber.extract_table()` untuk ekstrak data tabular dan ubah ke Q&amp;amp;A.&lt;br /&gt;
- **Dataset Kecil:** Jika buku menghasilkan sedikit data, augmentasi dengan pertanyaan tambahan (misalnya, via Grok atau model lain).&lt;br /&gt;
- **Bahasa Indonesia:** Pastikan teks output dalam JSONL sudah bersih dari kesalahan OCR (misalnya, &amp;quot;1&amp;quot; jadi &amp;quot;l&amp;quot;). Gunakan library seperti `spellchecker` untuk koreksi.&lt;br /&gt;
- **Sumber:** Proses ini berdasarkan praktik umum ekstraksi PDF dengan `pdfplumber` dan format JSONL untuk fine-tuning LLM seperti Alpaca.&lt;br /&gt;
&lt;br /&gt;
#### Contoh Workflow End-to-End:&lt;br /&gt;
1. Ekstrak teks dari `buku.pdf` → Dapatkan teks mentah.&lt;br /&gt;
2. Bersihkan teks (hapus header, footer, dll.).&lt;br /&gt;
3. Ubah ke Q&amp;amp;A (misalnya, 100 pasangan dari 10 bab).&lt;br /&gt;
4. Simpan ke `dataset.jsonl`.&lt;br /&gt;
5. Gunakan JSONL untuk fine-tuning Qwen2 (lihat panduan sebelumnya).&lt;br /&gt;
6. Convert ke GGUF dan deploy ke Ollama.&lt;br /&gt;
&lt;br /&gt;
Jika ada error (misalnya, PDF tidak terbaca atau format JSONL salah), beri tahu saya detailnya, termasuk contoh isi PDF atau struktur JSONL yang diinginkan!&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>