Sentiment Analysis Data Review Penjualan Barang Di E-Commerce

rusnanda farhan
BISA.AI
Published in
6 min readSep 1, 2020
Photo by Markus Winkler on Unsplash

Data Science saat ini telah banyak diterapkan dalam banyak bidang kehidupan. Terlebih pada sektor industri dan e-commerce. Pada setiap item barang atau produk yang dijual di suatu e-commerce, terdapat kolom komentar dan rating yang dapat diisi oleh setiap pembeli untuk menilai kualitas barang yang dibeli. Hal ini merupakan data berharga yang sayang jika tidak dimanfaatkan dengan baik.

Komentar atau review pembeli merupakan aspek penting bagi penjual untuk melihat kualitas barang atau produk yang mereka jual melalui perspektif pembeli. Aspek lain yang mungkin dinilai oleh pembeli yaitu respon atau tanggapan penjual saat dihubungi dan waktu pengiriman barang. Analisa yang baik dapat memberi insight kepada penjual untuk melakukan pengambilan keputusan kedepannya untuk produk-produk yang mereka jual.

Untuk data review pada komentar pembeli ini, dapat kita gunakan analisis sentimen untuk melihat pandangan pembeli apakah barang atau produk yang dijual disukai atau tidak. Dalam hal ini, kita anotasikan data menjadi 3 kelas, positif, negatif, dan netral.

Machine Learning dan Sentiment Analysis

Machine Learning adalah suatu area dalam Artificial Intelligence atau kecerdasan buatan yang berhubungan dengan pengembangan teknik-teknik yang bisa diprogramkan dan belajar dari data masa lalu. [1]

Sentiment analysis (also known as opinion mining or emotion AI) refers to the use of natural language processing, text analysis, computational linguistics, and biometrics to systematically identify, extract, quantify, and study affective states and subjective information. [2]

Secara garis besar, sentiment analysis merupakan metode dalam mengklasifikasikan opini ke dalam kelas-kelas yang telah ditentukan. Dalam kaitannya dengan klasifikasi, dapat diterapkan algoritma-algoritma klasifikasi yang ada pada Machine Learning.

Alur (Flow) Sentiment Analysis dengan Machine Learning

Pada umumnya, alur yang biasa digunakan dimulai dari data collecting, dilanjutkan dengan preprocessing atau data cleanning, lalu tahap modelling, dan terakhir evaluasi.

Pada tahap preprocessing ada tiga istilah yang umum digunakan, yaitu:

  1. Stopword Removal
    Stopword merupakan kata-kata dalam jumlah besar yang tidak memiliki pengaruh dalam penilaian label sentiment jika dihapus atau dihilangkan. Menghapus kata-kata yang termasuk dalam stopword berguna untuk mengurangi proses komputasi dan bias pada saat training.
  2. Slangword
    Slang adalah ragam bahasa musiman yang dituturkan oleh kelompok sosial tertentu dalam situasi informal. [3]
    Dengan mengubah kata menjadi bentuk formal atau baku, maka kita dapat mengurangi variasi data yang bermakna sama.
  3. Stemming
    Pada intinya yang dilakukan pada stemming adalah mengubah suatu kata yang berimbuhan menjadi kata dasar.

Untuk metode klasifikasi dapat digunakan beberapa algoritma klasifikasi seperti Decission Tree, Naive Bayes, Support Vector Machine (SVM), dan lain-lain.

Metrik untuk mengevaluasi hasil trainning model, dapat digunakan metrik accuracy, precission, recall, F1 Score, dan lain-lain.

Implementasi Sentiment Analysis Dengan Python

Photo by Hitesh Choudhary on Unsplash

Pada pembahasan kali ini, data yang digunakan merupakan data umum dari Kaggle tentang data teks mengenai review produk dalam suatu e-commerce. Data dapat diunduh pada link ini.

File yang kita gunakan adalah yaitu file review seperti pada gambar di bawah.

Preprocessing

Silahkan import library yang dibutuhkan terlebih dahulu menggunakan kode di bawah,

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import re
import nltk
nltk.download('punkt')
from nltk import word_tokenize
import sys
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory

Di sini kita menggunakan modul atau library Sastrawi, library yang dapat memproses stopword dan stemming untuk bahasa Indonesia. Jika library atau modul Sastrawi belum terinstall, silahkan jalankan kode berikut :

pip install Sastrawi

Panggil data yang akan kita olah dengan menggunakan library pandas.

data = pd.read_csv(reviews.csv’)

Jika file data berada pada directory yang berbeda dengan Jupyter Notebook, maka sesuaikan terlebih dahulu directory sesuai dengan keberadaan file tersebut.

Selanjutnya, kita hanya akan menggunakan dua kolom saja, yaitu kolom rating dan kolom reviewContent. Cek missing value dari masing-masing kolom. Untuk mengatasi missing value pada data ini, kita hapus data (baris) yang mengandung missing value.

data = data[[‘reviewContent’,’rating’]]
data.isnull().sum()
data = data.dropna()

Selanjutnya, setelah didapat data yang bersih dari missing value, tentukan label dari masing-masing review yang ada. Pertama-tama kita lihat isi dari kolom rating dan frekuensinya dengan kode berikut

pd.value_counts(data[‘rating’])

