Klasifikasi Teks Review Tokopedia (NLP) menggunakan SVM dan Naive Bayes dengan Python

Ahmad Laroy Bafi
9 min readMay 19, 2020
Source : https://formtitan.com/OptimizationTips/Online-form-with-built-in-Sentiment-Analysis

“Fast respond dan fast delivery. Selalu yg terbaik dari seller ini.” — Bintang 5
“Kualitas produk sesuai deskripsi, namun pelayanan sangat tidak memuaskan..gosend instan dikirim hr berikutnya padahal order dr jm 1 siang” — Bintang 4

Kita pasti sering sekali melihat kalimat-kalimat seperti contoh diatas pada review sebuah toko online. Pasti temen-temen sudah tidak asing kalau beranggapan bahwa review bintang 5 pasti bagus lalu kalau bintang 1 pasti jelek. Eh tapi tunggu dulu, kadang ada loh orang yang memberi bintang 4 tapi isi reviewnya buruk seperti contoh diatas.

Nah saat ini muncul berbagai ilmu untuk mengatasi hal tersebut seperti Natural Language Processing (NLP), Text Classification, Sentiment Analysis dan Machine Learning/Deep Learning. Sebelum melakukan eksperimen, mari kita bahas secara singkat beberapa istilah tersebut.

  1. Natural Language Processing (NLP)
    NLP adalah cabang ilmu komputer dan linguistik yang mengkaji interaksi antara komputer dengan bahasa (alami) manusia. NLP sering dianggap sebagai cabang dari kecerdasan buatan dan bidang penelitiannya berkaitan dengan komputasi linguistik. NLP biasa digunakan untuk Machine Translation, Pengambilan Informasi, Analisis Sentimen, Ekstraksi Informasi, atau bahkan chatbot.
  2. Text Classification
    Text Classification
    adalah proses klasifikasi teks otomatis ke dalam kategori yang telah ditentukan. Kita dapat mengklasifikasikan Email menjadi spam atau non-spam, artikel berita dalam berbagai kategori seperti Politik, Pasar Saham, Olahraga, dll. Text Classification dapat dilakukan dengan bantuan Natural Language Processing (NLP) dan Algoritma Klasifikasi yang berbeda seperti Naive Bayes, SVM dan bahkan Neural Networks dengan Python.
  3. Sentiment Analysis
    Analisis sentimen adalah bidang studi yang menganalisis opini, sentimen, penilaian, penilaian, sikap, dan emosi orang terhadap entitas seperti produk, layanan, organisasi, individu, masalah, peristiwa, topik, dan atributnya. Ruang lingkup analisis sentimen sendiri dapat terbagi ke dalam tiga tingkatan, yaitu tingkat dokumen, tingkat kalimat, dan tingkat aspek.
  4. Machine Learning dan Deep Learning
    Machine learning adalah cabang ilmu komputer yang meneliti bagaimana suatu mesin dapat menyelesaikan masalah tanpa diprogram secara eksplisit. Sedangkan Deep Learning merupakan salah satu cabang Machine Learning (ML) yang menggunakan Deep Neural Network untuk menyelesaikan permasalahan pada masalah Machine Learning (ML).
    Deep learning
    cocok digunakan untuk memperhitungkan data yang tidak eksak, seperti bahasa, suara atau gambar. Sedangkan machine learning dapat memberikan analisis atau kesimpulan yang lebih tepat dari algoritme eksak seperti fungsi lookup.

Nah, disini saya mau melakukan eksperimen sentiment analysis dalam review HP pada sebuah seller di Tokopedia kemudian menggunakan Algoritma Naive Bayes dan SVM dalam memprediksi sentimennya. Disini saya menggunakan data review sebanyak 600 baris, dengan klasifikasi sentimen menjadi Positif Kuat, Positif, Cenderung Positif, Cenderung Negatif, Negatif, dan Negatif Kuat. OKE GASS, LANGSUNG DIMULAI SAJA YAAA!!!

