Analisa Sentimen Data Twitter

Setelah berhasil mengambil data dari Twitter, selanjutnya kita dapat melakukan hal yang populer, analisa sentimen. Kita tidak sedang ingin pusing dengan masalah-masalah seperti ini atau ini. Oke, mungkin di masa depan kita akan memikirkan itu, tapi untuk sekarang kita hanya ingin mencoba yang dilakukan orang lain, memamerkan agregat opini netijen di twitland.

Sebenarnya cukup mudah untuk membuat sebuah sistem analisa sentimen data. Pilihan teknologi sudah melimpah sehingga tidak butuh banyak kode yang harus ditulis.

Teknologi yang akan kita gunakan adalah:

Yang perlu kita lakukan hanya mengambil data secukupnya untuk melatih model kita, memberi label pada data tersebut, membuat model, mengevaluasinya, lalu menjalankan model itu pada data baru.

Mudik

Adalah kata kunci yang akan kita gunakan, kita lihat apa “opini” netijen tentang tema mudik (saat tulisan ini dibuat mudik adalah topik yang cukup digemari).

Untuk memberi sedikit gambaran situasi bagi pembaca yang datang dari masa depan, sila membaca beberapa artikel ini.

Disclaimer: topik ini dipilih murni karena merupakan topik yang hangat dibicarakan sehingga ada jaminan terdapat data yang cukup melimpah untuk ditambang. Penulis sendiri berusaha untuk beropini dengan tidak beropini.

Mari kita mulai.


Instalasi Paket

Bagian ini adalah yang termudah. Melalui Command Prompt/Console/Terminal ketik perintah ini.

pip install tweepy
pip install textblob

Atau bila melalui cell pada Jupyter Notebook.

!pip install tweepy
!pip install textblob

Ambil Data

Ambil twit secukupnya untuk kemudian diberikan label secara manual.

import tweepy
import csv

consumer_key  = 'API key dari Twitter'
consumer_secret = 'API secret key'
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
api = tweepy.API(auth)

topic = 'mudik'
data = []
for tweet in tweepy.Cursor(api.search, q=topic).items(200):
    status = api.get_status(tweet.id, tweet_mode='extended')
    try:
        text = status.retweeted_status.full_text
    except AttributeError:
        text = status.full_text
    data.append([text, 1])

with open('tweet.csv', 'w') as csvfile:
    wr = csv.writer(csvfile)
    for d in data:
        wr.writerow(d)

Kode di atas akan cukup lama dieksekusi (5-10 menit) karena mengambil 200 twit kemudian satu per satu diambil ulang untuk mendapatkan teks lengkapnya. Lebih lanjut mengenai metode mendapatkan teks lengkap dapat dibaca di sini.

Jika pembaca tahu metode yang lebih cepat untuk mendapatkan 200 twit lengkap, silahkan tinggalkan komentar. Saat tulisan ini dibuat, penulis belum mengetahui metode yang lebih baik dari yang dituliskan di atas.

Data kemudian disimpan sebagai berkas csv yang diberi nama tweet.csv.

Berkas tweet.csv tersebut memiliki 2 kolom, yaitu berisi teks twit dan angka 1. Angka 1 tersebut yang akan dijadikan penanda opini positif atau negatif, jika negatif ganti dengan angka 0.


Melabeli Data

Prosedur ini adalah yang paling mahal. Pada kasus kita saja, kita harus membaca satu per satu twit dan memberi tanda 1 atau 0, alias memberi label tiap twit.

Selain melelahkan, pelabelan positif (angka 1) atau negatif (angka 0) juga (tentu saja) tidak bebas dari bias opini pribadi pemberi label. Sebagai ilustrasi Anda adalah pekerja pabrik mobil merk A, buat Anda opini “mobil A jele, boros” adalah negatif, namun bagi pembuat mobil merk B opini tersebut adalah positif karena meningkatkan peluang calon pembeli untuk memilih merk B.

Namun sekali lagi kita simpan dulu masalah-masalah itu. Kali ini cukup kita labeli saja data yang kita punya. Beri angka 0 jika negatif (tidak menyetujui langkah pemerintah) dan biarkan angka 1 jika positif (menyetujui keputusan pemerintah).

1 = Positif

0 = Negatif

