Tugas 2 : Membuat VSM dengan isi TF-IDF#
Pada Tugas 2 diminta untuk membuat sebuah tabel dengan bentuk VSM (Vector Space Model) yang berisi TF-IDF (Term Frequency - Inverse Document Frequency). Dengan begitu hasil tabel hanya akan berisi angka TF-IDF dari kata unik yang bermunculan dari semua dokumen.
Dibuat Oleh:
Nama : Sabil Ahmad Hidayat
NIM : 220411100058
Kelas : PPW A
Link Code : https://colab.research.google.com/drive/1iDKPIIzDcMN_-u0IY5GfgYY64HoAd2oQ?usp=sharing
Link Github : meinhere/ppw
Vector Space Model (VSM)#
Vector Space Model (VSM) adalah metode natural yang bergantung pada vektor dari setiap kata dalam dimensi spasial tertentu. Pada VSM, sebuah kata diwakili dengan dimensi dari ruang vektor. Dokumen dilihat sebagai vektor dengan magnitude (jarak) dan direction (arah). Kompatibilitas vektor dokumen dan kueri menentukan relevansinya dengan kueri.
VSM memungkinkan sebuah kerangka pencocokan parsial. Ini dicapai melalui penerapan bobot non-biner pada istilah indeks dalam dokumen dan kueri. Bobot istilah yang akhirnya digunakan untuk mengevaluasi tingkat kesamaan antara permintaan pengguna dan setiap dokumen yang tersimpan dalam sistem. Model vektor mempertimbangkan dokumen yang relevan dengan permintaan pengguna dan menyortir dokumen yang diambil dalam urutan yang memiliki kemiripan. Hasilnya, kumpulan dokumen yang dikumpulkan jauh lebih akurat. Vektor t-dimensi menunjukkan dokumen dj dan query q.
Misalnya kita memiliki sebuah dokumen D dalam ruang vektor VS. Jumlah dimensi atau kolom untuk setiap dokumen akan menjadi jumlah total istilah atau kata yang berbeda untuk semua dokumen dalam ruang vektor.
\begin{align} VS={W_1,W_2,…,W_n} \end{align}
Dimana terdapat n kata yang berbeda di semua dokumen. Contoh representasi setiap dokumen D
\begin{align} D={w_1,w_2,…,w_n} \end{align}
Di dalam wn, menunjukkan bobot untuk kata n dalam dokumen D. nilai dari wn dapat berupa:
frekuensi kata tersebut dalam dokumen (term frequency),
weight embedding
bobot TF-IDF
Term Frequency - Inverse Document Frequency (TF-IDF)#
Term Frequency#
Term Frequency merupakan banyaknya kemunculan kata pada dokumen.
Inverse Document Frequency#
IDF berfungsi mengurangi bobot suatu term jika kemunculannya banyak tersebar diseluruh dokumen, dituliskan dalam bentuk,
\begin{align} idf(w,D)=1+log\frac{N}{1+df(w)} \end{align}
df(w): banyaknya dokumen yang mengandung kata tersebut
N: jumlah dokumen
Term Frequency - Inverse Document Frequency#
\begin{align} tfidf=tf \times idf \end{align}
Proses Pembentukan data ke bentuk VSM (Vector Space Model)#
Persiapan Library#
!pip install -q Sastrawi
^C
# library awal untuk perhitungan dan pengolahan teks
import numpy as np
import re
import pandas as pd
import pickle
# monitoring
from tqdm import tqdm
# library untuk praproses teks
import nltk
nltk.download('stopwords')
nltk.download('wordnet')
nltk.download('punkt')
from nltk.corpus import stopwords
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
from sklearn.model_selection import train_test_split
# library untuk proses pembentukan vsm
from sklearn.feature_extraction.text import TfidfVectorizer
[nltk_data] Downloading package stopwords to /root/nltk_data...
[nltk_data] Unzipping corpora/stopwords.zip.
[nltk_data] Downloading package wordnet to /root/nltk_data...
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data] Unzipping tokenizers/punkt.zip.
Dikarenakan pada praproses teks akan melakukan stemming, maka perlu dilakukan install library Sastrawi terlebih dahulu untuk melakukan stemming bahasa indonesia.
numpy digunakan untuk pengolahan angka dan perhitungan matematik
re (regular expression) digunakan untuk mengenali pola kata/kalimat
nltk (natural language toolkit) berfungsi untuk melakukan proses yang berkaitan dengan bahasa (teks).
sklearn digunakan dalam pemrosesan data untuk kebutuhan machine learning atau data science. Dalam tugas ini, menggunakan TfidfVectorizer untuk menghitung Term Frequency dan Inverse Document
Load Data#
main_df = pd.read_csv('https://raw.githubusercontent.com/meinhere/ppw/master/publish/tugas-2/dataset/data_berita.csv', delimiter=',')
main_df
| No | Judul Berita | Isi Berita | Tanggal Berita | Kategori Berita | |
|---|---|---|---|---|---|
| 0 | 1 | Simak Jadwal dan Lokasi SIM Keliling di Jakart... | JAKARTA, KOMPAS.com - Surat Izin Mengemudi (S... | 07/09/2024 | OTOMOTIF |
| 1 | 2 | [POPULER OTOMOTIF] Diskon Motor Honda Septembe... | JAKARTA, KOMPAS.com - Banyak pembaca yang ingi... | 07/09/2024 | OTOMOTIF |
| 2 | 3 | Cek Saldo Minimal BRI, BNI, BCA, Mandiri, dan BSI | JAKARTA, KOMPAS.com - Penting bagi calon nasab... | 06/09/2024 | MONEY |
| 3 | 4 | KAI Uji Coba Teknologi "Face Recognition Board... | KOMPAS.com - PT Kereta Api Indonesia (KAI) Div... | 06/09/2024 | MONEY |
| 4 | 5 | OJK Blokir 10.890 Entitas Keuangan Ilegal Seja... | JAKARTA, KOMPAS.com - Otoritas Jasa Keuangan (... | 06/09/2024 | MONEY |
| ... | ... | ... | ... | ... | ... |
| 95 | 96 | Waspada Masalah yang Timbul akibat Telat Ganti... | JAKARTA, KOMPAS.com - Oli mesin pada mobil den... | 06/09/2024 | OTOMOTIF |
| 96 | 97 | Sosok Faisal Basri di Mata Para Tokoh, Ekonom ... | JAKARTA, KOMPAS.com - Ekonom senior Faisal Bas... | 06/09/2024 | MONEY |
| 97 | 98 | Pendaftaran CPNS Diperpanjang 4 Hari, Pelamar ... | JAKARTA, KOMPAS.com - Pemerintah telah memperp... | 06/09/2024 | MONEY |
| 98 | 99 | Harga Emas Terbaru Pegadaian, Jumat 6 Septembe... | JAKARTA, KOMPAS.com - Pegadaian menyediakan be... | 06/09/2024 | MONEY |
| 99 | 100 | Harga Emas Antam Terbaru Jumat 6 September 202... | JAKARTA, KOMPAS.com - Pada Jumat 6 September 2... | 06/09/2024 | MONEY |
100 rows × 5 columns
Praproses Teks#
Membuat Fungsi#
# Case Folding
def clean_lower(lwr):
lwr = lwr.lower() # lowercase text
return lwr
# Menghapus tanda baca, angka, dan simbol
def clean_punct(text):
clean_spcl = re.compile('[/(){}\[\]\|@,;_]')
clean_symbol = re.compile('[^0-9a-z]')
clean_number = re.compile('[0-9]')
text = clean_spcl.sub('', text)
text = clean_symbol.sub(' ', text)
text = clean_number.sub('', text)
return text
# Menghaps double atau lebih whitespace
def _normalize_whitespace(text):
corrected = str(text)
corrected = re.sub(r"//t",r"\t", corrected)
corrected = re.sub(r"( )\1+",r"\1", corrected)
corrected = re.sub(r"(\n)\1+",r"\1", corrected)
corrected = re.sub(r"(\r)\1+",r"\1", corrected)
corrected = re.sub(r"(\t)\1+",r"\1", corrected)
return corrected.strip(" ")
# Menghapus stopwords
def clean_stopwords(text):
stopword = set(stopwords.words('indonesian'))
text = ' '.join(word for word in text.split() if word not in stopword) # hapus stopword dari kolom deskripsi
return text
# Stemming with Sastrawi
def sastrawistemmer(text):
factory = StemmerFactory()
st = factory.create_stemmer()
text = ' '.join(st.stem(word) for word in tqdm(text.split()) if word in text)
return text
function clean_lower digunakan untuk merubah semua kata atau huruf menjadi huruf kecil semua
function clean_punct digunakan untuk menghapus karakter, simbol, dan angka
function _normalize_whitespace digunakan untuk menghapus spasi yang double atau lebih dari 2 spasi
function clean_stopwords digunakan untuk menghilangkan kata yang tidak perlu (kata hubung, kata tambahan dll)
function sastrawistemmer digunakan untuk proses stemming (mendapatkan kata dasar dari suatu kata)
Clean Lower#
# Buat kolom tambahan untuk data description yang telah dilakukan proses case folding
main_df['lwr'] = main_df['Isi Berita'].apply(clean_lower)
casefolding=pd.DataFrame(main_df['lwr'])
casefolding
| lwr | |
|---|---|
| 0 | jakarta, kompas.com - surat izin mengemudi (s... |
| 1 | jakarta, kompas.com - banyak pembaca yang ingi... |
| 2 | jakarta, kompas.com - penting bagi calon nasab... |
| 3 | kompas.com - pt kereta api indonesia (kai) div... |
| 4 | jakarta, kompas.com - otoritas jasa keuangan (... |
| ... | ... |
| 95 | jakarta, kompas.com - oli mesin pada mobil den... |
| 96 | jakarta, kompas.com - ekonom senior faisal bas... |
| 97 | jakarta, kompas.com - pemerintah telah memperp... |
| 98 | jakarta, kompas.com - pegadaian menyediakan be... |
| 99 | jakarta, kompas.com - pada jumat 6 september 2... |
100 rows × 1 columns
Clean Punct#
# Buat kolom tambahan untuk data description yang telah dilakukan proses penghapusan tanda baca
main_df['clean_punct'] = main_df['lwr'].apply(clean_punct)
main_df['clean_punct']
| clean_punct | |
|---|---|
| 0 | jakarta kompas com surat izin mengemudi sim... |
| 1 | jakarta kompas com banyak pembaca yang ingin... |
| 2 | jakarta kompas com penting bagi calon nasaba... |
| 3 | kompas com pt kereta api indonesia kai divre... |
| 4 | jakarta kompas com otoritas jasa keuangan oj... |
| ... | ... |
| 95 | jakarta kompas com oli mesin pada mobil deng... |
| 96 | jakarta kompas com ekonom senior faisal basr... |
| 97 | jakarta kompas com pemerintah telah memperpa... |
| 98 | jakarta kompas com pegadaian menyediakan ber... |
| 99 | jakarta kompas com pada jumat september ha... |
100 rows × 1 columns
Normalize Whitespace#
main_df['clean_double_ws'] = main_df['clean_punct'].apply(_normalize_whitespace)
main_df['clean_double_ws']
| clean_double_ws | |
|---|---|
| 0 | jakarta kompas com surat izin mengemudi sim wa... |
| 1 | jakarta kompas com banyak pembaca yang ingin t... |
| 2 | jakarta kompas com penting bagi calon nasabah ... |
| 3 | kompas com pt kereta api indonesia kai divre i... |
| 4 | jakarta kompas com otoritas jasa keuangan ojk ... |
| ... | ... |
| 95 | jakarta kompas com oli mesin pada mobil dengan... |
| 96 | jakarta kompas com ekonom senior faisal basri ... |
| 97 | jakarta kompas com pemerintah telah memperpanj... |
| 98 | jakarta kompas com pegadaian menyediakan berba... |
| 99 | jakarta kompas com pada jumat september harga ... |
100 rows × 1 columns
Clean Stopwords#
# Buat kolom tambahan untuk data description yang telah dilakukan proses penghapusan stopwords
main_df['clean_sw'] = main_df['clean_double_ws'].apply(clean_stopwords)
main_df['clean_sw']
| clean_sw | |
|---|---|
| 0 | jakarta kompas com surat izin mengemudi sim wa... |
| 1 | jakarta kompas com pembaca diskon motor honda ... |
| 2 | jakarta kompas com calon nasabah saldo minimal... |
| 3 | kompas com pt kereta api indonesia kai divre i... |
| 4 | jakarta kompas com otoritas jasa keuangan ojk ... |
| ... | ... |
| 95 | jakarta kompas com oli mesin mobil transmisi c... |
| 96 | jakarta kompas com ekonom senior faisal basri ... |
| 97 | jakarta kompas com pemerintah memperpanjang pe... |
| 98 | jakarta kompas com pegadaian menyediakan jenis... |
| 99 | jakarta kompas com jumat september harga emas ... |
100 rows × 1 columns
Stemming dengan Sastrawi#
# Buat kolom tambahan untuk data description yang telah dilemmatization
main_df['desc_clean_stem'] = main_df['clean_sw'].apply(sastrawistemmer)
main_df['desc_clean_stem']
100%|██████████| 188/188 [00:07<00:00, 26.52it/s]
100%|██████████| 294/294 [00:19<00:00, 14.89it/s]
100%|██████████| 174/174 [00:05<00:00, 31.46it/s]
100%|██████████| 192/192 [00:05<00:00, 36.52it/s]
100%|██████████| 189/189 [00:05<00:00, 36.61it/s]
100%|██████████| 147/147 [00:06<00:00, 23.90it/s]
100%|██████████| 170/170 [00:03<00:00, 44.34it/s]
100%|██████████| 242/242 [00:09<00:00, 26.31it/s]
100%|██████████| 155/155 [00:02<00:00, 73.89it/s]
100%|██████████| 319/319 [00:09<00:00, 33.50it/s]
100%|██████████| 123/123 [00:02<00:00, 42.65it/s]
100%|██████████| 170/170 [00:03<00:00, 54.29it/s]
100%|██████████| 192/192 [00:09<00:00, 19.90it/s]
100%|██████████| 162/162 [00:05<00:00, 28.52it/s]
100%|██████████| 119/119 [00:03<00:00, 30.05it/s]
100%|██████████| 219/219 [00:05<00:00, 41.80it/s]
100%|██████████| 174/174 [00:04<00:00, 35.44it/s]
100%|██████████| 147/147 [00:07<00:00, 19.99it/s]
100%|██████████| 197/197 [00:04<00:00, 41.06it/s]
100%|██████████| 311/311 [00:11<00:00, 26.19it/s]
100%|██████████| 167/167 [00:04<00:00, 41.66it/s]
100%|██████████| 194/194 [00:10<00:00, 18.55it/s]
100%|██████████| 151/151 [00:04<00:00, 32.96it/s]
100%|██████████| 138/138 [00:03<00:00, 38.86it/s]
100%|██████████| 254/254 [00:10<00:00, 23.47it/s]
100%|██████████| 146/146 [00:03<00:00, 47.24it/s]
100%|██████████| 167/167 [00:04<00:00, 39.42it/s]
100%|██████████| 253/253 [00:05<00:00, 48.60it/s]
100%|██████████| 167/167 [00:05<00:00, 33.07it/s]
100%|██████████| 237/237 [00:04<00:00, 55.98it/s]
100%|██████████| 238/238 [00:06<00:00, 37.53it/s]
100%|██████████| 267/267 [00:06<00:00, 42.23it/s]
100%|██████████| 165/165 [00:03<00:00, 52.99it/s]
100%|██████████| 182/182 [00:06<00:00, 27.63it/s]
100%|██████████| 194/194 [00:06<00:00, 30.85it/s]
100%|██████████| 152/152 [00:06<00:00, 25.15it/s]
100%|██████████| 200/200 [00:06<00:00, 28.63it/s]
100%|██████████| 157/157 [00:05<00:00, 29.03it/s]
100%|██████████| 186/186 [00:04<00:00, 37.57it/s]
100%|██████████| 282/282 [00:06<00:00, 43.99it/s]
100%|██████████| 149/149 [00:03<00:00, 38.79it/s]
100%|██████████| 332/332 [00:16<00:00, 20.17it/s]
100%|██████████| 120/120 [00:06<00:00, 18.90it/s]
100%|██████████| 178/178 [00:04<00:00, 42.65it/s]
100%|██████████| 153/153 [00:03<00:00, 38.43it/s]
100%|██████████| 228/228 [00:07<00:00, 31.79it/s]
100%|██████████| 197/197 [00:08<00:00, 23.21it/s]
100%|██████████| 197/197 [00:08<00:00, 22.04it/s]
100%|██████████| 163/163 [00:03<00:00, 40.87it/s]
100%|██████████| 176/176 [00:07<00:00, 25.00it/s]
100%|██████████| 144/144 [00:04<00:00, 33.24it/s]
100%|██████████| 165/165 [00:06<00:00, 23.71it/s]
100%|██████████| 169/169 [00:02<00:00, 67.08it/s]
100%|██████████| 185/185 [00:08<00:00, 20.92it/s]
100%|██████████| 310/310 [00:05<00:00, 54.19it/s]
100%|██████████| 158/158 [00:04<00:00, 35.81it/s]
100%|██████████| 162/162 [00:05<00:00, 31.23it/s]
100%|██████████| 249/249 [00:06<00:00, 36.81it/s]
100%|██████████| 128/128 [00:04<00:00, 26.09it/s]
100%|██████████| 112/112 [00:04<00:00, 24.03it/s]
100%|██████████| 220/220 [00:09<00:00, 24.35it/s]
100%|██████████| 221/221 [00:04<00:00, 45.11it/s]
100%|██████████| 117/117 [00:04<00:00, 25.93it/s]
100%|██████████| 177/177 [00:06<00:00, 25.38it/s]
100%|██████████| 218/218 [00:06<00:00, 32.14it/s]
100%|██████████| 252/252 [00:04<00:00, 58.57it/s]
100%|██████████| 152/152 [00:04<00:00, 30.48it/s]
100%|██████████| 157/157 [00:05<00:00, 29.39it/s]
100%|██████████| 196/196 [00:04<00:00, 39.43it/s]
100%|██████████| 179/179 [00:07<00:00, 24.04it/s]
100%|██████████| 150/150 [00:03<00:00, 48.69it/s]
100%|██████████| 152/152 [00:03<00:00, 39.08it/s]
100%|██████████| 193/193 [00:03<00:00, 56.10it/s]
100%|██████████| 206/206 [00:09<00:00, 20.63it/s]
100%|██████████| 175/175 [00:05<00:00, 29.33it/s]
100%|██████████| 214/214 [00:05<00:00, 40.18it/s]
100%|██████████| 142/142 [00:05<00:00, 28.14it/s]
100%|██████████| 175/175 [00:09<00:00, 18.11it/s]
100%|██████████| 154/154 [00:05<00:00, 27.27it/s]
100%|██████████| 163/163 [00:05<00:00, 29.65it/s]
100%|██████████| 164/164 [00:13<00:00, 12.47it/s]
100%|██████████| 177/177 [00:07<00:00, 23.40it/s]
100%|██████████| 178/178 [00:07<00:00, 22.54it/s]
100%|██████████| 307/307 [00:07<00:00, 38.86it/s]
100%|██████████| 213/213 [00:07<00:00, 28.59it/s]
100%|██████████| 223/223 [00:06<00:00, 33.11it/s]
100%|██████████| 259/259 [00:07<00:00, 36.16it/s]
100%|██████████| 135/135 [00:02<00:00, 52.98it/s]
100%|██████████| 142/142 [00:06<00:00, 21.52it/s]
100%|██████████| 154/154 [00:06<00:00, 24.07it/s]
100%|██████████| 206/206 [00:05<00:00, 35.31it/s]
100%|██████████| 166/166 [00:04<00:00, 39.58it/s]
100%|██████████| 186/186 [00:04<00:00, 41.82it/s]
100%|██████████| 282/282 [00:10<00:00, 26.38it/s]
100%|██████████| 148/148 [00:04<00:00, 30.57it/s]
100%|██████████| 138/138 [00:05<00:00, 27.08it/s]
100%|██████████| 231/231 [00:05<00:00, 43.53it/s]
100%|██████████| 176/176 [00:05<00:00, 34.55it/s]
100%|██████████| 35/35 [00:01<00:00, 32.73it/s]
100%|██████████| 103/103 [00:02<00:00, 42.34it/s]
| desc_clean_stem | |
|---|---|
| 0 | jakarta kompas com surat izin kemudi sim wajib... |
| 1 | jakarta kompas com baca diskon motor honda sep... |
| 2 | jakarta kompas com calon nasabah saldo minimal... |
| 3 | kompas com pt kereta api indonesia kai divre i... |
| 4 | jakarta kompas com otoritas jasa uang ojk blok... |
| ... | ... |
| 95 | jakarta kompas com oli mesin mobil transmisi c... |
| 96 | jakarta kompas com ekonom senior faisal basri ... |
| 97 | jakarta kompas com perintah panjang daftar sel... |
| 98 | jakarta kompas com gadai sedia jenis emas bata... |
| 99 | jakarta kompas com jumat september harga emas ... |
100 rows × 1 columns
Save Data Praproses#
main_df.to_csv("data_berita_praproses.csv", index=False)
Split Data Train dan Test#
# Load data berita praproses
data_berita_praproses = pd.read_csv('https://raw.githubusercontent.com/meinhere/ppw/master/publish/tugas-2/dataset/data_berita_praproses.csv')
# membuat kolom 'desc_clean_stem' menjadi fitur
# dan kolom 'Kategori Berita' menjadi target
X = data_berita_praproses['desc_clean_stem']
y = data_berita_praproses['Kategori Berita']
# membagi data menjadi train 80% dan test 20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# membuat dataframe
train_df = pd.DataFrame({'desc_clean_stem': X_train, 'label': y_train})
test_df = pd.DataFrame({'desc_clean_stem': X_test, 'label': y_test})
# menampilkan dataframe
train_df
| desc_clean_stem | label | |
|---|---|---|
| 55 | jakarta kompas com wakil presiden wapres ma ru... | MONEY |
| 88 | jakarta kompas com pt layar nasional indonesia... | MONEY |
| 26 | jakarta kompas com kuota subsidi sepeda motor ... | OTOMOTIF |
| 42 | jakarta kompas com milik honda vario ganti tin... | OTOMOTIF |
| 69 | jakarta kompas com pt hutama karya persero tut... | OTOMOTIF |
| ... | ... | ... |
| 60 | jakarta kompas com pt toyota astra motor tam r... | OTOMOTIF |
| 71 | jakarta kompas com gac aion umum unit mobil ai... | OTOMOTIF |
| 14 | jakarta kompas com viral media sosial fenomena... | OTOMOTIF |
| 92 | klaten kompas com kendala mesin mobil muncul o... | OTOMOTIF |
| 51 | jakarta kompas com kendara ugal ugalan bahaya ... | OTOMOTIF |
80 rows × 2 columns
Save Data Train dan Test#
train_df.to_csv("train_df.csv", index=False)
test_df.to_csv("test_df.csv", index=False)
Pembentukan Vector Space Model#
Fitting kata untuk mendapatkan Term Frequency-Inverse Document Frequency pada semua Dokumen#
vectorizer = TfidfVectorizer()
corpus = train_df['desc_clean_stem'].tolist()
tfidf = vectorizer.fit_transform(corpus)
print("Shape:", tfidf.shape)
Shape: (80, 3106)
Saving Pipeline#
# Save the vectorizer to a file
filename = 'tfidf_vectorizer.sav'
pickle.dump(vectorizer, open(filename, 'wb'))
Pembuatan DataFrame#
vocabulary = vectorizer.get_feature_names_out().tolist()
tfidf_df = pd.DataFrame(tfidf.toarray(), columns=vocabulary)
tfidf_df['label'] = train_df['label'].tolist()
tfidf_df
| aaion | aali | abadi | abai | abenkh | abnormal | absurd | ac | acara | access | ... | yzr | za | zad | zaman | zarco | zenix | zero | zigzag | zona | label | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.058149 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | MONEY |
| 1 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | MONEY |
| 2 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| 3 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| 4 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 75 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| 76 | 0.053854 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.037974 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| 77 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| 78 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.121219 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.0 | OTOMOTIF |
| 79 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.000000 | 0.000000 | 0.0 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.059581 | 0.0 | OTOMOTIF |
80 rows × 3107 columns
Simpan ke dalam CSV#
tfidf_df.to_csv('train_df_tfidf.csv', index=False)