MODUL UTS NLP
K-Nearest Neighbors dan Support Vector Machine
Dosen pengampu: Taslim, [Link], MTA, MCF
Disusun Oleh:
Muhammad Riza Rio Dwijaya (210401177)
PRODI TEKNIK INFORMATIKA
FAKULTAS ILMU KOMPUTER
UNIVERSITAS MUHAMMADIYAH RIAU
2024
Modul
K-Nearest Neighbors dan Logistic Regression
Tahap 1: Data Processing
1. Eksplorasi Data
a. Import library
Impor library adalah proses mengakses fungsi, kelas, atau modul eksternal
yang sudah tersedia di library atau pustaka Python. Dengan impor library,
Anda tidak perlu menulis ulang kode dari awal untuk melakukan tugas Natural
Language Processing (NLP), representasi teks, pemodelan dan evaluasi.
!pip install Sastrawi
Menginstal pustaka Sastrawi, yang digunakan untuk stemming teks bahasa
Indonesia.
from [Link] import drive
Digunakan untuk mengakses Google Drive dari Google Colab. Dengan ini,
Anda bisa memuat dan menyimpan file dari dan ke Google Drive.
import pandas as pd
import [Link] as plt
- pandas: Library untuk manipulasi data, terutama untuk data berbentuk
tabel (DataFrame).
- [Link]: Digunakan untuk menggambar grafik dan visualisasi
data.
import nltk
[Link]('stopwords')
[Link]('punkt')
[Link]('punkt_tab')
- [Link]('stopwords'): Mengunduh daftar kata berhenti
(stopwords) dalam berbagai bahasa, termasuk bahasa Indonesia, yang
sering kali diabaikan dalam analisis teks.
- [Link]('punkt'): Mengunduh alat untuk tokenisasi, yaitu
memecah teks menjadi unit kata atau kalimat.
- [Link]('punkt_tab'): Mengunduh data tambahan untuk tokenisasi
jika diperlukan.
import string
from [Link] import stopwords
from [Link] import word_tokenize
from [Link] import PorterStemmer
- string: Modul Python yang menyediakan berbagai konstanta string, seperti
tanda baca yang digunakan dalam pembersihan data teks.
- stopwords: Digunakan untuk mengakses daftar kata berhenti (stopwords)
dalam NLTK.
- word_tokenize: Digunakan untuk memecah teks menjadi token (kata atau
kalimat).
- PorterStemmer: Algoritma stemming untuk mengubah kata ke bentuk
dasar.
from sklearn.feature_extraction.text import TfidfVectorizer
from [Link] import Word2Vec
- TfidfVectorizer: Digunakan untuk mengubah teks menjadi representasi
numerik menggunakan TF-IDF (Term Frequency-Inverse Document
Frequency). Ini adalah teknik untuk mengukur pentingnya kata dalam
suatu dokumen dalam konteks koleksi dokumen lainnya.
- Word2Vec: Model pembelajaran mendalam yang mengubah kata menjadi
vektor numerik.
import numpy as np
from sklearn.model_selection import train_test_split
- numpy: Digunakan untuk operasi matematika dan manipulasi array.
- train_test_split: Fungsi dari scikit-learn untuk membagi dataset menjadi
data pelatihan dan data uji.
from [Link] import KNeighborsClassifier from
sklearn.linear_model import LogisticRegression
- KNeighborsClassifier: Algoritma k-Nearest Neighbors (k-NN),
digunakan untuk klasifikasi berdasarkan kedekatan data dengan titik data
lainnya.
- LogisticRegression: Model regresi logistik untuk klasifikasi.
import seaborn as sns
import [Link] as plt
from [Link] import confusion_matrix, classification_report,
accuracy_score
- seaborn: Library untuk visualisasi data yang lebih kaya dan menarik.
Digunakan untuk menggambar grafik seperti confusion matrix.
- confusion_matrix: Fungsi untuk menghitung confusion matrix, yang
menunjukkan jumlah prediksi benar dan salah dari suatu model klasifikasi.
- classification_report: Fungsi untuk menghasilkan metrik evaluasi seperti
precision, recall, f1-score untuk setiap kelas.
- accuracy_score: Fungsi untuk menghitung akurasi model, yaitu seberapa
sering model memprediksi label yang benar.
-
b. Menghubungakan ke google drive
Baris inidigunakan dalam Google Colab untuk menghubungkan akun Google
Drive dengan lingkungan Colab. Proses ini memungkinkan pengguna untuk
mengakses file yang tersimpan di Google Drive langsung dari notebook
Colab. Setelah menjalankan perintah tersebut, pengguna akan diminta untuk
mengautentikasi dengan memberikan izin akses. Setelah akses diberikan,
semua file di Google Drive dapat diakses.
from [Link] import drive
[Link]('/content/drive')
2. Distribusi data
- Memuat dataset dari file CSV yang terletak di Google Drive. Path file
harus disesuaikan dengan lokasi dataset Anda. Dataset ini diasumsikan
memiliki kolom author yang digunakan dalam analisis distribusi.
df = pd.read_csv("/content/drive/MyDrive/NLP/[Link]")
- Menghitung jumlah data untuk setiap kategori dalam kolom author. Fungsi
value_counts() mengembalikan jumlah kemunculan setiap nilai unik dalam
kolom tersebut.
df['author'].value_counts()
- Membuat grafik batang (bar chart) menggunakan hasil distribusi data.
Grafik ini diberi warna biru langit (skyblue) dan judul "Distribusi Data".
df['author'].value_counts().plot(kind='bar', color='skyblue',
title="Distribusi Data")
- Memberikan label pada sumbu x sebagai "Kategori".
- Memberikan label pada sumbu y sebagai "Jumlah".
- Menampilkan grafik yang telah dibuat.
[Link]('Kategori')
[Link]('Jumlah')
[Link]()
3. Inisialisasi Alat NLP
- Mendapatkan daftar stop words dalam bahasa Indonesia.
- Membuat objek stemmer untuk melakukan stemming pada kata-kata.
stop_words = set([Link]('indonesian'))
stemmer = PorterStemmer()
4. Kamus Slang ke Formal
Kamus ini digunakan untuk mengganti kata slang yang sering ditemukan
dalam teks ke bentuk formal yang lebih baku. Contoh:
slang_dict = {
"aja": "hanya",
"bakal": "akan",
"begitu": "seperti itu",
"bukan": "tidak",
"cuma": "hanya",
"dia": "orang ketiga tunggal",
"emang": "memang",
"gak": "tidak",
"gitu": "seperti itu",
"gue": "saya",
"kamu": "Anda",
"kayak": "seperti",
"lagi": "sedang",
"nggak": "tidak",
"nih": "ini",
"ntar": "nanti",
"udah": "sudah",
5. Clean text
Clean text adalah proses pembersihan teks yang sangat penting dalam NLP
untuk mengurangi kebisingan (noise) dalam teks. Dengan menghapus elemen-
elemen yang tidak relevan (seperti tanda baca, stop words, dan kata slang),
serta mengubah kata menjadi bentuk dasarnya (stemming), teks menjadi lebih
siap untuk analisis lebih lanjut.
- Mengubah Teks Menjadi Huruf Kecil:
text = [Link]()
Tujuan: Agar teks menjadi seragam dan tidak peka terhadap kapitalisasi
(huruf besar/kecil). Misalnya, kata "Gue" dan "gue" dianggap sama setelah
konversi ke huruf kecil.
- Menghapus Tanda Baca:
text = ''.join([char for char in text if char not in [Link]])
Tujuan: Menghapus tanda baca dari teks, seperti titik (.), koma (,), tanda
seru (!), dan sebagainya. Hal ini dilakukan karena tanda baca tidak
memberikan informasi penting dalam analisis teks dan sering kali
mengganggu pemrosesan lebih lanjut.
- Tokenisasi:
words = word_tokenize(text)
Tujuan: Memecah teks yang panjang menjadi unit-unit yang lebih kecil,
yaitu kata-kata. Misalnya, kalimat "Dia pergi ke pasar." akan diubah
menjadi token: ['Dia', 'pergi', 'ke', 'pasar', '.']. Proses ini penting agar setiap
kata dapat dianalisis atau diproses lebih lanjut.
- Mengganti Kata Slang dengan Kata Formal:
words = [slang_dict[word] if word in slang_dict else word for word in
words]
Tujuan: Mengganti kata slang dengan kata yang lebih formal atau baku
menggunakan kamus slang_dict. Misalnya, kata "aja" akan diganti dengan
"hanya", dan "gue" dengan "saya". Hal ini penting agar teks menjadi lebih
standar dan mudah dianalisis, mengingat banyak teks informal atau
percakapan menggunakan kata-kata slang yang tidak baku.
- Menghapus Stop Words dan Stemming:
words = [[Link](word) for word in words if word not in
stop_words and [Link]()]
Tujuan: Menghapus Stop Words: Stop words adalah kata-kata umum
yang sering muncul dalam teks (seperti "yang", "di", "untuk") tetapi tidak
memberikan banyak makna. Kata-kata ini dihapus karena dianggap tidak
relevan dalam analisis.
Menghapus Kata yang Bukan Alpha: [Link]() memastikan bahwa
hanya kata yang terdiri dari huruf (tanpa angka atau simbol) yang diproses.
Stemming: Proses mengubah kata ke bentuk dasarnya (misalnya "berlari"
menjadi "lari", atau "pemrograman" menjadi "program").
6. Contoh hasil akhir pre processing
a. Hasil data sebelum
1. article_text \
7. 0 Debat perdana Pilpres 2024 bakal digelar KPU R...
8. 1 Partai Gerindra resmi memberikan rekomendasi C...
9. 2 Polres Wajo, Sulawesi Selatan (Sulsel) mengera...
10. 3 Khofifah Indar Parawansa memberi kode kuat aka...
11. 4 Khofifah Indar Parawansa telah mendapat dukung...
12. 5 Badan Pengawas Pemilu (Bawaslu) Sulawesi Selat...
6 DPC Partai Gerindra Kota Cirebon mulai mematan...
7 Viral di media sosial rekaman video yang dinar...
8 Penyelenggaraan Pemilihan Umum 2024 melibatkan...
9 Capres nomor urut 2, Prabowo Subianto, mengaku...
10 KPU Sulawesi Selatan (Sulsel) mengingatkan par...
11 Langkah politik Khofifah Indah Parawansa di 20...
12 Khofifah Indar Parawansa resmi menerima rekome...
13 Organisasi Istri Para Kiai Seluruh Indonesia a...
14 Tim Kampanye Daerah (TKD) Jatim Prabowo Subian...
15 Dewan Pimpinan Daerah (DPD) I Golkar Sulawesi ...
16 Tabloid 'Indonesia Maju' beredar di sejumlah p...
17 DPP Partai Gerindra menyerahkan rekomendasi Ca...
18 Tim Pemenangan Prabowo-Gibran Kota Solo berenc...
19 Ribuan warga mengikuti acara senam sehat berta...
b. Hasil data sesudah
clean_text
0 debat perdana pilpr digelar kpu ri selasa kant...
1 partai gerindra resmi rekomendasi cagub jatim ...
2 polr wajo sulawesi selatan sulsel mengerahkan ...
3 khofifah indar parawansa kode kuat all out men...
4 khofifah indar parawansa dukungan partai maju ...
5 badan pengawa pemilu bawaslu sulawesi selatan ...
6 dpc partai gerindra kota cirebon mematangkan p...
7 viral media sosial rekaman video dinarasikan o...
8 penyelenggaraan pemilihan melibatkan salah sat...
9 capr nomor urut prabowo subianto mengaku dieje...
10 kpu sulawesi selatan sulsel partai politik par...
11 langkah politik khofifah indah parawansa jawa ...
12 khofifah indar parawansa resmi menerima rekome...
13 organisasi istri kiai indonesia jamiyyah perem...
14 tim kampany daerah tkd jatim prabowo subiantog...
15 dewan pimpinan daerah dpd i golkar sulawesi se...
16 tabloid indonesia maju beredar pasar kota kabu...
17 dpp partai gerindra menyerahkan rekomendasi ca...
18 tim pemenangan prabowogibran kota solo berenca...
19 ribuan warga mengikuti acara senam sehat berta...
Tahap 2 : Representasi Data
2. Text Vectorization
a. Representasi TF-IDF
TF-IDF adalah teknik representasi teks yang mengukur pentingnya suatu kata
dalam sebuah dokumen relatif terhadap kumpulan dokumen (corpus). Angka
TF-IDF yang lebih tinggi menunjukkan bahwa kata tersebut lebih penting
untuk dokumen tertentu.
tfidf_vectorizer = TfidfVectorizer(max_features=1000)
tfidf_matrix = tfidf_vectorizer.fit_transform(df['clean_text'])
- max_features=1000: Parameter ini membatasi jumlah kata yang akan
diambil sebagai fitur. Hanya 1000 kata dengan skor TF-IDF tertinggi yang
akan dipertimbangkan. Hal ini dapat membantu mengurangi dimensi data
dan meningkatkan efisiensi.
- fit_transform(df['clean_text']): Fungsi ini pertama-tama "melatih"
TfidfVectorizer pada data teks yang dan kemudian mengubah teks menjadi
representasi numerik dalam bentuk matriks sparse. Setiap baris dalam
matriks mewakili satu dokumen, dan setiap kolom mewakili kata tertentu
yang ditemukan dalam korpus.
b. Bag of Words (BoW)
Bag of Words (BoW) adalah teknik representasi teks dalam bentuk numerik
yang digunakan untuk analisis data teks atau pemrosesan bahasa alami (NLP).
Dalam BoW, sebuah teks direpresentasikan sebagai himpunan kata-kata unik
(vocabulary) yang ada di dalam teks, di mana frekuensi kemunculan setiap
kata dihitung. Teknik ini mengabaikan tata bahasa dan urutan kata, sehingga
hanya mempertimbangkan frekuensi kata.
Penjelasan Fungsi dan Detail:
1. CountVectorizer:
o Bagian ini adalah alat utama dalam Scikit-learn untuk
menghasilkan representasi BoW.
o Parameter max_features=1000 membatasi jumlah kata unik (fitur)
yang dipertimbangkan menjadi 1000 kata paling sering muncul. Ini
berguna untuk menangani dataset besar dan mengurangi dimensi.
2. fit_transform:
o Fungsi ini melakukan dua hal:
fit: Memahami semua kata unik (vocabulary) di kolom
'clean_text' dan menciptakan indeks untuk setiap kata.
transform: Menghitung frekuensi kemunculan setiap kata
dalam teks dan merepresentasikannya sebagai matriks
sparce.
o Hasilnya adalah bow_matrix, yaitu matriks dengan dimensi
(jumlah dokumen x jumlah fitur), di mana setiap elemen
menunjukkan frekuensi kata di dokumen tertentu.
Tahap 3: Pelatihan Model
Model Klasifikasi
1. TF-IDF
Beberapa langkah penting dilakukan untuk mempersiapkan dan melatih
model klasifikasi menggunakan TF-IDF sebagai fitur representasi teks.
Berikut penjelasan langkah demi langkah dari kode yang Anda berikan:
a. Pembagian Dataset (Train-Test Split)
X_train_tfidf, X_test_tfidf, y_train_tfidf, y_test_tfidf = train_test_split(
tfidf_matrix, df['author'], test_size=0.2, random_state=42)
- train_test_split: Fungsi ini membagi dataset menjadi dua bagian:
- X_train_tfidf: Data fitur untuk pelatihan (80% dari total data).
- X_test_tfidf: Data fitur untuk pengujian (20% dari total data).
- y_train_tfidf: Label untuk data pelatihan (kelas atau kategori "author").
2. Model K-Nearest Neighbors (k-NN)
knn_model_tfidf = KNeighborsClassifier(n_neighbors=5)
knn_model_tfidf.fit(X_train_tfidf, y_train_tfidf)
- KNeighborsClassifier(n_neighbors=5): Inisialisasi model K-Nearest
Neighbors dengan parameter n_neighbors=5, yang berarti model akan
mencari 5 data tetangga terdekat untuk menentukan kelas suatu data.
- fit(X_train_tfidf, y_train_tfidf): Melatih model k-NN menggunakan data
pelatihan (X_train_tfidf sebagai fitur dan y_train_tfidf sebagai label). Ini
memungkinkan model untuk "mempelajari" hubungan antara fitur dan
label.
3. Model SVM
kernel='linear': Model menggunakan kernel linear, yang berarti data
dipisahkan dengan hyperplane lurus.
C=1.0: Menentukan keseimbangan antara margin hyperplane dan toleransi
terhadap kesalahan klasifikasi.
max_iter=1000: Membatasi jumlah iterasi pelatihan hingga 1000.
4. Word2Vec
kita mempersiapkan dan melatih model klasifikasi menggunakan
Word2Vec sebagai representasi fitur teks. Penjelasan langkah demi
langkah adalah sebagai berikut:
def document_vector(doc, model):
words = [word for word in [Link]() if word in [Link]]
if words:
return [Link]([Link][words], axis=0)
else:
return [Link](model.vector_size)
- [Link](): Memecah dokumen (teks) menjadi kata-kata.
- word in [Link]: Memeriksa apakah kata tersebut ada dalam model
Word2Vec. Hanya kata yang ada di dalam model yang akan
dipertimbangkan.
- [Link]([Link][words], axis=0): Jika kata-kata dalam dokumen ada
di dalam model, maka vektor kata-kata tersebut akan diambil dan dihitung
rata-ratanya. Rata-rata ini mewakili dokumen secara keseluruhan.
- [Link](model.vector_size): Jika tidak ada kata yang cocok dengan
model, maka akan dikembalikan vektor nol yang memiliki panjang sesuai
ukuran vektor dalam model (misalnya 100 dimensi).
a. Menerapkan document_vector untuk Dataset
X_word2vec = [Link](df['clean_text'].apply(lambda x:
document_vector(x, word2vec_model)).tolist())
y = df['author']
- df['clean_text']: Kolom yang berisi teks yang telah dibersihkan.
- apply(lambda x: document_vector(x, word2vec_model)): Fungsi
document_vector diterapkan ke setiap baris teks dalam dataset
(df['clean_text']), mengubah setiap teks menjadi vektor menggunakan
model Word2Vec.
- X_word2vec: Merupakan array yang berisi vektor representasi dari setiap
teks.
y = df['author']: Label yang ingin diprediksi, yaitu kolom author yang
menunjukkan kategori/kelas dari setiap dokumen.
b. Pembagian Data (Train-Test Split)
X_train_w2v, X_test_w2v, y_train_w2v, y_test_w2v = train_test_split(
X_word2vec, y, test_size=0.2, random_state=42
- train_test_split: Fungsi ini membagi dataset menjadi dua bagian:
- X_train_w2v: Fitur pelatihan (vektor Word2Vec).
- X_test_w2v: Fitur pengujian.
- y_train_w2v: Label pelatihan (author).
c. Model K-Nearest Neighbors (k-NN) untuk Word2Vec
knn_model_w2v = KNeighborsClassifier(n_neighbors=5)
knn_model_w2v.fit(X_train_w2v, y_train_w2v)
- KNeighborsClassifier(n_neighbors=5): Menginisialisasi model k-NN
dengan parameter n_neighbors=5, yang berarti model akan mencari 5
tetangga terdekat untuk menentukan kelas suatu data.
- fit(X_train_w2v, y_train_w2v): Melatih model k-NN menggunakan data
pelatihan yang telah diproses menjadi representasi vektor Word2Vec. Ini
memungkinkan model mempelajari hubungan antara fitur (vektor kata)
dan label (author).
d. Model Logistic Regression untuk Word2Vec
logreg_model_w2v = LogisticRegression(max_iter=1000)
logreg_model_w2v.fit(X_train_w2v, y_train_w2v)
- LogisticRegression(max_iter=1000): Menginisialisasi model regresi
logistik dengan parameter max_iter=1000, yang menunjukkan jumlah
iterasi maksimal untuk pelatihan.
- fit(X_train_w2v, y_train_w2v): Melatih model regresi logistik
menggunakan data pelatihan yang telah diproses menjadi representasi
vektor Word2Vec.
Tahap 4: Evaluasi Model
1. Evaluasi model klasifikasi k-NN dan Logistic Regression dengan TF-IDF
2. Evaluasi Model SVM dengan TF-IDF
3. Evaluasi Model KNN Dengan BoW
4. Evaluasi Model SVM Dengan Bow