Langkah selanjutnya adalah menyimpan berkas csv yang sudah diubah tersebut dengan nama “labeled.csv” untuk kita gunakan pada langkah selanjutnya.


Membuat Model

Setelah memberi label langkah selanjutnya sudah lebih mudah. Pertama ambil twit yang sudah diberi label.

labeled_tweet = []
with open('labeled.csv', 'r') as csvfile:
    cf = csv.reader(csvfile)
    for row in cf:
        labeled_tweet.append(row)

Pisahkan twit yang sudah diberi label positif dan negatif.

pos = []
neg = []

for l in labeled_tweet:
    if l[1] == '1':
        pos.append((l[0], 1))
    else:
        neg.append((l[0], 0))

Hasil pelabelan oleh penulis, didapatkan twit positif sebanyak 98 dan twit negatif sebanyak 102, angka ini mungkin berbeda pada hasil pelabelan pembaca.

Penulis akan mengambil 75 twit pada masing-masing opini sebagai data train dan 20 sebagai data test. Data train adalah data yang akan kita berikan kepada textblob untuk dipelajari, sedang data test adalah data yang akan digunakan untuk menguji apakah textblob sudah cukup belajar.

pos_train = pos[:75]
pos_test = pos[-20:]
neg_train = neg[:75]
neg_test = neg[-20:]

train = pos_train + neg_train
test = pos_test + neg_train

Lain kali saja kita menggunakan splitter untuk data train dan data test, kali ini kita gunakan yang sederhana saja.

Kemudian memerintahkan textblob untuk belajar.

from textblob.classifiers import NaiveBayesClassifier
cl = NaiveBayesClassifier(train)

Ternyata textblob perlu sesuatu untuk diinstal, kita ikuti saja perintahnya.

import nltk
nltk.download('punkt')

Proses mendownload punkt ini cukup sekali saja, untuk selanjutnya kita tidak perlu melakukan itu sehingga kode di atas dapat dihapuskan atau dijadikan komentar agar tidak dieksekusi.

Jalankan lagi kode ini.

cl = NaiveBayesClassifier(train)

Kode lengkap untuk bagian ini adalah seperti berikut, dikurangi instalasi punkt.

import csv
from textblob.classifiers import NaiveBayesClassifier

labeled_tweet = []
with open('labeled.csv', 'r') as csvfile:
    cf = csv.reader(csvfile)
    for row in cf:
        labeled_tweet.append(row)

pos = []
neg = []

for l in labeled_tweet:
    if l[1] == '1':
        pos.append((l[0], 1))
    else:
        neg.append((l[0], 0))

pos_train = pos[:75]
pos_test = pos[-20:]
neg_train = neg[:75]
neg_test = neg[-20:]

train = pos_train + neg_train
test = pos_test + neg_train

cl = NaiveBayesClassifier(train)

Sekarang kita sudah punya model yang dapat digunakan.


Mencoba pada Data Test

Untuk melihat hasil klasifikasi opini positif dan negatif textblob telah menyediakan fungsi classify dan untuk melihat akurasinya dibuatkan fungsi accuracy.

for t in test:
    print(t[0], '|----->', cl.classify(t[0]))

Akurasi dari model yang kita buat sebesar 87,36% (angka ini bisa berbeda pada pembaca), cara mengetahuinya dengan kode.

print(cl.accuracy(test))

Bagaimana jika kita kurang puas dengan akurasi yang didapatkan? Salah satu yang dapat kita lakukan adalah melakukan text preprocessing seperti menghapuskan url, menghapus tagar (#) atau tanda mention (@), menormalisasi kata (dri menjadi dari) dan lainnya.


Mencoba pada Data Terbaru

Sekarang saatnya mencoba model kita pada data kekiniyan.

topic = 'mudik'
for tweet in tweepy.Cursor(api.search, q=topic).items(10):
    status = api.get_status(tweet.id, tweet_mode='extended')
    try:
        text = status.retweeted_status.full_text
    except AttributeError:
        text = status.full_text
        
    print(text, '|----->', cl.classify(text))

Jalankan lagi kodenya, kita akan mendapat twit yang berbeda dan tentu saja hasil yang berbeda.


Notebook dapat diakses di sini.


Cover Photo by John Schnobrich on Unsplash

Leave a Reply

Your email address will not be published. Required fields are marked *