Analisis Sentimen dengan Python

DW ADS

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.

analisis sentimen

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()
sentimen
Gambar 1. Data Corona

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:

  1. 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.
  2. 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.
  3. 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()
sentimen
Gambar 2. Kategori pada Variabel Sentimen

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.

  1. Menghapus data yang tidak berhubungan dengan topik.
  2. Menghapus HTML link, mention, username, hastag, retweet, angka, tanda baca, spasi berlebih, hyperlink, serta menghapus kata dengan huruf kurang dari 2 huruf.
  3. Case Folding
    Menyeragamkan huruf menjadi non kapital.
  4. 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”.
  5. 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.
  6. Tokenization
    Proses untuk membagi teks yang dapat berupa kalimat, paragraf atau dokumen menjadi token-token/kata-kata.
  7. 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.
  8. 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()
sentimen
Gambar 3. Hasil Pre-Processing pada Kolom Variabel Mentions

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))
sentimen
Gambar 5. Pemodelan dengan Naive Bayes

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))
sentimen
Gambar 6. Evaluasi Model

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.

Sstt...
Mau Kiriman Artikel Terbaru Exsight
Tanpa Biaya Langganan? ????

Nama Kamu

Email Kamu

Dapatkan Akses Informasi Terupdate Seputar Dunia Data dan Statistika 🙂

Exsight ADS

Leave a Comment

Hubungi Admin
Halo, selamat datang di Exsight! 👋

Hari ini kita ada DISKON 20% untuk semua transaksi. Klaim sekarang!