1. Home
  2. Docs
  3. Kelas Privat Python – 01
  4. Materi [Penerapan Python]
  5. Analisis Sentimen

Analisis Sentimen

Salah satu teknik untuk memperbaiki validitas dari data yang kita miliki adalah dengan melakukan pra-prosesi untuk teks. Artinya kita akan membersihkan data teks kita dari beberapa item yang sebenarnya tidak dibutuhkan saat mesin kita akan melakukan analisa. Tidak semua pra-prosesi ini dibutuhkan, penggunaannya disesuikan dengan kebutuhan masing-masing. Karena tidak selamanya sedikit itu menguntungkan.

Case folding

Case folding adalah teknik pembersihan dimana kita hanya menyisakan kata-kata dengan alfabet kecil, artinya semua angka, tanda baca, huruf besar, alamat situs, dsb diganti/dihilangkan.

Mengubah Teks Menjadi Lowercase

Mengubah suatu teks menjadi huruf kecil sangatlah penting saat akan melakukan pembersihan karena ini akan memudahkan kita dalam pencocokan. Contohnya saja saat akan melakukan pencarian kecamatan ‘Astanaanyar’ tidak dapat dilakukan jika pada dokumen ternyata tertulis ‘AstanaAnyar’. Tapi akan lebih mudah saat kita semua teks kita buat hurufnya menjadi kecil sehingga kita tahu yang kita cari adalah ‘astanaanyar’.

Untuk melakukan hal ini kita dapat memanfaatkan fungsi pada python, yaitu lowercase()

kalimat = "Rendang adalah makanan terenak nomer 1 di Dunia yang berasal dari Indonesia."
lower_case = kalimat.lower()
print(lower_case)

Maka akan menghasilkan,

# "rendang adalah makanan terenak nomer 1 di dunia yang berasal dari indonesia."

Menghapus angka

Pada beberapa kasus, angka merupakan hal yang tidak terlalu dibutuhkan terutama saat kita menilai analisis sentimen. Contohnya adalah kalimat

‘Budi menyukai 5 apel’

dan

‘Budi menyukai apel’

Tidak terlalu berbeda dan memiliki nilai sentimen yang sama yaitu positif. Hal ini dikarenakan kata ‘menyukai’ lebih penting saat akan melakukan analisis sentimen.

Untuk menghilangkan angka kita dapat memanfaatan modul re (reguler expression) yang dimiliki python

import re

kalimat = "Rendang adalah makanan terenak nomer 1 di Dunia yang berasal dari Indonesia."

hasil = re.sub(r"\d+", "", kalimat)
print(hasil)

re.sub merupakan fungsi yang digunakan untuk melakukan penggantian pada suatu kalimat. Pada fungsi ini terdapat 3 variabel yang harus dimasukkan.

variabel pertama adalah variabel yang akan diganti, pada kasus ini kita menggunakan “\d+” yang artinya kita akan mencari angka (decimal) pada kalimat, ‘+’ artinya dia akan mengikutsertakan karakter setelah angka tersebut yang tidak dipisah oleh spasi. (misal, 1a, 2hari).

variabel kedua adalah variabel pengganti yang kita inginkan, pada kasus ini kita menggunakan “”. Ini artinya kita tidak menggantinya dengan karakter apapun dan hanya menghapusnya.

variabel ketiga adalah data teks yang akan kita olah, pada kasus ini adalah variabel ‘kalimat’.

fungsi di atas saat kita tampilkan akan menghasilkan,

#Rendang adalah makanan terenak nomer di Dunia yang berasal dari Indonesia."

Menghapus tanda baca