Langkah 1 — Import Library yang Dibutuhkan

Enaknya pakai python dalam NLP yaitu banyak library yang bisa digunakan. Kita tidak perlu memikirkan algoritmanya lagi, tinggal langsung import saja. Kalau kita membuat algoritma text preprocessing, analisa dan prediksi sendiri maka akan memakan waktu yang lebih banyak. Pada artikel ini akan menggunakan library berikut. Jika di laptop kalian belum ada, bisa download lalu install dulu.

import re
import numpy as np
import pandas as pd
from sklearn import preprocessing, model_selection, naive_bayes, svm
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics import accuracy_score
import matplotlib
from matplotlib import pyplot as plt
# import seaborn as sns
%matplotlib inline
%config InlineBackend.figure_format = ‘retina’

Langkah 2 — Set Random Seed

Hal ini digunakan agar menghasilkan output yang sama walaupun script dijalankan terus-menerus dan data yang kita gunakan nantinya akan tetap sama, jika ini tidak diatur maka akan menghasilkan output yang berbeda tiap kali dijalankan. Nilai seed dapat diatur dengan angka berapa pun.

np.random.seed(300)

Langkah 3 — Load Corpus/Data

Data review smartphone pada toko *** di Tokopedia yang berhasil kita scraping dan sudah ditagging sentimennya kemudian diload. Load data menggunakan library pandas sehingga nantinya data yang diload otomatis akan menjadi pandas data frame. Dataset dapat dengan mudah ditambahkan sebagai dataframe panda dengan bantuan fungsi ‘read_csv’.

data = pd.read_csv("dataset-review.csv", encoding='latin-1', sep=";")
data.head(10)
Gambar 1. 10 data teratas teks ulasan

Langkah 4 — Pre-processing Data

Ini adalah langkah yang sangat penting dalam proses Data Mining. Pre-processing Data pada dasarnya mengubah data mentah menjadi format yang dapat dimengerti model NLP. Data dunia nyata seringkali penulisan kata-kata tidak lengkap, tidak konsisten, dan cenderung mengandung banyak kesalahan. Pra-pemrosesan data adalah metode yang telah terbukti ampuh untuk menyelesaikan masalah tersebut. Proses ini akan membantu dalam mendapatkan hasil yang lebih baik melalui algoritma klasifikasi.

Dalam langkah ini pre-processing data yang dilakukan yaitu:

  1. Menghilangkan karakter selain Alphabet
  2. Menghilangkan Stopwords + Casefolding
  3. Melakukan Stemming

Oke, langsung saja kita mulai…

  1. Menghilangkan karakter selain Alphabet
    Proses ini perlu dilakukan karena tujuan kita adalah menganalisa dan mengklasifikasi teks. Pada proses ini dilakukan penghapusan tanda baca, karakter aneh, angka, dan spasi berlebihan sehingga hanya menyisakan data berupa teks alphabet.
def hapus_karakter_selain_huruf(text):
for sp in string.punctuation:
text = text.replace(sp, " ")
text = re.sub(r"\d+","",text)
return text.replace('/\s\s+/g', ' ')
data['teks ulasan'] = data['teks ulasan'].apply(hapus_karakter_selain_huruf)
data.head(10)

2. Menghilangkan Stopwords + Casefolding
Kadang kata yang paling sering muncul adalah kata umum yang tidak merepresentasikan sentimennya. Kata ini perlu dihilangkan agar analisa menjadi lebih akurat. Selain menghilangkan stopwords dalam fungsi berikut dilakukan juga case folding yaitu mengubah semua huruf menjadi huruf kecil semua (lowercase).
Karena library yang menyediakan stopwords bahasa indonesia masih kurang pas jika diterapkan disini, maka dibuat stopwords manual. Jika ingin menambah stopwords lagi tinggal dimasukkan disitu.

