Hai hai sobat Exsight, masih ingat gak nih pada beberapa artikel sebelumnya, kita pernah membahas penjelasan terkait Analisis Sentimen: Definisi, Langkah-Langkah dan Penerapannya pada Data Twitter. Nah melanjutkan dari artikel sebelumnya, pada artikel kali ini, kita akan berfokus pada tutorial analisis sentimen menggunakan software Python secara lebih detail. Tanpa berlama- lama lagi, yuk yuk simak artikel ini dengan seksama yaa!
Analisis sentimen adalah proses untuk mengidentifikasi, mengekstrak, dan memahami pendapat, perasaan, atau sikap yang terkandung dalam teks atau data lainnya. Tujuan utama dari analisis sentimen adalah untuk mengevaluasi opini atau persepsi orang terhadap suatu topik, produk, layanan, merek, atau entitas lainnya dalam rangka mendapatkan wawasan yang berharga untuk pengambilan keputusan.
Studi Kasus Analisis Sentimen
Studi kasus yang akan kita gunakan dalam hal ini berkaitan dengan Analisis Sentimen kebijakan tentang Covid-19 di Indonesia. Kita akan melihat bagaimana opini masyarakat, khususnya para pengguna aplikasi Twitter, terkait kebijakan Covid-19 di Indonesia. Terlebih dahulu, kita lakukan crawling data atau mengumpulkan data dari aplikasi Twitter menggunakan Application Programming Interface (API). Namun dalam artikel ini, untuk mempersingkat waktu, sobat Exsight dapat langsung mengakses data hasil crawling twitter pada link di sini.
Load Library Python
Tahapan paling awal sebelum melakukan running syntax di Python yaitu melakukan load library. Apabila sobat Exsight masih belum memiliki library untuk analisis sentimen, maka dapat menginstall terlebih dahulu dengan cara.
pip install (nama library nya)
Adapun beberapa library yang digunakan terdiri atas:
import pandas as pd
import numpy as np
import tweepy
import matplotlib.pyplot as plt
# Machine Learning imports
import nltk
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.model_selection import GridSearchCV
import joblib
from nltk.corpus import stopwords
import string
import re
from string import punctuation
from collections import Counter
Load Data
Tahapan selanjutnya yaitu melakukan load data di Python. Data yang diinput diberi nama sebagai data yang berasal dari file corona. Data corona, bisa diakses pada link berikut. Perlu diperhatikan untuk jenis file data yang diinput dalam format CSV, hal ini dengan tujuan untuk mempermudah pengguna. Syntax yang digunakan untuk load data adalah sebagai berikut.
data = pd.read_csv('corona.csv')
data.head()
Berdasarkan Gambar 1. ditampilkan 5 baris data teratas pada file data Corona. Data terdiri atas 15 variabel. Tahapan berikutnya, berdasarkan data awal corona, kita akan membuat data frame baru yang berisikan hanya 3 variabel meliputi:
– Variabel Id
– Variabel Mentions
– Variabel Sentiment
data=data[["Id","Mentions","Sentiment"]]
data['Mentions']=data.Mentions.astype('str')
Sebagai catatan, untuk kolom variabel Mentions, pastikan variabel menggunakan tipe data String, sesuai syntax Python di atas.
Tahapan selanjutnya, kita perhatikan pada kolom variabel Sentimen, dimana pada kolom tersebut terdiri atas 3 (tiga) kategori yang terdiri atas: Positive, Neutral, dan Negative. Analisis sentimen mengklasifikasikan pendapat atau perasaan seseorang terhadap suatu topik menjadi tiga kategori: Positive, Neutral, dan Negative. Berikut adalah perbedaan antara ketiganya:
- Sentimen Positive
Pendapat atau perasaan yang mendukung atau menggambarkan kepuasan, kegembiraan, atau kebaikan terhadap suatu topik. Contohnya adalah ulasan yang memuji kualitas produk, layanan yang sangat baik, atau pengalaman yang menyenangkan. - Sentimen Neutral
Pendapat atau perasaan yang tidak menunjukkan kecenderungan positif atau negatif secara signifikan. Netral biasanya digunakan untuk menggambarkan situasi di mana orang tidak memiliki opini yang kuat atau tidak ada perasaan emosional yang khusus terhadap topik tersebut. - Sentimen Negative
Pendapat atau perasaan yang mengekspresikan ketidakpuasan, kekecewaan, atau ketidaknyamanan terhadap suatu topik. Contohnya adalah ulasan yang mengkritik kualitas produk yang buruk, layanan yang tidak memuaskan, atau pengalaman yang tidak menyenangkan.
Dalam analisis sentimen, tujuannya adalah untuk mengidentifikasi dan mengklasifikasikan pendapat atau perasaan menjadi salah satu dari tiga kategori ini untuk memahami umpan balik atau persepsi yang dimiliki orang terhadap suatu topik atau entitas tertentu. Selanjutnya, kita bisa lihat jumlah masing-masing dari tiap sentimen baik dari segi sentimen Positive, sentimen Neutral, dan sentimen Negative dengan menggunakan Syntax sebagai berikut.
data['Sentiment'].value_counts()
Berdasarkan Gambar 2. diketahui bahwa kategori dengan jumlah paling banyak pada variabel Sentimen yaitu Sentimen Positive sebesar 889. Hal ini menunjukkan bahwa sebagian besar netizen atau masyarakat pengguna aplikasi Twitter berpendapat setuju serta puas terkait adanya kebijakan Covid-19 di Indonesia.
Pre-Processing Data
Pre-processing data pada analisis sentimen melibatkan serangkaian langkah untuk membersihkan dan mempersiapkan teks mentah hasil crawling data agar sesuai untuk analisis sentimen. Beberapa langkah umum dalam Pre-processing data analisis sentimen adalah sebagai berikut.
- Menghapus data yang tidak berhubungan dengan topik.
- Menghapus HTML link, mention, username, hastag, retweet, angka, tanda baca, spasi berlebih, hyperlink, serta menghapus kata dengan huruf kurang dari 2 huruf.
- Case Folding
Menyeragamkan huruf menjadi non kapital. - Stemming dan Lemmatization
Merubah kata-kata dalam tweet menjadi bentuk standar atau kata dasar.
*Stemming berfokus pada menghilangkan awalan atau akhiran kata untuk mengembalikan kata ke bentuk dasarnya yang disebut “kata dasar” atau “akar kata”. Contohnya, kata-kata seperti “berlari”, “lari”, dan “lari-lari” akan diubah menjadi “lar”.
*Lemmatization berfokus pada mengurangi kata-kata ke bentuk dasarnya berdasarkan kamus atau aturan bahasa. Berbeda dengan stemming, lemmatisasi mempertimbangkan konteks kata dalam kalimat dan berusaha untuk menghasilkan kata dasar yang benar secara gramatikal. Contohnya, kata-kata seperti “berjalan”, “jalan”, dan “jalan-jalan” akan diubah menjadi “jalan”. - Stopword
Menghapus kata pada tweet yang terkandung di dalam stopwords. Daftar kata stopwords adalah daftar kata umum yang biasanya muncul dalam jumlah besar dan dianggap tidak memiliki makna. - Tokenization
Proses untuk membagi teks yang dapat berupa kalimat, paragraf atau dokumen menjadi token-token/kata-kata. - Bag of Words (BoW)
Bag of Words (BoW) merupakan cara yang digunakan untuk mengekstrak fitur dari teks. BoW mengubah teks menjadi matriks kemunculan kata-kata dalam dokumen. - TF-IDF (Term Frequency-Inverse Document Frequency)
TF-IDF digunakan untuk mengekstraksi fitur-fitur penting dari teks yang akan dianalisis. Cara kerja TF-IDF yaitu dengan menghitung bobot kata dalam sebuah dokumen. Kata-kata yang memiliki bobot TF-IDF tinggi adalah kata-kata yang muncul sering dalam sebuah dokumen tertentu, tetapi jarang muncul dalam koleksi dokumen secara keseluruhan, sehingga dianggap penting untuk dokumen tersebut.
# helper function to clean tweets
def processTweet(tweet):
# Remove HTML special entities (e.g. &)
tweet = re.sub(r'\&\w*;', '', tweet)
# Remove @username
tweet = re.sub('@[^\s]+','',tweet)
# Remove tickers
tweet = re.sub(r'\$\w*', '', tweet)
# To lowercase
tweet = tweet.lower()
# Remove hyperlinks
tweet = re.sub(r'https?:\/\/.*\/\w*', '', tweet)
# Remove hashtags
tweet = re.sub(r'#\w*', '', tweet)
# Remove Punctuation
tweet = re.sub(r'[' + punctuation.replace('@', '') + ']+', ' ', tweet)
# Remove words with 2 or fewer letters
tweet = re.sub(r'\b\w{1,2}\b', '', tweet)
# Remove whitespace (including new line characters)
tweet = re.sub(r'\s\s+', ' ', tweet)
# Remove single space remaining at the front of the tweet.
tweet = tweet.lstrip(' ')
# Remove characters beyond Basic Multilingual Plane (BMP) of Unicode:
tweet = ''.join(c for c in tweet if c <= '\uFFFF')
return tweet
# clean dataframe's text column
df['Mentions'] = df['Mentions'].apply(processTweet)
# preview some cleaned tweets
df['Mentions'].head()
Apabila kita perhatikan pada Gambar 3, untuk hasil Pre-Processing pada kolom variabel Mentions, untuk 5 data teratas masih terdapat kalimat yang sama persis (duplicate), maka dari itu kita perlu melakukan penghapusan data duplicate dengan syntax sebagai berikut. Sebelum itu juga dilakukan penghapusan stopword menggunakan stopword deafult yang terdapat pada library Sastrawi.
pip install Sastrawi
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory
factory = StopWordRemoverFactory()
stopword = factory.create_stop_word_remover()
tweet=[]
for i, kalimat in enumerate (df['Mentions']):
stop = stopword.remove(kalimat)
tweet.append(stop)
df['Mentions']=tweet
# drop duplicates
df = df.drop_duplicates('Mentions')
df.shape
df['Sentiment'].unique()
Adapun ekstraksi fitur menggunakan BoW dan TF-IDF akan dilakukan secara langsung pada pipeline pemodelan.
Pemodelan
Tahapan berikutnya, setelah dilakukan pre-processing yaitu melakukan pemodelan pada analisis sentimen. Dalam hal ini pemodelan yang dilakukan menggunakan algoritma klasifikasi Multinomial Naive Bayes. Saat melakukan pemodelan, terlebih dahulu dilakukan pembagian data training dan data testing, dimana data training sebesar 80% dan data testing sebesar 20%. Pada tahapan ini juga dilakukan tuning parameter menggunakan GridSearchCV dengan cv = 3 untuk menghemat waktu komputasi.
X_train, X_test, y_train, y_test = train_test_split(df['Mentions'], df['Sentiment'], test_size=0.2)
# create pipeline
pipeline = Pipeline([
('bow', CountVectorizer(strip_accents='ascii',
lowercase=True)), # strings to token integer counts
('tfidf', TfidfTransformer()), # integer counts to weighted TF-IDF scores
('classifier', MultinomialNB()), # train on TF-IDF vectors w/ Naive Bayes classifier
])
# this is where we define the values for GridSearchCV to iterate over
parameters = {'bow__ngram_range': [(1, 1), (1, 2) , (1,3), (1,4), (1,5)],
'bow__min_df':(3,4,5),
'tfidf__use_idf': (True, False),
'classifier__alpha': (5e-1, 1e-1, 5e-2, 1e-2, 1e-3),
}
# do 3-fold cross validation for each of the 6 possible combinations of the above params
grid = GridSearchCV(pipeline, cv=3, param_grid=parameters, verbose=0)
grid.fit(X_train,y_train)
# summarize results
print("\nBest Model: %f using %s" % (grid.best_score_, grid.best_params_))
print('\n')
means = grid.cv_results_['mean_test_score']
stds = grid.cv_results_['std_test_score']
params = grid.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("Mean: %f Stdev:(%f) with: %r" % (mean, stdev, param))
Evaluasi Model
Tahapan berikutnya yaitu melakukan evaluasi model Multinomial Naive Bayes pada analisis sentimen menggunakan model terbaik yang disimpan dalam variabel grid dan dikonversi ke dalam file twitter_sentiment.pkl . Evaluasi model dalam hal ini menggunakan beberapa pengukuran diantaranya accuracy score, confusion matrix, precision, recall, f1-score, dan support. Syntax yang digunakan untuk evaluasi model adalah sebagai berikut.
# save best model to current working directory
joblib.dump(grid, "twitter_sentiment.pkl")
# load from file and predict using the best configs found in the CV step
model_NB = joblib.load("twitter_sentiment.pkl" )
# get predictions from best model above
y_preds = model_NB.predict(X_test)
print('accuracy score: ',accuracy_score(y_test, y_preds))
print('\n')
#Menampilkan Hasil Evaluasi Model
print('confusion matrix: \n',confusion_matrix(y_test,y_preds))
print('\n')
print(classification_report(y_test, y_preds))
Berdasarkan hasil evaluasi model pada Gambar 6. diketahui bahwa:
Accuracy score yaitu sebesar 0,865. Accuracy score mengukur sejauh mana model klasifikasi berhasil memprediksi kelas yang benar dari seluruh sampel. Nilai 0,865 sudah cukup tinggi, dimana dapat dikatakan dengan kinerja model ini sudah cukup baik dalam melakukan prediksi.
Referensi
Materi Webinar Exsight Analytics dengan tema Twitter Sentiment Analysis with Python : Indonesian Public Perceptions of COVID-19 oleh Akbar Maulana – 31 Juli 2021
Sekian penjelasan tentang Tutorial Analisis Sentimen pada software Python. Jika masih ada yang dibingungkan bisa langsung saja ramaikan kolom komentar atau hubungi admin melalui tombol bantuan di kanan bawah. Stay tuned di website https://exsight.id/blog/ agar tidak ketinggalan artikel-artikel menarik lainnya.