Konversikan nilai rating menjadi label untuk sentimen analisis. Konversikan nilai 1 dan 2 sebagai label negatif, 3 sebagai label netral, 4 dan 5 sebagai label positif.

data[‘sentimen’] = data[‘rating’]
data[‘sentimen’].replace({5: “Positif”, 4: “Positif”, 3: “Netral”, 2:”Negatif”, 1:”Negatif”}, inplace=True)

Berikut ini proses mengolah kalimat pada kolom reviewContent untuk menghilangkan link atau URL dan menghapus karakter simbol.

reviews = [x for x in data.reviewContent]
new_reviews = []
for x in reviews:
pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
pattern1 = re.compile(r'pic.twitter.com/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
x = re.sub(pattern,' ',x) #remove urls if any
x = re.sub(pattern1,' ',x)
#Convert to lower case
x = x.lower()
#Convert www.* or https?://*
x = re.sub('((www\.[^\s]+)|(https?://[^\s]+))','',x)
#remove symbols
x = re.sub(r'[^.,a-zA-Z0-9 \n\.]',' ',x)
x = x.replace(',',' ').replace('.',' ')
#Convert @username to AT_USER
x = re.sub('@+','',x)
#Remove additional white spaces
x = re.sub('[\s]+', ' ', x)
#Replace #word with word
x = re.sub(r'#([^\s]+)', r'\1', x)
#trim
x = x.strip('\'"')
new_reviews.append(str(x))

Selanjutnya lakukan proses berikut untuk stopword removal dan slangword

Memanggil data slangword yang dimiliki

fSlang = '/content/drive/My Drive/data/slangword.txt'
sw=open(fSlang,encoding='utf-8', errors ='ignore', mode='r');SlangS=sw.readlines();sw.close()
SlangS = {slang.strip().split(':')[0]:slang.strip().split(':')[1] for slang in SlangS}

Panggil data stopword yang dimiliki dan menambahkan kata lazada di dalam stopword

Docs = []
df=open('/content/drive/My Drive/data/stopwords_edit.txt',"r",encoding="utf-8", errors='replace')
Docs.append(df.readlines());df.close()
stops = set([t.strip() for t in Docs[0]])
for x in ['lazada']:
stops.add(x)

Membuat fungsi untuk menjalankan stopword dan slangword

def formaldanstop(t):
t = word_tokenize(t)
for i,x in enumerate(t):
if x in SlangS.keys():
t[i] = SlangS[x]
return ''.join(' '.join(x for x in t if x not in stops))

Jalankan fungsi tersebut ke data

clean = list(map(formaldanstop,new_reviews))

Melakukan stopword removal dan stemming dengan library Sastrawi

from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
stopword = StopWordRemoverFactory().create_stop_word_remover()
stemmer = StemmerFactory().create_stemmer()
clean_reviews = []
for i,kalimat in enumerate(clean):
stop = stopword.remove(kalimat)
stem = stemmer.stem(stop)
print('loading kalimat ke:',i+1,'dari',len(clean))
clean_reviews.append(stem)

Setelah itu hasilnya masukan ke kolom baru di tabel data

data[‘Text_Bersih’] = clean_reviews

Sebelum masuk ke tahap modelling, kita vektorisasi data teks dengan menggunakan tf-idf

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
X = data['Text_Bersih']
y = data['sentimen']
cv = CountVectorizer()
cou_vec = cv.fit_transform(X)
tfidf = TfidfTransformer()
corps = tfidf.fit_transform(cou_vec)

Modelling

Pada tahap modelling ini data dipisahkan menjadi data train (data yang akan dipakai dalam modelling) dan data test (data untuk mengevaluasi hasil modelling). Di sini proporsi yang digunakan yaitu 2/3 untuk data train dan 1/3 untuk data test.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(corps,y, test_size=0.33, random_state=42)

Algoritma yang akan digunakan yaitu Decission Tree

from sklearn.tree import DecisionTreeClassifier
decision_tree = DecisionTreeClassifier()
decision_tree = decision_tree.fit(X_train, y_train)
y_pred = decision_tree.predict(X_test)

Evaluasi

Metrik evaluasi yang digunakan yaitu accuracy

from sklearn.metrics import accuracy_score,confusion_matrix
print(accuracy_score(y_test,y_pred))
print(confusion_matrix(y_test,y_pred))

Akurasi yang didapat yaitu 0,96 dengan confussion matrix sebagai berikut

[[ 2548    44   396]  
[ 44 1077 323]
[ 259 153 30476]]

Setelah mendapatkan akurasi yang cukup besar, ada beberapa saran yang dapat dilakukan :

  1. Menambah data baru sehingga model dapat belajar lebih baik lagi.
  2. Tambahkan proses untuk mengatasi data takseimbang (imbalance data).
  3. Koleksi stopword dan slangword lebih diperbanyak.
  4. Lakukan stemming manual, pada percobaan ini hanyak bergantung pada Sastrawi.
  5. Lakukan labelling manual dengan meninjau setiap kalimat untuk hasil yang lebih akuran.
  6. Gunakan algoritma klasifikasi lainnya untuk membandingkan hasil terbaik.

Referensi
[1] Santosa, Budi, & Umam, Ardian. (2018). Data Mining dan Big Data Analytics
[2] https://en.wikipedia.org/wiki/Sentiment_analysis
[3] https://id.wikipedia.org/wiki/Slang

--

--