sw = ["aja","agan","barang","beli","baru","ada","adalah","ajaa","akan","aku","atas","buat","boss","agak","agar","apa","biar","bsa","alhmdulillah","alhamdulilah","akhir","allah","ane","arn","atau","audah","bang","aaaa","about","adik","ah","admin","and","as","bakalan","barank","amin","begini","begitu","beberapa"]

Script di bawah ini adalah untuk menghapus stopwords dan melakukan casefolding

def stopwords(text):
text = [word.lower() for word in text.split()] #berfungsi untuk casefolding
for word in text:
for stop in sw:
if word==stop:
text.remove(word)
text = " ".join(text)
text = re.sub(r'(.+?)\1+', r'\1',text)
return text
data['teks ulasan'] = data['teks ulasan'].apply(stopwords)
data.head(10)

3. Melakukan Stemming
Selanjutnya adalah melakukan stemming. Stemming adalah proses pemetaan dan penguraian bentuk dari suatu kata menjadi bentuk kata dasarnya. Gampangnya, proses mengubah kata berimbuhan menjadi kata dasar.

Proses ini dilakukan dengan menggunakan library pysastrawi yang dapat diakses di link berikut.

# import sys
# !{sys.executable} -m pip install Sastrawi
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
# create stemmer
factory = StemmerFactory()
stemmer = factory.create_stemmer()
def stemming(text):
text = [stemmer.stem(word) for word in text.split()]
return " ".join(text)
data['teks ulasan'] = data['teks ulasan'].apply(stemming)
data.head(10)

Setelah itu data sudah bersih dan siap untuk diproses dan dianalisa.

Langkah 5 — Processing Data + Analysis

Analisa yang dilakukan disini hanya analisa statistikal sederhana. Pertama kita melihat jumlah persebaran data ini.

positif_kuat_len = data[data['positif_kuat']==1].shape[0]
positif_len = data[data['positif']==1].shape[0]
cenderung_positif_len = data[data['cenderung_positif']==1].shape[0]
cenderung_negatif_len = data[data['cenderung_negatif']==1].shape[0]
negatif_len = data[data['negatif']==1].shape[0]
negatif_kuat_len = data[data['negatif_kuat']==1].shape[0]
plt.bar(10,positif_kuat_len,3,label="Positif Kuat")
plt.bar(15,positif_len,3,label="Positif")
plt.bar(20,cenderung_positif_len,3,label="Cenderung Positif")
plt.bar(25,cenderung_negatif_len,3,label="Cenderung Negatif")
plt.bar(30,negatif_len,3,label="Negatif")
plt.bar(35,negatif_kuat_len,3,label="Negatif Kuat")
plt.legend()
plt.ylabel('Jumlah')
plt.title('Proporsi')
plt.show()

jika script diatas dijalankan maka akan menghasilkan grafik seperti berikut

Gambar 2. Persebaran Data Review Pada Tiap-Tiap Sentimen

Kemudian dilakukan pengelompokan data pada masing-masing sentimen menggunakan script berikut

positif_kuat_data = data[data['positif_kuat']==1]
positif_data = data[data['positif']==1]
cenderung_positif_data = data[data['cenderung_positif']==1]
cenderung_negatif_data = data[data['cenderung_negatif']==1]
negatif_data = data[data['negatif']==1]
negatif_kuat_data = data[data['negatif_kuat']==1]

Setelah itu, kita melihat top words pada masaing-masing sentimen yang sudah dilakukan pembobotan menggunakan Count Vectorizer.

count_vectorizer = CountVectorizer()
count_vectorizer.fit(positif_kuat_data['teks ulasan'])
dictionary = count_vectorizer.vocabulary_.items()
vocab = []
count = []
for key, value in dictionary:
vocab.append(key)
count.append(value)
vocab_bef_stem = pd.Series(count, index=vocab)
vocab_bef_stem = vocab_bef_stem.sort_values(ascending=True)
top_vacab = vocab_bef_stem.head(30)
top_vacab.plot(kind = 'barh', figsize=(5,10))