Sama halnya dengan angka, tanda baca dalam kalimat tidak memiliki pengaruh pada saat kita akan melakukan analisis sentiment. Menghapus tanda baca seperti [!”#$%&’_`~] dapat dilakukan di pyhton dengan memanfaatkan modul string.

import str

kalimat = "membaca& adalah__ kunci dari kehidupan!!"
hasil = kalimat.translate(str.maketrans("","",string.punctuation))
print(hasil)

Maka hasilnya adalah,

#membaca adalah kunci dari kehidupan

Menghapus whitespaces

Sering kali saat kita mengambil data dengan menggunakan teknik webscraping atau mengambil via api langsung dari twitter karakter seperti newline (\n) atau newtab (\t) masih sering kita dapatkan padahal hal tersebut tidak kita butuhkan. Hal ini dapat kita hilangkan dengan memanfaatkan metode strip pada string.

kalimat = " \t membaca ada kunci\t "
hasil = kalimat.strip()
print(hasil)

maka akan menghasilkan,

#membaca adalah kunci

Tokenizing

Tokenizing adalah teknik pemisahan sebuah kalimat menjadi kata per kata yang biasa disebut token. Contohnya adalah kalimat,

Aku bermain sepakbola di lapangan

menjadi

['aku','bermain','sepakbola','di','lapangan']

Fungsinya adalah agar kita dapat lebih mudah melakukan analisis data terhadap kata yang keluar. Misalkan kita ingin menghitung kata apa yang sering keluar, berapa kali kata tersebut keluar dan semacamnya. Hal ini dapat kita lakukan dengan memanfaatkan fungsi split.

kalimat = "Budi suka bermain bola"
pisah = kalimat.split()
print(pisah)

maka akan menghasilkan,

#['Budi','suka','bermain','bola']

Filtering (Stopword)

Filtering adalah menghilangkan kata-kata yang tidak terpakai atau banyak digunakan dari kalimat (stopword). Kata tersebut bisa kata sambung atau kata ganti orang, contohnya

Aku menyukai masakan di restoran depan kantor

menjadi,

Menyukai masakan restoran kantor

Hal ini dilakukan karena sama seperti angka kata sambung kadang tidak terlalu berpengaruh pada saat kita akan melakukan analisis sentiment.

query = 'budi dan ani menyukai makanan jepang dan china'
stopwords = ['dan']
querywords = query.split()

resultwords  = [word for word in querywords if word not in stopwords]
result = ' '.join(resultwords)

print(result)

Maka akan menghasilkan,

#budi ani menyukai makanan jepang china

Yang harus diingat pada saat melakukan stopword adalah kadang tidak semua kasus kita harus melakukan stopword, terutama pada kasus yang kita ingin melihat makna suatu kalimat. Pertimbangan pemakaian filtering ini tergantung pada user.

Stemming

Stemming adalah teknik dimana kita mengembalikan semua kata ke dalam bentuk dasarnya. contohnya,

Ayah membeli dua buah bola berwarna merah di tempat penjualan mainan.

menjadi,

Ayah beli dua buah bola warna merah di tempat jual main

Kita akan menggunakan bantuan library khusus untuk melakukan stemming yang akan dijelaskan pada kesempatan selanjutnya.

NLTK & Sastrawi

Pada Kesempatan sebelumya kita telah mempelajari tentang analisis sentimen sederhana dengan menggunakan dataset kata positif dan negatif. Teknik itu penting untuk kita yang belum memiliki dataset tweet yang telah terlabel sehingga kita tidak dapat melakukan learn jika ingin menggunakan algoritma mesin.

Seperti yang kita pelajari sebelumnya, kemampuan kita untuk melakukan pra-proses terhadap teks yang akan analisis menjadi sangat penting. Alasannya adalah karena itu akan mengurangi jumlah noise dalam data dan pada beberapa kesempatan mengurangi beban kerja dari mesin kita.

Ada dua library yang dapat kita gunakan, pertama adalah NLTK dan kedua adalah Sastrawi.

NLTK

NLTK adalah kependekan dari Natural Language Tool Kit, sebuah library yang digunakan untuk memudahkan kita dalam melakukan pengolahan terhadap bahasa. Beberapa kemampuan yang dimiliki oleh NLTK diantaranya adalah,

  • Tokenize kedalam kalimat atau kata
  • Stopwords
  • Stemming atau pengembalian ke dalam bentuk dasar
  • Corpus
  • Dll

Salah satu library yang mumpuni saat kita akan melakukan kegiatan NLP atau Natural Language Processing. Akan tetapi, salah satu kekurangan dari library ini adalah dukungannya yang lebih berat ke dalam bahasa inggris, sehingga pengembangan dalam bahasa indonesia masih perlu dilakukan lagi.

Untuk melakukan instalasi pada python kita dapat memanfaatkan pip,

pip install nltk

lau kita install semua library yang kita butuhkan,

python -m nltk.downloader popular

Tokenize

Tokenize dalam NLTK dapat dilakukan ke dalam dua bagian, yaitu kalimat dan kata. Untuk melakukan tokenize kalimat kita menggunakan, metode sent_tokenize, sedangkan untuk melakukan tokenize kata kita akan menggunakan word_tokenize

from nltk.tokenize import sent_tokenize, word_tokenize

kalimat = 'Saya senang bermain bola. Adik saya senang bermain basket.'

Jika kita coba lakukan tokenize kalimat ke dalam kalimat tersebut maka kan menghasilkan,

t_kalimat = sent_tokenize(kalimat)
print (t_kalimat)
#['Saya senang bermain bola.', 'Adik saya senang bermain basket.']

Jika kita coba lakukan tokenize kata ke dalam kalimat tersebut maka kan menghasilkan,

t_kata = word_tokenize(kalimat)
print (t_kata)
#['Saya', 'senang', 'bermain', 'bola', '.', 'Adik', 'saya', 'senang', 'bermain', 'basket', '.']

Stopwords

Stopwords adalah kata-kata yang biasanya tidak memiliki arti khusus dalam sebuah kalimat dan sering keluar dalam kalimat, seperti aku, yang, dia, akan, dsb. NLTK memiliki dataset stopword selain bahasa inggris juga bahasa indonesia.

from nltk.corpus import stopwords

english_s = stopwords.words('english')
indonesia_s = stopwords.words('indonesian')

print(len(english_s), "stopwords:", english_s)
print(len(indonesia_s), "stopwords:", indonesia_s)

#179 stopwords: ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves',...]
#758 stopwords: ['ada', 'adalah', 'adanya', 'adapun', 'agak', 'agaknya', 'agar', 'akan',...]

Stemming

Stemming adalah mengembalikan ke dalam kata dasar. Pada library NLTK kemampuan ini masih terbatas pada bahasa inggris.

from nltk.stem import PorterStemmer
 
st = PorterStemmer()
print(st.stem('monitoring'))
# monitor
print(st.stem('stemmed'))
#stem

Sastrawi

Sastrawi adalah library NLP yang dikhususkan untuk bahasa indonesia. Untuk awal mulanya sastrawi diperuntukan untuk bahasa pemograman PHP, akan tetapi selanjutnya dilakukan juga pengalihan ke dalam bahasa pemograman python.

untuk melakukan instalasi cukup dengan

pip install sastrawi

Salah satu kelebihan sastrawi yang tidak dimiliki oleh NLTK adalah kemampuan stemming dalam bahasa Indonesia.

from Sastrawi.Stemmer.StemmerFactory import StemmerFactory

factory = StemmerFactory()
stemmer = factory.create_stemmer()

# stemming process
sentence = 'Perkembangan kuliner di indonesia cukup membanggakan dalam 10 tahun terakhir'
output   = stemmer.stem(sentence)

print(output)
#kembang kuliner di indonesia cukup bangga dalam 10 tahun akhir

Mengolah Berita

Pada kesempatan kali kita akan mencoba untuk mencoba mengimplementasikan text preprocessing menggunakan NLTK terhadap suatu berita. Langkah-langkah yang akan kita lakukan adalah

  • Mengambil data pada situs berita
  • Melakukan Text-Preprocessing pada data
  • Menampilkan hasil untuk dilakukan analisis

Mengambil berita dari situs berita

Berita yang akan kita ambil berasal dari situs kompasdotcom. kita akan memilih satu berita dan mencoba melakukan analisis.

Pertama kita import semua library yang dibutuhkan

from urllib.request import urlopen, Request
from bs4 import BeautifulSoup as bs
import requests

Setelah itu kita lakukan requses pada alamat yang kita tuju. pada kesempatan kali ini kita mencoba mengambil berita dari

https://nasional.kompas.com/read/2020/10/15/18022671/polri-ungkap-percakapan-para-tersangka-di-grup-whatsapp-kami-medan?page=all#page2

user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14'
headers = {'User-Agent': user_agent,'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}

alamat = "https://nasional.kompas.com/read/2020/10/15/18022671/polri-ungkap-percakapan-para-tersangka-di-grup-whatsapp-kami-medan?page=all#page2"
req = Request(alamat, headers=headers)
html = urlopen(req)

Setelah itu kita akan mencoba untuk mengambil data dengan memanfaatkan beautifulsoup

data = bs(html, 'html.parser')
box = data.find("div",{"class":"read__content"})

hidelabel = box.findAll('strong')
for delete in hidelabel:
    delete.decompose()

items = box.findAll('p')
hasil = [item.get_text() for item in items]

Saat melakukan inspeksi ternyata semua paragraf berita berada pada tag div dan class read__content. Sayangnya di dalam tag tersebut juga ada element iklan yang cukup mengganggu. Setelah dicek ternyata, iklan tersebut berada di dalam tag strong, maka dari itu kita coba bersihkan dengan menggunakan metode decompose. Jika kita lakukan print maka hasilnya adalah.

[' - Polisi menangkap admin serta anggota grup aplikasi WhatsApp bernama “ KAMI Medan” karena diduga terkait aksi menolak  UU Cipta Kerja yang berujung rusuh di Medan, Sumatera Utara.', 'Total empat orang yang ditangkap di Medan dalam kurun waktu 9-12 Oktober 2020, yakni KA, JG, NZ, WRP.', 'KA atau Khairi Amri merupakan Ketua Koalisi Aksi Menyelamatkan Indonesia (KAMI) Medan. Kepala Divisi Humas  Polri Irjen Argo Yuwono menyebut KA sebagai admin grup tersebut.', '“Yang dimasukkan ke WAG ini ada foto kantor DPR RI dimasukkan di WAG, kemudian tulisannya, ‘Dijamin komplit, kantor, sarang maling dan setan’, ada di sana tulisannya,” ucap Argo di Gedung Bareskrim, Jakarta Selatan, Kamis (15/10/2020).', '', 'Kemudian, KA, menurut polisi, juga menulis “Mengumpulkan saksi untuk melempari DPR dan melempari polisi” serta “Kalian jangan takut dan jangan mundur” di grup tersebut.', 'Kemudian, di grup yang sama, tersangka JG diduga menulis instruksi pembuatan skenario seperti kerusuhan Mei 1998.', '“Kemudian ada juga (JG) menyampaikannya ‘Buat skenario seperti 98’, kemudian ‘Penjarahan toko China dan rumah-rumahnya’, kemudian ‘Preman diikutkan untuk menjarah’,” kata Argo.', 'Tersangka JG juga diduga menulis perihal bom molotov yang menurut polisi berbunyi “Batu kena satu orang, bom molotov bisa kebakar 10 orang dan bensin bisa berjajaran”.', '', 'Aparat pun mengklaim telah menemukan bom molotov saat aksi di Medan tersebut. Bom molotov itu, katanya, diduga dilempar dan membakar sebuah mobil.', 'Untuk tersangka NZ, polisi menuturkan, perannya juga menulis di grup tersebut.', '“Dia (NZ) menyampaikan bahwa ‘Medan cocoknya didaratin. Yakin pemerintah sendiri bakal perang sendiri sama China’,” tuturnya.', 'Terakhir, tersangka WRP diduga menyampaikan perihal kewajiban membawa bom molotov.', 'Argo menuturkan, WRP menulis “Besok wajib bawa bom molotov”.', '', 'Dalam kasus tersebut, polisi menyita barang bukti berupa telepon genggam, dokumen percakapan para tersangka, serta uang Rp 500.000.', 'Menurut Argo, uang tersebut dikumpulkan melalui grup WhatsApp tersebut untuk logistik saat aksi.', 'Keempat tersangka dijerat Pasal 28 ayat 2 jo Pasal 45A ayat 2 UU ITE dan Pasal 160 KUHP. Ancaman hukumannya 6 tahun penjara.', 'Saat ini, seluruh tersangka ditahan di Rutan Salemba cabang Bareskrim Polri. Polisi menegaskan tidak akan mengabulkan penangguhan penahanan.']

Melakukan pembersihan

Setelah Berhasil mendapatkan datanya maka kita akan mecoba melakukan pembersihan sederhana dengan bantuan libary NLTK. yang pertama akan kita lakukan adalah mengecilkan semua huruf dan menghilangkan karakter yang kurang penting.

Kita import library yang dibutuhkan

import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

Lalu kita mulai bersihkan data kita,

hasil = [item.lower() for item in hasil]
hasil = [' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", item).split()) for item in hasil]

paragraf = ' '.join(hasil)
stop_words = set(stopwords.words('indonesian'))
word_tokens = word_tokenize(paragraf) 
paragraf_2 = ' '.join([w for w in word_tokens if not w in stop_words])

print (paragraf_2)

Setelah menghilangkan karakter dan mengecilkan huruf kita menghilangkan stopword pada data kita. Untuk menghilangkan stopword ini kita memanfaatkan metode word_tokenize yang dimiliki oleh NLTK untuk memisahkan setiap katanya. Saat kita melakukan print pada data kita akan menghasilkan.

polisi menangkap admin anggota grup aplikasi whatsapp bernama medan diduga terkait aksi menolak uu cipta kerja berujung rusuh medan sumatera utara total orang ditangkap medan kurun 9 12 oktober 2020 ka jg nz wrp ka khairi amri ketua koalisi aksi menyelamatkan indonesia medan kepala divisi humas polri irjen argo yuwono menyebut ka admin grup dimasukkan wag foto kantor dpr ri dimasukkan wag tulisannya dijamin komplit kantor sarang maling setan tulisannya argo gedung bareskrim jakarta selatan kamis 15 10 2020 ka polisi menulis mengumpulkan saksi melempari dpr melempari polisi takut mundur grup grup tersangka jg diduga menulis instruksi pembuatan skenario kerusuhan mei 1998 jg menyampaikannya skenario 98 penjarahan toko china rumah rumahnya preman diikutkan menjarah argo tersangka jg diduga menulis perihal bom molotov polisi berbunyi batu kena orang bom molotov kebakar 10 orang bensin berjajaran aparat mengklaim menemukan bom molotov aksi medan bom molotov diduga dilempar membakar mobil tersangka nz polisi perannya menulis grup nz medan cocoknya didaratin pemerintah perang china tersangka wrp diduga perihal kewajiban membawa bom molotov argo wrp menulis besok wajib bawa bom molotov polisi menyita barang bukti telepon genggam dokumen percakapan tersangka uang rp 500 000 argo uang dikumpulkan grup whatsapp logistik aksi keempat tersangka dijerat pasal 28 ayat 2 jo pasal 45a ayat 2 uu ite pasal 160 kuhp ancaman hukumannya 6 penjara tersangka ditahan rutan salemba cabang bareskrim polri polisi mengabulkan penangguhan penahanan

Hasil akhir kode kita menjadi

from urllib.request import urlopen, Request
from bs4 import BeautifulSoup as bs
import requests
import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14'
headers = {'User-Agent': user_agent,'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}

alamat = "https://nasional.kompas.com/read/2020/10/15/18022671/polri-ungkap-percakapan-para-tersangka-di-grup-whatsapp-kami-medan?page=all#page2"
req = Request(alamat, headers=headers)
html = urlopen(req)


data = bs(html, 'html.parser')
box = data.find("div",{"class":"read__content"})
hidelabel = box.findAll('strong')
for delete in hidelabel:
    delete.decompose()
items = box.findAll('p')
hasil = [item.get_text() for item in items]


hasil = [item.lower() for item in hasil]
hasil = [' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", item).split()) for item in hasil]
paragraf = ' '.join(hasil)
stop_words = set(stopwords.words('indonesian'))
word_tokens = word_tokenize(paragraf) 
paragraf_2 = ' '.join([w for w in word_tokens if not w in stop_words])

Analisis Sentimen

Analisis Sentimen adalah kegiatan kita dalam menganalisa dan menilai suatu sentimen dalam sebuah kalimat. Dalam data science dan business intelegent ini merupakan salah satu hal yang penting karena kita dapat menilai reaksi pasar/masyarakat terhadap suatu produk/topik melalui opini yang mereka keluarkan. Sumbernya bisa banyak, contohnya kuisioner, wawancara, atau yang sedang terkenal sekarang, media sosial.

Secara umum, Analisis Sentimen ini dibagi menjadi 2 kategori besar :

  1. Coarse-grained sentiment analysis
  2. Fined-grained sentiment analysis

Coarse-grained sentiment analysis merupakan analisis sentimen yang dikerjakan pada tingkat dokumen sedangkan Fined-grained sentiment analysis bekerja pada tingkat kalimat

Contoh sederhana dari Fined-grained sentiment analysis adalah:

  • Saya suka makan bakso – (Suka – positif)
  • Saya selalu berusaha menghindari kemacetan (menghindari – negatif)

Dengan mengolah suatu data melalui Analisis Sentimen maka perusahaan dapat mengeluarkan kebijakan yang lebih akurat yang mengikuti arus opini masyarakat. Atau bisa menjadi salah satu sarana evaluasi kebijakan apakah dapat diterima dengan baik oleh masyarakat atau tidak.

Langkah – langkah saat kita akan melakukan analisis sentimen secara garis besar adalah :

  • Siapkan data yang akan kita gunakan
  • lakukan pembersihan data (pra-proses)
  • lakukan pengolahan analisis sentimen
  • Presentasikan

Pada kesempatan kali ini kita akan melakukan analisis sentimen sederhana dengan menggunakan perbandingan isi kalimat terhadap suatu kumpulan kata sentimen. Maka dari itu kita harus menyiapkan database kata sentimen positif dan negatif. Database tersebut sudah saya siapkan dalam file di bawah (sumber: https://github.com/riochr17/Analisis-Sentimen-ID )

Pertama mari kita ambil data yang kita butuhkan dari media sosial twitter.

import tweepy
import re
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

consumer_key = ["kode kalian"]
consumer_secret = ["kode kalian"]
access_token = ["kode kalian"]
access_token_secret = ["kode kalian"]


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

Untuk melakukan pencarian tweet kita akan mengunakan kode api.search kita juga akan menggunakan cursor disini. Sebelumnya kita akan menentukan kata kunci pencarian kita dan tanggal mulai diambilnya tweet. Untuk saat ini mari kita cari kata kunci “covid” dan “2020-07-23”

search_words = "covid"
date_since = "2020-07-23"
new_search = search_words + " -filter:retweets"

tweets = tweepy.Cursor(api.search,
        q=new_search,
        lang="id",
        since=date_since).items(10)

filter disini digunakan untuk melakukan pengecualian pada konten Retweet.
q merupakan query/kata kunci yang dipakai
lang merupakan bahasa pencarian
items digunakan untuk melakukan pembatasan hasil pencarian

Karena tweet nanti akan berupa list maka kita akan melakukan loop untuk mengambil masing-masing data. Dalam loop ini kita akan langsung melakukan pembersihan data dari kata/karakter seperti @, link, dsb.

    items = []
    for tweet in tweets:
        items.append (' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet.text).split()))
    hasil = pd.DataFrame(data=items, columns=['tweet'])

Data tweet sudah kita dapatkan maka mari sekarang kita lakukan evaluasi dan analisis nilai positif dan negatif semua kalimat yang telah kita ambil. Pertama kita buka file list kata positif dan negatif yang kita punya lalu untuk setiap kalimat yang kita miliki kita akan menghitung terdapat berapa kata positif dan negatif.

pos_list= open("kata_positif.txt","r")
pos_kata = pos_list.readlines()
neg_list= open("kata_negatif.txt","r")
neg_kata = neg_list.readlines()  

sentiments = [] #Membuat sebuah list menyimpan nilai sentiment

#membuat list kata-kata negasi
list_anti = ['tidak','lawan','anti', 'belum', 'belom', 'tdk', 'jangan', 'gak', 'enggak', 'bukan', 'sulit', 'tak', 'sblm']

#fungsi menghitung sentiment setiap tweet
for item in items:
    print(item.strip())
    tweets = item.strip().split() #tokenization
    # print(tweets)
    
    count_p = 0 #nilai positif
    count_n = 0 #nilai negatif
    
    for tweet in tweets:
        for kata_pos in pos_kata:
            if kata_pos.strip().lower() == tweet.lower():
                #items.index(item)-1 digunakan untuk mencari nilai index sebelum index positifnya
                #aku menyukai bola
                if items[items.index(item)-1] in list_anti:
                    print(items[items.index(item)-1], kata_pos, ['negatif'])
                    count_n += 1
                else:
                    print(kata_pos, ['positif'])
                    count_p += 1
        for kata_neg in neg_kata:
            if kata_neg.strip().lower() == tweet.lower():
                if items[items.index(item)-1] in list_anti:
                    print(items[items.index(item)-1], kata_neg, ['positif'])
                    count_p += 1
                else:
                    print(kata_neg, ['negatif'])
                    count_n += 1
    
    print ("positif: "+str(count_p))
    print ("negatif: "+str(count_n))

Sekarang mari kita hitung evaluasi dari sentimen kita dengan persamaan berikut

Total Nilai = Nilai Positif - Nilai Negatif

Total Nilai > 0, maka sentimen positif
Total Nilai < 0, maka sentimen negatif
Total Nilai = 0, maka sentimen netral

Hasil perhitungan kita masukkan ke dalam dataframe pandas agar lebih mudah untuk memanipulasi dan melihat. Lalu kita coba cari nilai rata-rata dan standar deviasinya.

sentiments = [] #Membuat sebuah list menyimpan nilai sentiment

#membuat list kata-kata negasi
list_anti = ['tidak','lawan','anti', 'belum', 'belom', 'tdk', 'jangan', 'gak', 'enggak', 'bukan', 'sulit', 'tak', 'sblm']

#fungsi menghitung sentiment setiap tweet
for item in items:
    print(item.strip())
    tweets = item.strip().split() #tokenization
    # print(tweets)
    
    count_p = 0 #nilai positif
    count_n = 0 #nilai negatif
    
    for tweet in tweets:
        for kata_pos in pos_kata:
            if kata_pos.strip().lower() == tweet.lower():
                #items.index(item)-1 digunakan untuk mencari nilai index sebelum index positifnya
                #aku menyukai bola
                if items[items.index(item)-1] in list_anti:
                    print(items[items.index(item)-1], kata_pos, ['negatif'])
                    count_n += 1
                else:
                    print(kata_pos, ['positif'])
                    count_p += 1
        for kata_neg in neg_kata:
            if kata_neg.strip().lower() == tweet.lower():
                if items[items.index(item)-1] in list_anti:
                    print(items[items.index(item)-1], kata_neg, ['positif'])
                    count_p += 1
                else:
                    print(kata_neg, ['negatif'])
                    count_n += 1
    
    print ("positif: "+str(count_p))
    print ("negatif: "+str(count_n))
    sentiments.append(count_p - count_n)

Kita lakukan plot terhadap data,

    labels, counts = np.unique(hasil, return_counts=True)
    plt.bar(labels, counts, align='center')
    plt.gca().set_xticks(labels)
    plt.show()

Hasil yang kita dapat adalah,

Nilai rata-rata: -0.3
Standar deviasi: 1.1

Plot Nilai Sentimen terhadap jumlah

Artinya bahwa untuk jumlah tweet 10 buah Sentimen masyarakat twitter masih berada ke arah sedikit negatif untuk bahasan covid. Dari sini kita tahu bahwa dengan database kata yang baik dan jumlah data mentah yang mumpuni akan membuat analisis sentimen menjadi alat yang cukup kuat untuk melihat kecenderungan pasar. Analisis lebih lanjut dari data juga akan menguatkan kesimpulan yang didapat dari proses analisis sentimen.