Tugas 4 TF-IDF W2V dan Modelling#
import pandas as pd
# from gensim.models import Word2Vec
from matplotlib import pyplot as plt
import numpy as np
Import Data#
df = pd.read_csv("datasets/df_preprocessing.csv")
df
Isi Berita | lwr_indo | clean_sw_indo | clean_stb_indo | clean_typo_indo | stemming_indo | tokenize_indo | Kategori Berita | |
---|---|---|---|---|---|---|---|---|
0 | KOMPAS.com - Menteri Pemuda dan Olahraga Erick... | kompas.com - menteri pemuda dan olahraga erick... | kompas.com - menteri pemuda olahraga erick tho... | kompas com menteri pemuda olahraga erick tho... | kompas com menteri pemuda olahraga erick thohi... | kompas com menteri pemuda olahraga erick thohi... | ['kompas', 'com', 'menteri', 'pemuda', 'olahra... | BOLA |
1 | KOMPAS.com - Manajer Chelsea, Enzo Maresca men... | kompas.com - manajer chelsea, enzo maresca men... | kompas.com - manajer chelsea, enzo maresca men... | kompas com manajer chelsea enzo maresca meng... | kompas com manajer chelsea enzo maresca mengan... | kompas com manajer chelsea enzo maresca anggap... | ['kompas', 'com', 'manajer', 'chelsea', 'enzo'... | BOLA |
2 | KOMPAS.com - Pelatih Liverpool, Arne Slot, men... | kompas.com - pelatih liverpool, arne slot, men... | kompas.com - pelatih liverpool, arne slot, men... | kompas com pelatih liverpool arne slot menga... | kompas com pelatih liverpool arne slot mengaku... | kompas com latih liverpool arne slot aku cryst... | ['kompas', 'com', 'latih', 'liverpool', 'arne'... | BOLA |
3 | KOMPAS.com - Hasil terbaru pekan kelima Liga I... | kompas.com - hasil terbaru pekan kelima liga i... | kompas.com - hasil terbaru pekan liga italia 2... | kompas com hasil terbaru pekan liga italia ... | kompas com hasil terbaru pekan liga italia per... | kompas com hasil baru pekan liga italia beda n... | ['kompas', 'com', 'hasil', 'baru', 'pekan', 'l... | BOLA |
4 | KOMPAS.com - Menteri Pemuda dan Olahraga Repub... | kompas.com - menteri pemuda dan olahraga repub... | kompas.com - menteri pemuda olahraga republik ... | kompas com menteri pemuda olahraga republik ... | kompas com menteri pemuda olahraga republik in... | kompas com menteri pemuda olahraga republik in... | ['kompas', 'com', 'menteri', 'pemuda', 'olahra... | BOLA |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1195 | KARANGANYAR, KOMPAS.com - Dapur Satuan Pelayan... | karanganyar, kompas.com - dapur satuan pelayan... | karanganyar, kompas.com - dapur satuan pelayan... | karanganyar kompas com dapur satuan pelayana... | karanganyar kompas com dapur satuan pelayanan ... | karanganyar kompas com dapur satu layan penuh ... | ['karanganyar', 'kompas', 'com', 'dapur', 'sat... | REGIONAL |
1196 | BANDUNG, KOMPAS.com -Kepala Stasiun Geofisika ... | bandung, kompas.com -kepala stasiun geofisika ... | bandung, kompas.com -kepala stasiun geofisika ... | bandung kompas com kepala stasiun geofisika b... | bandung kompas com kepala stasiun geofisika bm... | bandung kompas com kepala stasiun geofisika bm... | ['bandung', 'kompas', 'com', 'kepala', 'stasiu... | REGIONAL |
1197 | TEGAL, KOMPAS.com – Maraknya kasus keracunan m... | tegal, kompas.com – maraknya kasus keracunan m... | tegal, kompas.com – maraknya keracunan makanan... | tegal kompas com maraknya keracunan makanan ... | tegal kompas com maraknya keracunan makanan pr... | tegal kompas com marak racun makan program mak... | ['tegal', 'kompas', 'com', 'marak', 'racun', '... | REGIONAL |
1198 | SOLO, KOMPAS.com - Pemerintah Kota (Pemkot) So... | solo, kompas.com - pemerintah kota (pemkot) so... | solo, kompas.com - pemerintah kota (pemkot) so... | solo kompas com pemerintah kota pemkot solo ... | solo kompas com pemerintah kota pemkot solo ja... | solo kompas com perintah kota pemkot solo jawa... | ['solo', 'kompas', 'com', 'perintah', 'kota', ... | REGIONAL |
1199 | SURABAYA, KOMPAS.com - Pemilik perusahaan onde... | surabaya, kompas.com - pemilik perusahaan onde... | surabaya, kompas.com - pemilik perusahaan onde... | surabaya kompas com pemilik perusahaan onder... | surabaya kompas com pemilik perusahaan onderdi... | surabaya kompas com milik usaha onderdil ud se... | ['surabaya', 'kompas', 'com', 'milik', 'usaha'... | REGIONAL |
1200 rows × 8 columns
X_text = df['tokenize_indo']
y = df.iloc[:, -1]
X_text
0 ['kompas', 'com', 'menteri', 'pemuda', 'olahra...
1 ['kompas', 'com', 'manajer', 'chelsea', 'enzo'...
2 ['kompas', 'com', 'latih', 'liverpool', 'arne'...
3 ['kompas', 'com', 'hasil', 'baru', 'pekan', 'l...
4 ['kompas', 'com', 'menteri', 'pemuda', 'olahra...
...
1195 ['karanganyar', 'kompas', 'com', 'dapur', 'sat...
1196 ['bandung', 'kompas', 'com', 'kepala', 'stasiu...
1197 ['tegal', 'kompas', 'com', 'marak', 'racun', '...
1198 ['solo', 'kompas', 'com', 'perintah', 'kota', ...
1199 ['surabaya', 'kompas', 'com', 'milik', 'usaha'...
Name: tokenize_indo, Length: 1200, dtype: object
df['Kategori Berita'].value_counts()
Kategori Berita
BOLA 200
MONEY 200
NEWS 200
OTOMOTIF 200
PROV 200
REGIONAL 200
Name: count, dtype: int64
Word Embedding#
TF-IDF#
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
X_tfidf = vectorizer.fit_transform(X_text)
feature_names = vectorizer.get_feature_names_out()
feature_names
array(['aa', 'aabila', 'aafp', ..., 'zumar', 'zurich', 'zwolle'],
dtype=object)
print(X_tfidf.shape)
(1200, 17877)
# Konversi matriks sparse X ke DataFrame
df_tfidf = pd.DataFrame(X_tfidf.toarray(), columns=feature_names)
# Tampilkan DataFrame (opsional)
df_tfidf
aa | aabila | aafp | aag | aal | aamiin | aan | aaron | aba | abab | ... | zuhri | zulfiahmi | zulfikar | zulhas | zulkarnain | zulkifli | zuly | zumar | zurich | zwolle | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1195 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1196 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1197 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1198 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1199 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1200 rows × 17877 columns
Word2Vec#
from gensim.models import Word2Vec
def create_document_vector(token_list, w2v_model):
# Filter kata yang ada di vocabulary model Word2Vec
word_vectors = [w2v_model.wv[word] for word in token_list if word in w2v_model.wv]
if not word_vectors:
# Jika dokumen kosong atau semua kata tidak ada di model, kembalikan vektor nol
return np.zeros(w2v_model.vector_size)
# Hitung rata-rata vektor kata
return np.mean(word_vectors, axis=0)
Import data No stemming and stop word#
import pandas as pd
df_no_stem = pd.read_csv('datasets/df_preprocessing_no_stemming.csv')
# Hapus spasi di depan workers=4 dan ketik ulang:
model_cbow = Word2Vec(
sentences=df_no_stem['tokenize_indo'],
vector_size=100,
window=5,
min_count=2,
sg=0, # CBOW
workers=4 # Pastikan spasi di sini adalah spasi normal.
)
# Terapkan fungsi ini ke kolom 'tokenize_indo' Anda
df_no_stem['document_vector'] = df_no_stem['tokenize_indo'].apply(lambda x: create_document_vector(x, model_cbow))
X_Word2Vec = np.vstack(df_no_stem['document_vector'].values)
y_no_stem = df_no_stem.iloc[:, -2]
Modelling#
With TFIDF#
import pandas as pd
from sklearn.model_selection import train_test_split
# 3. Lakukan Pembagian Data (Split)
X_train, X_test, y_train, y_test = train_test_split(
X_tfidf, # Matriks TF-IDF (sudah siap)
y, # Label Kategori
test_size=0.2,
random_state=42,
stratify=y # Memastikan proporsi kategori yang seimbang
)
print("Pembagian data selesai:")
print(f"Ukuran X_train: {X_train.shape}")
print(f"Ukuran X_test: {X_test.shape}")
Pembagian data selesai:
Ukuran X_train: (960, 17877)
Ukuran X_test: (240, 17877)
from sklearn.svm import LinearSVC
# 1. Inisialisasi Model SVM
# C=1.0 adalah parameter regularisasi standar. Anda bisa menyempurnakannya nanti.
svm_model = LinearSVC(random_state=42)
# 2. Latih Model
# Gunakan data pelatihan (X_train dan y_train)
svm_model.fit(X_train, y_train)
print("Pelatihan selesai.")
Pelatihan selesai.
# Membuat prediksi pada data pengujian (X_test)
y_pred = svm_model.predict(X_test)
from sklearn.metrics import accuracy_score, classification_report
# 1. Hitung Akurasi Keseluruhan
accuracy = accuracy_score(y_test, y_pred)
print(f"\n--- Hasil Evaluasi ---")
print(f"Akurasi Model: {accuracy*100:.2f}%")
# 2. Tampilkan Laporan Klasifikasi (detail per kategori)
# Classification Report memberikan metrik penting untuk setiap kategori Anda
print("\nLaporan Klasifikasi (Per Kategori):")
print(classification_report(y_test, y_pred))
--- Hasil Evaluasi ---
Akurasi Model: 82.50%
Laporan Klasifikasi (Per Kategori):
precision recall f1-score support
BOLA 0.90 0.90 0.90 40
MONEY 0.84 0.90 0.87 40
NEWS 0.76 0.85 0.80 40
OTOMOTIF 0.88 0.95 0.92 40
PROV 0.77 0.50 0.61 40
REGIONAL 0.79 0.85 0.82 40
accuracy 0.82 240
macro avg 0.82 0.82 0.82 240
weighted avg 0.82 0.82 0.82 240
Random Forest#
from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
# n_estimators adalah jumlah pohon
rf_model.fit(X_train, y_train)
# rf_model.predict(X_test)
RandomForestClassifier(random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
RandomForestClassifier(random_state=42)
# Membuat prediksi pada data pengujian (X_test)
y_pred = rf_model.predict(X_test)
from sklearn.metrics import accuracy_score, classification_report
# 1. Hitung Akurasi Keseluruhan
accuracy = accuracy_score(y_test, y_pred)
print(f"\n--- Hasil Evaluasi ---")
print(f"Akurasi Model: {accuracy*100:.2f}%")
# 2. Tampilkan Laporan Klasifikasi (detail per kategori)
# Classification Report memberikan metrik penting untuk setiap kategori Anda
print("\nLaporan Klasifikasi (Per Kategori):")
print(classification_report(y_test, y_pred))
--- Hasil Evaluasi ---
Akurasi Model: 80.42%
Laporan Klasifikasi (Per Kategori):
precision recall f1-score support
BOLA 0.90 0.90 0.90 40
MONEY 0.81 0.88 0.84 40
NEWS 0.75 0.75 0.75 40
OTOMOTIF 0.88 0.93 0.90 40
PROV 0.74 0.50 0.60 40
REGIONAL 0.73 0.88 0.80 40
accuracy 0.80 240
macro avg 0.80 0.80 0.80 240
weighted avg 0.80 0.80 0.80 240
With Word2Vec#
import pandas as pd
from sklearn.model_selection import train_test_split
# Lanjutkan ke Pembagian Data (Split)
X_train, X_test, y_train, y_test = train_test_split(
X_Word2Vec, # Sudah terdefinisi!
y_no_stem,
test_size=0.2,
random_state=42,
stratify=y_no_stem # Direkomendasikan ganti 'y' menjadi y_no_stem
)
print("Pembagian data selesai:")
print(f"Ukuran X_train: {X_train.shape}")
print(f"Ukuran X_test: {X_test.shape}")
Pembagian data selesai:
Ukuran X_train: (960, 100)
Ukuran X_test: (240, 100)
from sklearn.svm import LinearSVC
# 1. Inisialisasi Model SVM
# C=1.0 adalah parameter regularisasi standar. Anda bisa menyempurnakannya nanti.
svm_model = LinearSVC(random_state=42)
# 2. Latih Model
# Gunakan data pelatihan (X_train dan y_train)
svm_model.fit(X_train, y_train)
print("Pelatihan selesai.")
Pelatihan selesai.
# Membuat prediksi pada data pengujian (X_test)
y_pred = svm_model.predict(X_test)
from sklearn.metrics import accuracy_score, classification_report
# 1. Hitung Akurasi Keseluruhan
accuracy = accuracy_score(y_test, y_pred)
print(f"\n--- Hasil Evaluasi ---")
print(f"Akurasi Model: {accuracy*100:.2f}%")
# 2. Tampilkan Laporan Klasifikasi (detail per kategori)
# Classification Report memberikan metrik penting untuk setiap kategori Anda
print("\nLaporan Klasifikasi (Per Kategori):")
print(classification_report(y_test, y_pred))
--- Hasil Evaluasi ---
Akurasi Model: 42.92%
Laporan Klasifikasi (Per Kategori):
precision recall f1-score support
BOLA 0.49 0.75 0.59 40
MONEY 0.54 0.50 0.52 40
NEWS 0.33 0.20 0.25 40
OTOMOTIF 0.48 0.38 0.42 40
PROV 0.00 0.00 0.00 40
REGIONAL 0.34 0.75 0.47 40
accuracy 0.43 240
macro avg 0.37 0.43 0.38 240
weighted avg 0.37 0.43 0.38 240
c:\Users\willy\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
c:\Users\willy\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
c:\Users\willy\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Random Forest#
from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
# n_estimators adalah jumlah pohon
rf_model.fit(X_train, y_train)
# rf_model.predict(X_test)
RandomForestClassifier(random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
RandomForestClassifier(random_state=42)
# Membuat prediksi pada data pengujian (X_test)
y_pred = rf_model.predict(X_test)
from sklearn.metrics import accuracy_score, classification_report
# 1. Hitung Akurasi Keseluruhan
accuracy = accuracy_score(y_test, y_pred)
print(f"\n--- Hasil Evaluasi ---")
print(f"Akurasi Model: {accuracy*100:.2f}%")
# 2. Tampilkan Laporan Klasifikasi (detail per kategori)
# Classification Report memberikan metrik penting untuk setiap kategori Anda
print("\nLaporan Klasifikasi (Per Kategori):")
print(classification_report(y_test, y_pred))
--- Hasil Evaluasi ---
Akurasi Model: 52.08%
Laporan Klasifikasi (Per Kategori):
precision recall f1-score support
BOLA 0.62 0.72 0.67 40
MONEY 0.62 0.65 0.63 40
NEWS 0.39 0.42 0.40 40
OTOMOTIF 0.62 0.60 0.61 40
PROV 0.35 0.17 0.23 40
REGIONAL 0.46 0.55 0.50 40
accuracy 0.52 240
macro avg 0.51 0.52 0.51 240
weighted avg 0.51 0.52 0.51 240