Pada kode yang dicetak tebal, bisa diganti dengan data lain yang ingin ditampilkan top-wordsnya seperti positif_data, cenderung_positif_data, cenderung_negatif_data, negatif_data, negatif_kuat_data.

Lalu didapatkan hasil sebagai berikut:

1.Positif Kuat
Dapat dilihat pada grafik di bawah ini kata/aspek yang paling sering muncul adalah “betul” yang menunjukkan barangnya sesuai pesanan, “best” yang menunjukkan bahwa toko ini memiliki pelayanan yang terbaik, dan “besok” yang menunjukkan aspek pengiriman yang cepat.

Gambar 3. Top Words Positif Kuat

2.Positif
Dapat dilihat pada grafik di bawah ini kata/aspek yang paling sering muncul adalah “best” yang menunjukkan bahwa toko ini memiliki pelayanan yang terbaik, “besok” yang menunjukkan aspek pengiriman yang cepat, “bertanya” yang menunjukkan aspek komunikasi yang dengan admin toko.

Gambar 4. Top Words Positif

3.Cenderung Positif
Dapat dilihat pada grafik di bawah ini kata/aspek yang paling sering muncul adalah “berbicara” yang menunjukkan bahwa toko ini memiliki pelayanan yang terbaik, “benar” yang menunjukkan aspek barang yang sesuai pesanan, “belanja” yang menunjukkan aspek kepuasan belanja.

Gambar 5. Top Words Cenderung Positif

4.Cenderung Negatif
Dapat dilihat pada grafik di bawah ini kata/aspek yang paling sering muncul adalah “Cacat” yang menunjukkan bahwa toko ini pernah mengirimkan barang cacat, “Cepat” yang menunjukkan aspek pengiriman yang cepat, “Bot” yang menunjukkan aspek komunikasi yang dengan admin toko.

Gambar 6. Top Words Cenderung Negatif

5.Negatif
Dapat dilihat pada grafik di bawah ini kata/aspek yang paling sering muncul adalah “Cuma” yang menunjukkan bahwa toko ini memiliki pelayanan yang baik namun ada faktor lain yang membuat buruk, “cukup” yang menunjukkan bahwa toko dan barangnya biasa saja, “CS” dan “Chat” yang menunjukkan aspek komunikasi yang dengan admin toko.

Gambar 7. Top Words Negatif

6.Negatif Kuat
Dapat dilihat pada grafik di bawah ini kata/aspek yang paling sering muncul adalah “dicek” yang menunjukkan bahwa toko ini sebelum mengirim barang tidak dicek dulu, “dibatalin” yang menunjukkan aspek pembatalan pesanan, “dibalikin” yang menunjukkan aspek terjadinya retur barang dan “dibales” yang menunjukkan aspek komunikasi yang dengan admin toko.

Gambar 8. Top Words Negatif Kuat

Langkah 6 — Label Encoding

Sebelum menyiapkan Data Training dan Testing. Ditambahkan kolom “label” pada dataset untuk identifikasi masing-masing sentimen mereka.

# menambahkan kolom untuk labelling
data['label'] = np.where(data['positif_kuat']==1,6,
(np.where(data['positif'],5,
(np.where(data['cenderung_positif'],4,
(np.where(data['cenderung_negatif'],3,
(np.where(data['negatif'],2,
(np.where(data['negatif_kuat'],1,0)))))))))))
data.head(10)

Kemudian datanya akan menjadi seperti ini.

Gambar 9. Dataset setelah ditambah kolom label

Langkah 7 — Menyiapkan Data Training dan Testing

Selanjutnya, pada langkah ini, data akan dibagi menjadi 2 yaitu Data Training dan Data Testing. Data Training akan digunakan agar sesuai dengan model dan prediksi akan dilakukan pada Data Testing. Ini dapat dilakukan melalui train_test_split dari library sklearn. Data Training akan memiliki 70% dari korpus dan Data Testing akan memiliki 30% sisanya karena telah menetapkan parameter test_size = 0,3.

