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.
# 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.
# 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