Taufiksi – Astaga, saya mendapat tugas kuliah yang sangat susah yaitu analisis sentiment twitter lexicon pada mata kuliah pemrosesan bahasa alami.
Gila, susah banget asli dah mata kuliah ini. bikin pala pusing tujuh keliling. Mendingan saya nulis artikel kaya gini dari pada harus mikir tugas kuliah wkwk.
Tapi pada artikel ini saya hanya ingin memberikan dokumentasi untuk saya terhadap mata kuliah ini, supaya saya bisa membacanya lain waktu.
Ohh ya, sebelumnya saya juga mendokumentasikan tata cara crawling data twitter, nah di sini juga akan kita pakai cara tersebut.
Hanya untuk awalan aja karena proses crawling data ini proses yang harus di lewati. Mungkin bagi mahasiswa informatika yang ingin menjadi analist di perusahaan ini akan penting.
Ya begitulah, bukan mahasiswa IT jika tidak melakukan berbagai dosa sebagai mahasiswa seperti saya yang cukup malas untuk belajar wkwk.
Wah udah panjang ya hmm, kita lanjutkan basa basinya aja kali ya sebelum masuk ke tahap analisis sentiment twitter nya..
Apa Itu Analisis Sentiment
Analisis sentiment adalah sebuah tahap untuk menganalisis. Kita pecah dulu, sentiment sendiri itu adalah opini dan pendapat.
Nah jadi analisis sentiment menurut saya adalah menganalisis opini dan pendapat yang di lontarkan oleh semua orang. Analisis sentiment biasanya lebih cenderung bisa digunakan penelitian.
Seperti pada skripsi, biasanya skripsi menggunakan analisis sentiment twitter dan lain sebagainya.
Metodenya pun banyak sekali. Tidak hanya lexicon, ada yang menggunakan naive bayes, knn dan masih banyak lagi metode yang bisa di gunakan.
Apa Itu Lexicon
Lexicon jika di terjemahkan kedalam bahasa indonesia adalah kamus. Entahlah apakah bisa di gunakan sebagai acuan jika lexicon dalam dunia analisis sentiment berarti kamus juga ?
Namun yang jelas saya ketahui, lexicon itu adalah sebuah tahap untuk menganalisis sesuatu seperti naive bayes dan lain lain.
Jika ada salah, mohon jangan sungkan untuk mengoreksi, karena artikel ini hanya di gunakan untuk dokumentasi mata kuliah saya aja.
Proses Analisis Sentiment Twitter Lexicon
Ngga usah panjang panjang kali ya, langsung pada intinya. Proses analisis sentiment twitter menggunakan lexicon. Saya pun tidak tau ini benar atau salah.
Karena saya hanya mengikuti dosen dan ini merupakan hasil kerjaan saya yang saya implementasikan sendiri. Jadi misalnya tugasnya untuk meneliti hastag pon di artikel ini menggunakan hastag ole.
Begitulah, terus prosesnya ngapain aja ?
Crawling Data
Tahap pertama yang harus di lakukan adalah crawling data yang akan kita ambil adalah data dari twitter. Seperti yang sudah di jelaskan caranyanya crawling data gimana di artikel ini.
Import Dataset
Setelah kamu berhasil crawling data, kamu hanya tinggal mengimport datset yang tadi sudah di cari. Caranya memasukan code berikut ini.
import pandas as pd
# Membuat kerangka data panda
data = pd.read_csv('ponpapua.csv')
data.head()
Dropping Columns
Kamu bisa menghapus kolom yang tidak di perlukan seperti username, tanggal dan lain lain. Di sini yang kamu butuhkan hanya data twitternya saja.
# Hapus Kolom
mydata = data.drop(['id','date','user_id','user_id_str','username','name','day','hour','link','urls','photos','thumbnail','retweet','nlikes','nreplies','nretweets','quote_url','search','near','video','conversation_id','created_at','timezone','place','language','hashtags','cashtags','geo','source','user_rt_id','user_rt','retweet_id','reply_to','retweet_date','translate','trans_src','trans_dest'], axis=1)
mydata.head()
Yaps begitulah caranya dropping columns.
Cleaning Text
Proses ini di lakukan untuk menghapus tanda baca yang tidak di perlukan seperti pagar atau emoticon, bahkan sampai sama dengan akan kita bersihkan.
import re
# Tentukan fungsi untuk membersihkan teks
def clean(text):
# Menghapus semua karakter khusus dan angka meninggalkan abjad
text = re.sub('[^A-Za-z]+', ' ', text)
return text
# Membersihkan teks di kolom ulasan
mydata['Cleaned Reviews'] = mydata['tweet'].apply(clean)
mydata.head()
Sudah seperti itu aja maka kamu berhasil membersihkan text.
Tokenization, POP Tagging, Stopwords Removal
Lalu kita akan masuk kedalam tahap tokenizing dan kawan kawannya. Saya pun tidak tau ini langkah sebenarnya untuk melakukan apa wkwk.
!pip install nltk
import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk.tokenize import word_tokenize
from nltk import pos_tag
nltk.download('stopwords')
from nltk.corpus import stopwords
nltk.download('wordnet')
from nltk.corpus import wordnet
# POS tagger dictionary
pos_dict = {'J':wordnet.ADJ, 'V':wordnet.VERB, 'N':wordnet.NOUN, 'R':wordnet.ADV}
def token_stop_pos(text):
tags = pos_tag(word_tokenize(text))
newlist =[]
for word, tag in tags:
if word.lower() not in set(stopwords.words('english')):
newlist.append(tuple([word, pos_dict.get(tag[0])]))
return newlist
mydata['POS tagged'] = mydata['Cleaned Reviews'].apply(token_stop_pos)
mydata.head()
# mydata['POS tagged'][0]
Ohh ya, jangan lupa di python ini spasi sangat berpengaruh, jadi akan mengakibatkan error yang sangat menyusahkan untuk di cari.
Lemmatization
Kemudian proses yang tidak saya tau apa itu wkwk, intinya begini proses untuk analisis sentiment twitter menggunakan lexicon.
from nltk.stem import WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()
def lemmatize(pos_data):
lemma_rew = " "
for word, pos in pos_data:
if not pos:
lemma = word
lemma_rew = lemma_rew + " " + lemma
else:
lemma = wordnet_lemmatizer.lemmatize(word, pos=pos)
lemma_rew = lemma_rew + " " + lemma
return lemma_rew
mydata['Lemma'] = mydata['POS tagged'].apply(lemmatize)
mydata.head()
# print(mydata['review'][239] + "\n" + mydata['Lemma'][239])
mydata[['tweet', 'Lemma']]
Analisis Sentiment using TextBlob
Setau saya mulai dari di sinilah tahap paling penting jika kamu ingin menganalisis sentiment. Karena mungkin ini adalah metode yang ada di dalam lexicon.
!pip install textblob
from textblob import TextBlob
# berfungsi untuk menghitung subjektivitas
def getSubjectivity(review):
return TextBlob(review).sentiment.subjectivity
# fungsi untuk menghitung polaritas
def getPolarity(review):
return TextBlob(review).sentiment.polarity
# berfungsi untuk menganalisis ulasan
def analysis(score):
if score < 0:
return 'Negative'
elif score == 0:
return 'Neutral'
else:
return 'Positive'
fin_data = pd.DataFrame(mydata[['tweet', 'Lemma']])
# fin_data['Subjectivity'] = fin_data['Lemma'].apply(getSubjectivity)
fin_data['Polarity'] = fin_data['Lemma'].apply(getPolarity)
fin_data['Analysis'] = fin_data['Polarity'].apply(analysis)
fin_data.head()
tb_counts = fin_data.Analysis.value_counts()
tb_counts
import matplotlib.pyplot as plt
%matplotlib inline
tb_count= fin_data.Analysis.value_counts()
plt.figure(figsize=(10, 7))
plt.pie(tb_counts.values, labels = tb_counts.index, explode = (0, 0, 0.25), autopct='%1.1f%%',shadow=False)
# plt.legend()
Analisis Sentiment Using Vader
Saya sudah tidak tau lagi apa yang bisa di jelaskan di sini wkw. Karena saya tidak tau apa apa tentang analisis sentimen tidak seperti teman saya yang jago jago.
!pip install vaderSentiment
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
# berfungsi untuk menghitung sentimen vader
def vadersentimentanalysis(review):
vs = analyzer.polarity_scores(review)
return vs['compound']
fin_data['Vader Sentiment'] = fin_data['Lemma'].apply(vadersentimentanalysis)
# berfungsi untuk menganalisa
def vader_analysis(compound):
if compound >= 0.5:
return 'Positive'
elif compound <= -0.5 :
return 'Negative'
else:
return 'Neutral'
fin_data['Vader Analysis'] = fin_data['Vader Sentiment'].apply(vader_analysis)
fin_data.head()
vader_counts = fin_data['Vader Analysis'].value_counts()
vader_counts
vader_counts= fin_data['Vader Analysis'].value_counts()
plt.figure(figsize=(10, 7))
plt.pie(vader_counts.values, labels = vader_counts.index, explode = (0.1, 0, 0), autopct='%1.1f%%',shadow=False)
# plt.legend()
Analisis Sentiment using SentiWordNet
Seriusan saya semakin tidak tau wkwk, bodoh banget ya ampun haha. Gila sih wkwk.
nltk.download('sentiwordnet')
from nltk.corpus import sentiwordnet as swn
def sentiwordnetanalysis(pos_data):
sentiment = 0
tokens_count = 0
for word, pos in pos_data:
if not pos:
continue
lemma = wordnet_lemmatizer.lemmatize(word, pos=pos)
if not lemma:
continue
synsets = wordnet.synsets(lemma, pos=pos)
if not synsets:
continue
# Take the first sense, the most common
synset = synsets[0]
swn_synset = swn.senti_synset(synset.name())
sentiment += swn_synset.pos_score() - swn_synset.neg_score()
tokens_count += 1
# print(swn_synset.pos_score(),swn_synset.neg_score(),swn_synset.obj_score()
if not tokens_count:
return 0
if sentiment>0:
return "Positive"
if sentiment==0:
return "Neutral"
else:
return "Negative"
fin_data['SWN analysis'] = mydata['POS tagged'].apply(sentiwordnetanalysis)
fin_data.head()
swn_counts= fin_data['SWN analysis'].value_counts()
swn_counts
swn_counts= fin_data['SWN analysis'].value_counts()
plt.figure(figsize=(10, 7))
plt.pie(swn_counts.values, labels = swn_counts.index, autopct='%1.1f%%', shadow=False)
# plt.legend()
Mungkin sampai tahap ini sudah selesai tinggal kita menvisualisasikan semuanya secara bersamaan.
Visual representation of TextBlob, VADER, SentiWordNet results
Kali ini kita akan menvisualisasi semua grafik di atas menjadi satu dan mungkin kita bisa menganalisis sentimentnya semuanya.
Dengan menggunakan code berikut ini.
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(15,7))
plt.subplot(1,3,1)
plt.title("TextBlob results")
plt.pie(tb_counts.values, labels = tb_counts.index, explode = (0, 0), autopct='%1.1f%%',shadow=False)
plt.subplot(1,3,2)
plt.title("VADER results")
plt.pie(vader_counts.values, labels = vader_counts.index, explode = (0, 0), autopct='%1.1f%%',shadow=False)
plt.subplot(1,3,3)
plt.title("SentiWordNet results")
plt.pie(swn_counts.values, labels = swn_counts.index, autopct='%1.1f%%', shadow=False)
Ohh ya kamu bisa menggunakan google colab atau jupyter notebook untuk mengoding python tersebut.
Penutup
Terima kasih sudah mengikuti artikel tidak jelas ini semoga kamu di berikan kemudahan dan kelancaran dalam segala hal. Sampai jumpa di artikel berikutnya. Babay.