Train_X, Test_X, Train_Y, Test_Y = model_selection.train_test_split(data['teks ulasan'],data['label'],test_size=0.3)

Langkah 8 — Word Vectorization

Word vectorization atau Word Embeddings adalah metodologi dalam NLP untuk memetakan kata atau frasa dari kosakata ke vektor yang sesuai dari bilangan real yang digunakan untuk menemukan prediksi kata, kesamaan kata/semantik. Banyak metode yang digunakan untk mengubah data menjadi vector, Arsitektur paling terkenal adalah seperti Word2Vec, Fasttext, Glove. Namun disini saya menggunakan Count Vectorizer karena simpel. Python memiliki library bernama Scikit Learn yang dapat digunakan dalam Machine Learning. Pada library ini terdapat algoritma CountVectorizer yang dapat mengubah fitur teks menjadi sebuah representasi vector.

Count_vect = CountVectorizer(max_features=5000)
Count_vect.fit(data['teks ulasan'])
Train_X_Count = Count_vect.transform(Train_X)
Test_X_Count = Count_vect.transform(Test_X)
print(Count_vect.vocabulary_)

{'sudah': 798, 'sampai': 708, 'dg': 179, 'selamat': 734, 'terimakasih': 845, 'alhamdulilah': 12, 'selalu': 733, 'puas': 646, …………}

Sekarang dataset siap untuk dimasukkan ke dalam Algoritma klasifikasi yang berbeda-beda.

Langkah 8 — Menggunakan Algoritma ML untuk Memprediksi Hasil

Algoritma Naive Bayes Classifier

# fit the training dataset on the NB classifier
Naive = naive_bayes.MultinomialNB()
Naive.fit(Train_X_Count,Train_Y)
# predict the labels on validation dataset
predictions_NB = Naive.predict(Test_X_Count)
# Use accuracy_score function to get the accuracy
print("Naive Bayes Accuracy Score -> ",accuracy_score(predictions_NB, Test_Y)*100)

Output:

Naive Bayes Accuracy Score ->  51.11111111111111%

Algoritma Support Vector Machine (SVM) Classifier

# Classifier - Algorithm - SVM
# fit the training dataset on the classifier
SVM = svm.SVC(C=1.0, kernel='linear', degree=3, gamma='auto')
SVM.fit(Train_X_Count,Train_Y)
# predict the labels on validation dataset
predictions_SVM = SVM.predict(Test_X_Count)
# Use accuracy_score function to get the accuracy
print("SVM Accuracy Score -> ",accuracy_score(predictions_SVM, Test_Y)*100)

Output:

SVM Accuracy Score ->  55.00000000000001

Penutup

Sekian untuk tulisan Sentiment Analysis pada text review Tokopedia kali ini. Akurasinya tidak terlalu bagus, hanya 50 persen an. Akurasi yang dihasilkan tidak cukup baik dikarenakan review yang didapatkan masih kurang, lalu gaya penulisannya yang sangat mixed. Pada tahap preprocessing juga masih banyak yang bisa diimprove. Jadi untuk teman-teman yang mau mencoba bisa melakukan eksperimen ini dengan:

  1. Bermain-main dengan langkah-langkah Pre-processing Data.
  2. Coba teknik Word Vectorization lainnya seperti TF-IDF dan Word2Vec atau lainnya.
  3. Pakai algoritma klasifikasi lainnya seperti Neural Network, Random Forest, dll

Jika ada saran, koreksi atau masukan silahkan hubungi saya di roylabafi@gmail.com.

Sekian, Terimakasih
Laroybafi Ahmad

Referensi :
https://medium.com/@bedigunjit/simple-guide-to-text-classification-nlp-using-svm-and-naive-bayes-with-python-421db3a72d34
https://www.kaggle.com/itratrahman/nlp-tutorial-using-python
https://blog.kmkonline.co.id/were-doing-machine-learning-9d4075d46cc3

--

--