import pandas as pd
from [Link] import fetch_20newsgroups
# 1. Mengambil data asli dari library scikit-learn
# Kita pilih kategori '[Link]' dan '[Link]' agar data terlihat "alami"
categories = ['[Link]', '[Link]']
newsgroups_data = fetch_20newsgroups(subset='train',
categories=categories,
remove=('headers', 'footers', 'quotes'))
# 2. Memasukkan ke dalam DataFrame Pandas agar mudah dilihat di Jupyter
df = [Link]({
'text': newsgroups_data.data,
'target': newsgroups_data.target
})
# Menambahkan kolom nama kategori agar mudah dibaca manusia
df['category_name'] = df['target'].apply(lambda x: newsgroups_data.target_names[x])
# 3. Menampilkan data (kita lihat 10 data pertama)
print(f"Total data yang dimuat: {len(df)} dokumen")
display([Link](10))
# Melihat isi teks pada baris pertama secara lengkap
print("=== CONTOH TEKS ASLI (DOKUMEN KE-0) ===")
print(df['text'].iloc[0])
import nltk
from [Link] import stopwords
from [Link] import PorterStemmer
from [Link] import word_tokenize
import re
# Download resources yang diperlukan
[Link]('punkt')
[Link]('stopwords')
# Inisialisasi
stop_words = set([Link]('english'))
stemmer = PorterStemmer()
import nltk
# Download semua paket dasar yang dibutuhkan untuk tokenisasi dan stopwords
[Link]('punkt')
[Link]('punkt_tab') # Tambahkan ini jika menggunakan versi NLTK terbaru
[Link]('stopwords')
print("Download selesai. Silakan jalankan kembali fungsi preprocessing Anda.")
def preprocess_text(text):
# 1. Case Folding & Cleaning (Lexical Analysis dasar)
# Menghapus karakter non-alfabet (angka dan tanda baca)
text = [Link](r'[^a-zA-Z\s]', '', [Link]())
# 2. Tokenization (Memecah kalimat menjadi kata)
tokens = word_tokenize(text)
# 3. Stopword Removal & Stemming (Sesuai teori slide)
# Kita filter kata yang bukan stopword, lalu kita potong ke kata dasar
cleaned_tokens = [[Link](w) for w in tokens if w not in stop_words]
# Menggabungkan kembali menjadi satu string
return " ".join(cleaned_tokens)
# Mari kita coba pada satu contoh data alami tadi
sample_text = df['text'].iloc[0]
processed_sample = preprocess_text(sample_text)
print("=== PERBANDINGAN SEBELUM & SESUDAH PREPROCESSING ===")
print(f"\nTEKS ASLI (100 karakter pertama):\n{sample_text[:100]}...")
print(f"\nTEKS SETELAH PREPROCESSING (Stopwords hilang & Stemming aktif):\
n{processed_sample[:100]}...")
# Proses ini mungkin memakan waktu beberapa detik karena melakukan stemming ke ribuan kata
df['text_cleaned'] = df['text'].apply(preprocess_text)
# Tampilkan hasil dalam tabel Jupyter
display(df[['category_name', 'text', 'text_cleaned']].head())
from sklearn.model_selection import train_test_split
# Membagi data: 80% untuk latihan, 20% untuk ujian
X_train, X_test, y_train, y_test = train_test_split(
df['text_cleaned'],
df['target'],
test_size=0.2,
random_state=42
)
print(f"Jumlah data latihan: {len(X_train)}")
print(f"Jumlah data ujian: {len(X_test)}")
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from [Link] import Pipeline
# Membuat Pipeline: Indexing (TF-IDF) -> Ranking/Classification (Naive Bayes)
model_final = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', MultinomialNB())
])
# Proses Training (Sisi kanan slide: membangun sistem dari collection)
model_final.fit(X_train, y_train)
print("Model telah berhasil dilatih menggunakan Teorema Bayes.")
from [Link] import classification_report, confusion_matrix, accuracy_score
import seaborn as sns
import [Link] as plt
# Memprediksi data ujian
y_pred = model_final.predict(X_test)
# Menampilkan Laporan Evaluasi (Sesuai terminologi slide)
print("=== LAPORAN EVALUASI MODEL ===")
print(classification_report(y_test, y_pred, target_names=categories))
# Menampilkan Akurasi Akhir
acc = accuracy_score(y_test, y_pred)
print(f"Akurasi Keseluruhan: {acc:.2%}")
cm = confusion_matrix(y_test, y_pred)
[Link](figsize=(6,4))
[Link](cm, annot=True, fmt='d', xticklabels=categories, yticklabels=categories, cmap='Blues')
[Link]('Prediksi Model')
[Link]('Kenyataan (Ground Truth)')
[Link]('Confusion Matrix: Medis vs Antariksa')
[Link]()
# 1. Information Need (Keinginan di kepala user)
# User ingin tahu kategori dari sebuah kalimat baru
# 2. Query Construction (Input teks dari user)
query_baru = "the doctor is examining a patient with a stethoscope"
# 3. Jalur Kiri: Parse & Preprocess (Harus sama dengan proses Collection)
query_bersih = preprocess_text(query_baru) # Fungsi yang tadi kita buat
# 4. Rank/Predict (Bertemu di tengah untuk menentukan kategori)
prediksi = model_final.predict([query_bersih])
hasil_kategori = categories[prediksi[0]]
print(f"Query User: '{query_baru}'")
print(f"Hasil Pencocokan (Relevance): Dokumen ini termasuk kategori {hasil_kategori}")