Analisis Sentimen terhadap Opini Publik Melalui Jejaring Sosial Twitter Menggunakan Metode Naïve Bayes.

(1)

iv Universitas Kristen Maranatha

ANALISIS SENTIMEN TERHADAP OPINI PUBLIK MELALUI JEJARING SOSIAL TWITTER MENGGUNAKAN METODE NAIVE BAYES

Alfarizy M. G. (0927050)

Jurusan Sistem Komputer, Fakultas Teknik, Universitas Kristen Maranatha

Jalan Prof. Drg. Suria Sumantri MPH No. 65 Bandung 40164

ABSTRAK

Manusia adalah makhluk sosial dan mereka berkomunikasi satu sama lain. Saat ini, orang banyak berinteraksi menggunakan media sosial salah satunya Twitter. Bahkan Presiden Indonesia menggunakan Twitter untuk mengungkapkan perasaan, sentimen, dan ide menurut aspek yang berbeda setiap hari. Banyak tokoh politik menggunakan Twitter di Indonesia seperti Gubernur DKI Jakarta Basuki Tjahaja Purnama (Ahok) dengan basuki_btp sebagai username-nya.

Ahok adalah tokoh politik kontroversial dengan gayanya memimpin Jakarta. Seringkali ia bersemangat mengungkapkan perasaannya bahkan cenderung marah. Penelitian ini dapat menentukan sentimen masyarakat terhadap Ahok. Penelitian ini menggunakan tiga kategori sentimen: positif, negatif, dan netral. Algoritma Naive Bayes dapat mengklasifikasikan sentimen orang terhadap Ahok. Dengan metode cleansing, case folding, parsing, stopping, dan metode term frequency untuk menyaring input teks.


(2)

SENTIMENT ANALYSIS TO PUBLIC FIGURE BY SOCIAL MEDIA TWITTER USING NAIVE BAYES METHODE

Alfarizy M. G. (0927050)

Jurusan Sistem Komputer, Fakultas Teknik, Universitas Kristen Maranatha

Jalan Prof. Drg. Suria Sumantri MPH No. 65 Bandung 40164

ABSTRACT

Humans are social beings and they loved to communicate with each other. Nowadays people interact using social media such as Twitter. Even Indonesian president used Twitter to express their feelings, sentiments, and idea of different aspects everyday. Many political figures in Indonesia used Twitter such as Governor of DKI Jakarta Basuki Tjahaja Purnama (Ahok) with @basuki_btp as his username.

Ahok is a controversial political figure with his style to lead Jakarta. He often express his feelings passionately even more angry. This research can determined sentiment of people to Ahok. This research used three class of sentiment: positive, negative, and netral. Naive bayes algorithm can classify sentiment of people to Ahok. This cleansing, case folding, parsing, stopping, and term frequency method to filter the text input.


(3)

viii Universitas Kristen Maranatha

DAFTAR ISI

LEMBAR PENGESAHAN ... i

PERNYATAAN ORISINALITAS LAPORAN TUGAS AKHIR... v

PERNYATAAN PUBLIKASI LAPORAN TUGAS AKHIR ... i

ABSTRAK ... vi

ABSTRACT ... viii

KATA PENGANTAR ... vi

DAFTAR GAMBAR ... xii

DAFTAR TABEL ... xiv

DAFTAR ISI ... viii

BAB I PENDAHULUAN ... 1

1.1 Latar Belakang ... 1

1.2 Identifikasi masalah ... 3

1.3 Tujuan ... 3

1.4 Pembatasan Masalah ... 3

1.5 Sistematika Penulisan ... 4

BAB II LANDASAN TEORI ... 6

2.1 Analisis Sentimen ... 6

2.2 Text Mining ... 8

2.2.1 Text Preprocessing ... 8

2.2.2 Pemilihan Fitur ... 8

2.3 Twitter ... 11


(4)

2.5 Algoritma Naive Bayes ... 17

2.6 Flowchart (Diagram Alir) ... 17

2.7 Database MySQL ... 17

2.7.1 SQLyog ... 21

2.8 Pemrograman Java ... 22

2.8.1 Kelebihan Pemrograman Java ... 23

2.8.2 Kekurangan Pemrograman Java ... 25

2.8.3 Konsep Pemrograman Berorientasi Objek ... 26

2.8.3.1 Abstraksi ... 26

2.8.3.2 Pembungkusan ... 27

2.8.3.3 Pewarisan ... 27

2.8.3.4 Polimorfisme ... 28

2.9 Regex ... 28

2.9 NetBeans ... 29

BAB III PERANCANGAN ... 31

3.1 Perancangan Database ... 31

3.1.1 Tabel TWEETMASTER ... 32

3.1.2 Tabel TWEETNGRAM ... 32

3.1.3 Tabel STOPLIST ... 33

3.1.4 Tabel SENTIMEN ... 34

3.1.5 Tabel PROBABILITAS ... 34

3.1.6 Tabel INTISARI ... 35

3.2 Data Tweet ... 36

3.3 Pengambilan Data dari Twitter... 37


(5)

x Universitas Kristen Maranatha

3.5 Pemilihan Fitur ... 48

3.6 Pembobotan ... 52

3.6 Contoh Penerapan Metode Naive Bayes Classifier ... 54

BAB IV PENGUJIAN ... 59

4.1 Spesifikasi Hardware dan Software yang Digunakan ... 59

4.2 Database ... 60

4.2.1 Tabel TWEETMASTER ... 60

4.2.2 Tabel TWEETNGRAM ... 61

4.2.3 Tabel PROBABILITAS ... 62

4.2.4 Tabel INTISARI ... 63

4.2.5 Tabel STOPLIST ... 64

4.2.6 Tabel SENTIMEN ... 66

4.3 Implementasi Sistem ... 66

4.3.1 Taampilan Tweet Ngram ... 67

4.3.2 Tampilan Hasil Pemilihan Fitur & Perhitungan Probabilitas ... 68

4.3.3 Tampilan Perhitungan Probabilitas Tertinggi ... 69

4.3.4 Tampilan Data Training ... 70

4.3.5 Tampilan Kumpulan Stopword ... 71

4.4 Hasil Akhir Klasifikasi ... 72

BAB V KESIMPULAN & SARAN ... 74

5.1 Kesimpulan ... 74

5.2 Saran ... 74

Daftar Pustaka ... 75 LAMPIRAN A ... A1 LAMPIRAN B ... B1


(6)

LAMPIRAN C ... C1 LAMPIRAN D ... D1 LAMPIRAN E ... E1


(7)

xii Universitas Kristen Maranatha

DAFTAR GAMBAR

Gambar 2.1 Logo Twitter ... 11

Gambar 2.2 Logo SQLyog ... 21

Gambar 2.3 Tampilan SQLyog ... 22

Gambar 2.4 Logo Java ... 23

Gambar 2.5 Logo NetBeans ... 29

Gambar 3.1 Relasi antar tabel ... 31

Gambar 3.2 Skema pengambilan tweet ... 37

Gambar 3.3 Halaman Application Management ... 38

Gambar 3.4 Keys and access tokens ... 39

Gambar 3.5 Consumer keys and secret ... 40

Gambar 3.6 Access tokens and secret ... 40

Gambar 3.7 Implementasi pengambilan data dari Twitter ... 41

Gambar 3.8 flowchart penelitian ... 44

Gambar 3.9 Flowchart Text Preprocessing ... 46

Gambar 3.10 Contoh kalimat yang akan di input ... 47

Gambar 3.11 Kalimat setelah melalui tahap cleansing ... 47

Gambar 3.12 Kalimat setelah melalui tahap case folding ... 47

Gambar 3.13 Implementasi text preprocessing menggunakan REGEX ... 48

Gambar 3.14 flowchart pemilihan fitur stopping ... 50

Gambar 3.15 Hitung P(xi|Vj) ... 54

Gambar 4.1 Tabel TWEETMASTER ... 61

Gambar 4.2 Tabel TWEETNGRAM ... 62

Gambar 4.3 Tabel PROBABILITAS ... 63

Gambar 4.4 Tabel INTISARI ... 64

Gambar 4.5 Tabel STOPLIST ... 65

Gambar 4.6 Tabel SENTIMEN ... 66

Gambar 4.7 Menjalankan program ... 67

Gambar 4.8 Tampilan tweet ngram ... 68


(8)

Gambar 4.10 Tampilah VMAP ... 70

Gambar 4.11 Tampilan data training ... 71

Gambar 4.12 Tampilan kumpulan stopword ... 72


(9)

xiv Universitas Kristen Maranatha

DAFTAR TABEL

Tabel 2.1 Contoh pemotongan n-gram berbasis kata ... 10

Tabel 2.2 Simbol-simbol flowchart ... 17

Tabel 2.3 Simbol-simbol flowchart (lanjutan) ... 18

Tabel 3.1 Field pada tabel TWEETMASTER ... 32

Tabel 3.2 Field pada tabel TWEETNGRAM ... 33

Tabel 3.3 Field pada tabel STOPLIST ... 34

Tabel 3.4 Field pada tabel SENTIMEN ... 34

Tabel 3.5 Field pada tabel PROBABILITAS ... 35

Tabel 3.6 Field pada tabel INTISARI ... 36

Tabel 3.7 Hasil dari text preprocessing ... 48

Tabel 3.8 Hasil dari pemilihan fitur stopping ... 51

Tabel 3.9 Kumpulan stopword ... 51

Tabel 3.10 Hasil pemilihan fitur ... 52

Tabel 3.11 Tabel SENTIMEN ... 53

Tabel 3.12 Contoh perhitungan nilai probabilitas ... 55

Tabel 3.13 Nilai probabilitas kata ... 56

Tabel 3.14 Isi tabel PROBABILITAS ... 56

Tabel 3.15 Isi tabel INTISARI ... 57


(10)

LAMPIRAN A

Lampiran ini berisi coding main class yang diberi nama ClassLatihan.java. Bagian ini adalah bagian utama. Ini adalah kelas utama yang menjalankan program pada penelitian ini.

package packageLatihan;

import com.mycompany.mavenproject1.NgramTest; import java.util.Iterator;

import java.util.List;

import java.util.logging.Level; import java.util.logging.Logger; import model.Probabilitas; import twitter4j.Query; import twitter4j.QueryResult; import twitter4j.Status; import twitter4j.Twitter;

import twitter4j.TwitterException; import twitter4j.TwitterFactory;

import twitter4j.conf.ConfigurationBuilder;

/** *

* @author alzygumgum */

public class ClassLatihan {

public static void main(String[] args) { try {

ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true)


(11)

2

.setOAuthConsumerKey("YS3r38C3XpmO4LmK4mZRD5UD0")

.setOAuthConsumerSecret("8CTkq8x62AKUu327Y0UchE8EqGVrybQcTWcWdUYEogdb AmYxby")

.setOAuthAccessToken("65427688-ezABWUv1F9i3WHxS25hIDDD3o6FIRmY4bMhX9nl54")

.setOAuthAccessTokenSecret("soxsVaJzR413JPJ67lTswhmfWjEm5LTOavRTuDFsnLD3i") ;

TwitterFactory tf = new TwitterFactory(cb.build()); Twitter twitter = tf.getInstance();

Query query = new Query("@basuki_btp"); QueryResult result = twitter.search(query); ProsesClass proses = new ProsesClass();

for (Status status : result.getTweets()) { String line;

line = status.getText();

String pure = line.replaceAll("@[a-zA-Z0-9_]+", ""); pure = pure.replaceAll("\\#(\\w+)", "");

pure = pure.replaceAll("\\!(\\p{L}?)", ""); pure = pure.replaceAll("http[^\\s]+", ""); pure = pure.toLowerCase();

pure = pure.replaceAll("\\brt()?\\b", ""); pure = pure.replaceAll("\\W\\s+", " "); List stpwrdResult = proses.stopWord(); Iterator itstop = stpwrdResult.iterator(); while (itstop.hasNext()) {

pure = pure.replaceAll((String) itstop.next(), " "); }

pure = pure.trim();


(12)

System.out.println(line); System.out.println(pure);

int id_tweet = proses.insertTweet(status.getUser().getScreenName(), pure); Iterator it = ngramResult.iterator();

if (id_tweet != -1) { while (it.hasNext()) {

proses.insertNgrams(id_tweet, (String) it.next()); }

}

proses.pindahNgram();

List<Probabilitas> t = proses.selectProbabilitas(); proses.updateSentimen(t);

List<Integer> i = proses.getTweet(); proses.hitungProbabilitas(i);

proses.intisari();

proses.updateTweetMaster(); status.getText());

}

} catch (TwitterException ex) {

Logger.getLogger(ClassLatihan.class.getName()).log(Level.SEVERE, null, ex); }

} }


(13)

4

LAMPIRAN B

Lampiran ini berisi class yang membuat koneksi antara java dan database MySQL. Class ini diberi nama “ConnectDatabaseClass.java”.

package packageLatihan;

import static com.mycompany.mavenproject1.NgramTest.concat; import com.mysql.jdbc.Statement;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;

import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List;

import java.util.logging.Level; import java.util.logging.Logger; import model.Probabilitas; /**

*

* @author alzygumgum */

public class ConnectDatabaseClass {

Connection connections;

public void closeConnection() { try {


(14)

connections = null;

} catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public Connection getConnection() { if(connections == null){

createConnection(); }

return connections; }

public void createConnection() { String dbUrl =

"jdbc:mysql://localhost/anasentimen?useUnicode=true&amp;characterEncoding=UTF-8"; String dbClass = "com.mysql.jdbc.Driver";

String query = "Select distinct(word) from INFORMATION_SCHEMA.TABLES"; String username = "root";

String password = "sayagaktau"; try {

Class.forName(dbClass); if(connections == null){

connections = DriverManager.getConnection(dbUrl, username, password);

}

} catch (Exception e) { }

} }


(15)

6

LAMPIRAN C

Lampiran ini berisi class yang mengeksekusi dokumen tweet dengan fitur n-gram. Class ini memisahkan kalimat menjadi kata-per-kata. Class ini diberi nama

“NgramTest.java”.

package com.mycompany.mavenproject1;

import java.util.ArrayList; import java.util.List; /**

*

* @author alzygumgum */

public class NgramTest {

public static List<String> ngrams(int n, String str) { List<String> ngrams = new ArrayList<>(); String[] words = str.split(" ");

for (int i = 0; i < words.length - n + 1; i++) ngrams.add(concat(words, i, i+n)); return ngrams;

}

public static String concat(String[] words, int start, int end) { StringBuilder sb = new StringBuilder();

for (int i = start; i < end; i++)

sb.append(i > start ? " " : "").append(words[i]); return sb.toString();

} }


(16)

LAMPIRAN D

Lampiran ini berisi class yang berisi proses text preprocessing sampai kepada perhitungan Algoritma Naive Bayes Classifier. Class ini diberi nama “ProsesClass.java”. package packageLatihan;

import com.mysql.jdbc.Statement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;

import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List;

import java.util.logging.Level; import java.util.logging.Logger; import model.Probabilitas;

/** *

* @author alzygumgum */

public class ProsesClass {

public int insertTweet(String user, String tweet) { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();


(17)

8

= connections.prepareStatement("INSERT into tweetmaster (user, tweet) VALUES (?,?)",

Statement.RETURN_GENERATED_KEYS); preparedStatement.setString(1, user);

preparedStatement.setString(2, tweet);

preparedStatement.executeUpdate();

ResultSet tableKeys = preparedStatement.getGeneratedKeys(); tableKeys.next();

int autoGeneratedID = tableKeys.getInt(1); db.closeConnection();

return autoGeneratedID; } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

}

return -1;//error }

public int insertNgrams(int id_tweet, String tweet) { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

PreparedStatement preparedStatement

= connections.prepareStatement("INSERT into tweetngram (id_tweet, ngram) VALUES (?,?)",

Statement.RETURN_GENERATED_KEYS); preparedStatement.setInt(1, id_tweet);


(18)

preparedStatement.executeUpdate();

ResultSet tableKeys = preparedStatement.getGeneratedKeys(); tableKeys.next();

int autoGeneratedID = tableKeys.getInt(1); db.closeConnection();

return autoGeneratedID; } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

}

return -1;//error }

public void deleteData() { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "DELETE FROM probabilitas"; PreparedStatement pstmt1 = null;

pstmt1 = connections.prepareStatement(SQL); pstmt1.executeUpdate();

SQL = "DELETE FROM tweetngram"; PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); pstmt.executeUpdate();

SQL = "DELETE FROM tweetmaster"; pstmt = null;


(19)

10 pstmt.executeUpdate();

db.closeConnection(); } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public List<String> stopWord() {

List<String> stpwrd = new ArrayList<>(); try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "SELECT stopword FROM stoplist"; PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

String stopword = rs.getString("stopword"); stpwrd.add(stopword);

}

db.closeConnection(); } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

}

return stpwrd; }


(20)

List<Integer> tweet = new ArrayList<>(); try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "SELECT * FROM tweetmaster where sentimen is NULL"; PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

int id_tweet = rs.getInt("id_tweet"); Integer t = new Integer(id_tweet); tweet.add(t);

}

db.closeConnection(); } catch (Exception e) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, e);

}

return tweet; }

public void pindahNgram() { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "SELECT * FROM tweetmaster where sentimen is NULL"; PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

int id_tweet = rs.getInt("id_tweet");


(21)

12 PreparedStatement pstmt2 = null;

ConnectDatabaseClass db1 = new ConnectDatabaseClass(); Connection con = db1.getConnection();

pstmt2 = con.prepareStatement(SQL); pstmt2.setInt(1, id_tweet);

ResultSet rs2 = pstmt2.executeQuery(); while (rs2.next()) {

int id_ngram = rs2.getInt("id_ngram"); String ngram = rs2.getString("ngram");

SQL = "SELECT * FROM probabilitas a join tweetngram b on(a.id_ngram = b.id_ngram) join tweetmaster c on(b.id_tweet = c.id_tweet) where c.id_tweet = ? and a.ngram like ?";

PreparedStatement pstmt3 = null;

ConnectDatabaseClass db2 = new ConnectDatabaseClass(); Connection con1 = db2.getConnection();

pstmt3 = con1.prepareStatement(SQL); pstmt3.setInt(1, id_tweet);

pstmt3.setString(2, ngram);

ResultSet rs3 = pstmt3.executeQuery(); int id_prob = -1;

int qty = 1;

while (rs3.next()) {

id_prob = rs3.getInt("id_prob"); qty = rs3.getInt("qty");

SQL = "UPDATE probabilitas set qty = ? where id_prob = ?"; PreparedStatement pstmt5 = null;

ConnectDatabaseClass db3 = new ConnectDatabaseClass(); Connection con2 = db3.getConnection();

pstmt5 = con2.prepareStatement(SQL); qty = qty + 1;


(22)

pstmt5.setInt(2, id_prob); pstmt5.executeUpdate(); db3.closeConnection(); }

if (id_prob == -1) {

SQL = "INSERT INTO probabilitas (id_ngram, ngram, qty) VALUES (?, ?, ?)";

PreparedStatement pstmt4 = null;

ConnectDatabaseClass db4 = new ConnectDatabaseClass(); Connection con3 = db4.getConnection();

pstmt4 = con3.prepareStatement(SQL); pstmt4.setInt(1, id_ngram);

pstmt4.setString(2, ngram); pstmt4.setInt(3, qty); pstmt4.executeUpdate(); db4.closeConnection(); }

db2.closeConnection(); }

db1.closeConnection(); }

db.closeConnection(); } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public void hitungProbabilitas(List<Integer> idtweet) { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();


(23)

14 Iterator it = idtweet.iterator();

while (it.hasNext()) {

String SQL = "SELECT * FROM probabilitas a join tweetngram b on(a.id_ngram = b.id_ngram) join tweetmaster c on(b.id_tweet = c.id_tweet) where c.id_tweet=?";

PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); Integer angka = (Integer) it.next();

pstmt.setInt(1, (int) angka.intValue()); ResultSet rs = pstmt.executeQuery(); while (rs.next()) {

int id_tweet = rs.getInt("id_tweet"); int id_ngram = rs.getInt("id_ngram"); int id_prob = rs.getInt("id_prob");

String sentimen = rs.getString("sentimen"); int nk = rs.getInt("qty");

SQL = "SELECT SUM(qty)as n FROM probabilitas a JOIN tweetngram b ON(a.id_ngram = b.id_ngram) JOIN tweetmaster c ON(b.id_tweet = c.id_tweet) WHERE c.id_tweet = ? AND a.sentimen = ?";

PreparedStatement pstmt2 = null;

ConnectDatabaseClass db1 = new ConnectDatabaseClass(); Connection con1 = db1.getConnection();

pstmt2 = con1.prepareStatement(SQL); pstmt2.setInt(1, id_tweet);

pstmt2.setString(2, sentimen);

ResultSet rs2 = pstmt2.executeQuery(); int n = 0;

while (rs2.next()) { n = rs2.getInt("n"); }


(24)

db1.closeConnection();

SQL = "SELECT SUM(qty) as vocab FROM probabilitas a JOIN tweetngram b ON(a.id_ngram = b.id_ngram) JOIN tweetmaster c ON(b.id_tweet = c.id_tweet) WHERE c.id_tweet = ? ";

PreparedStatement pstmt3 = null;

ConnectDatabaseClass db2 = new ConnectDatabaseClass(); Connection con2 = db2.getConnection();

pstmt3 = con2.prepareStatement(SQL); pstmt3.setInt(1, id_tweet);

ResultSet rs3 = pstmt3.executeQuery(); int vocab = 0;

while (rs3.next()) {

vocab = rs3.getInt("vocab"); }

db2.closeConnection();

float up = (nk + 1); float down = (n + vocab); float hasil = up / down;

SQL = "UPDATE probabilitas set prob = ? where id_prob = ? and id_ngram = ?";

PreparedStatement pstmt4 = null;

ConnectDatabaseClass db3 = new ConnectDatabaseClass(); Connection con3 = db3.getConnection();

pstmt4 = con3.prepareStatement(SQL); pstmt4.setFloat(1, hasil);

pstmt4.setInt(2, id_prob); pstmt4.setInt(3, id_ngram); pstmt4.executeUpdate();


(25)

16 db3.closeConnection();

} }

b.id_ngram) join tweetmaster c on(b.id_tweet = c.id_tweet) " db.closeConnection();

} catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

}

}

public List<Probabilitas> selectProbabilitas() { List<Probabilitas> selProbs = new ArrayList<>(); try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "SELECT * FROM probabilitas where sentimen is NULL"; PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

Probabilitas probs = new Probabilitas(); int id_prob = rs.getInt("id_prob"); int id_ngram = rs.getInt("id_ngram"); String ngram = rs.getString("ngram"); int qty = rs.getInt("qty");

String sentimen = rs.getString("sentimen"); float prob = rs.getFloat("prob");

probs.setId_prob(id_prob); probs.setId_ngram(id_ngram);


(26)

probs.setNgram(ngram); probs.setQty(qty);

probs.setSentimen(sentimen); probs.setProb(prob);

selProbs.add(probs); }

db.closeConnection(); } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

}

return selProbs; }

public void updateSentimen(List<Probabilitas> t) {

try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

Iterator it = t.iterator();

while (it.hasNext()) {

String SQL = "SELECT * FROM sentimen where kata = ?"; PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); Probabilitas o = (Probabilitas) it.next(); pstmt.setString(1, o.getNgram()); ResultSet rs = pstmt.executeQuery(); String sentimen = "netral";


(27)

18 sentimen = rs.getString("sentimen"); }

SQL = "UPDATE probabilitas set sentimen = ? where id_ngram = ? and id_prob = ?";

pstmt = null;

pstmt = connections.prepareStatement(SQL); pstmt.setString(1, sentimen);

pstmt.setInt(2, o.getId_ngram()); pstmt.setInt(3, o.getId_prob()); pstmt.executeUpdate();

}

db.closeConnection(); } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public void intisari() { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "SELECT c.id_tweet,a.sentimen,SUM(prob) as total_prob FROM probabilitas a JOIN tweetngram b ON (a.id_ngram = b.id_ngram) JOIN tweetmaster c ON (b.id_tweet = c.id_tweet) GROUP BY c.id_tweet, a.sentimen";

PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

int id_tweet = rs.getInt("id_tweet"); String sentimen = rs.getString("sentimen");


(28)

float prob = rs.getFloat("total_prob");

SQL = "INSERT INTO intisari (id_tweet, sentimen, prob) VALUES (?, ?, ?)"; ConnectDatabaseClass db2 = new ConnectDatabaseClass();

Connection con = db2.getConnection(); pstmt = con.prepareStatement(SQL); pstmt.setInt(1, id_tweet);

pstmt.setString(2, sentimen); pstmt.setFloat(3, prob); pstmt.executeUpdate(); db2.closeConnection(); }

db.closeConnection(); } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

}

}

public void updateTweetMaster() { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

where a.prob = (select max(b.prob) as max_prob from intisari b where b.sentimen <> 'netral' and b.id_tweet=a.id_tweet group by b.id_tweet limit 1)";

String SQL = "SELECT a.id_tweet, a.id_intisari, a.sentimen,a.prob FROM intisari a \n"

+ "INNER JOIN (SELECT id_tweet,MAX(b.prob) AS prob FROM intisari b \n"


(29)

20

+ "GROUP BY b.id_tweet) ss ON a.id_tweet = ss.id_tweet AND a.prob = ss.prob";

PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

//int id_intisari = rs.getInt("id_intisari"); int id_tweet = rs.getInt("id_tweet");

String sentimen = rs.getString("sentimen"); float prob = rs.getFloat("prob");

SQL = "UPDATE tweetmaster set sentimen = ? where id_tweet = ?"; ConnectDatabaseClass db1 = new ConnectDatabaseClass();

Connection con = db1.getConnection(); pstmt = con.prepareStatement(SQL); pstmt.setString(1, sentimen);

pstmt.setInt(2, id_tweet); pstmt.executeUpdate(); db1.closeConnection(); }

SQL = "UPDATE tweetmaster set sentimen = ? where sentimen is NULL"; ConnectDatabaseClass db1 = new ConnectDatabaseClass();

Connection con = db1.getConnection(); pstmt = con.prepareStatement(SQL); pstmt.setString(1, "netral");

//pstmt.setInt(2, id_tweet); pstmt.executeUpdate(); db1.closeConnection();


(30)

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public void intiToMaster() { try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

String SQL = "SELECT c.id_tweet,a.sentimen,SUM(prob) FROM probabilitas a JOIN tweetngram b ON (a.id_ngram = b.id_ngram) JOIN tweetmaster c ON (b.id_tweet = c.id_tweet) GROUP BY c.id_tweet, a.sentimen";

PreparedStatement pstmt = null;

pstmt = connections.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

//int id_intisari = rs.getInt("id_intisari"); int id_tweet = rs.getInt("id_tweet");

String sentimen = rs.getString("sentimen"); float prob = rs.getFloat("prob");

SQL = "INSERT INTO mastertweet (sentimen) VALUES (?)"; ConnectDatabaseClass db1 = new ConnectDatabaseClass(); Connection con = db1.getConnection();

pstmt = con.prepareStatement(SQL); pstmt.setString(1, sentimen);

pstmt.executeUpdate(); db1.closeConnection(); //selProbs.add(probs); }


(31)

22 } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public int countRows(int id_tweet, String sentimen) throws SQLException { // select the number of rows in the table

String SQL = "SELECT * FROM tweetngram where sentimen = ? and id_tweet = ?"; PreparedStatement pstmt = null;

ResultSet rs = null; int rowCount = -1; try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

pstmt = connections.prepareStatement(SQL); pstmt.setString(1, sentimen);

pstmt.setInt(2, id_tweet);

// get the number of rows from the result set rs.next();

rowCount = rs.getInt(1); db.closeConnection(); } finally {

rs.close(); pstmt.close(); }

return rowCount; }


(32)

LAMPIRAN E

Lampiran ini berisi syntax pembuata database pada MySQL.

CREATE TABLE intisari (

tweetmaster_id_tweet INTEGER UNSIGNED NOT NULL,

id_intisari INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, sentimen VARCHAR(10) NULL,

prob FLOAT NULL,

PRIMARY KEY(tweetmaster_id_tweet, id_intisari), INDEX Table_04_FKIndex1(tweetmaster_id_tweet) );

CREATE TABLE probabilitas (

id_prob INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, tweetngram_id_ngram INTEGER UNSIGNED NOT NULL,

tweetngram_tweetmaster_id_tweet INTEGER UNSIGNED NOT NULL, ngram VARCHAR(255) NULL,

qty INTEGER UNSIGNED NULL, sentimen VARCHAR(10) NULL, prob FLOAT NULL,

PRIMARY KEY(id_prob, tweetngram_id_ngram, tweetngram_tweetmaster_id_tweet), INDEX probabilitas_FKIndex1(tweetngram_id_ngram, tweetngram_tweetmaster_id_tweet) );

CREATE TABLE sentimen ( kata VARCHAR(255) NULL, sentimen VARCHAR(10) NULL );


(33)

24 CREATE TABLE stoplist (

id_stop INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, stopword VARCHAR(255) NULL,

PRIMARY KEY(id_stop) );

CREATE TABLE tweetmaster (

id_tweet INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, user_2 VARCHAR(255) NULL,

tweet VARCHAR(255) NULL, sentimen VARCHAR(10) NULL, PRIMARY KEY(id_tweet) );

CREATE TABLE tweetngram (

id_ngram INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, tweetmaster_id_tweet INTEGER UNSIGNED NOT NULL,

ngram VARCHAR(255) NULL,

PRIMARY KEY(id_ngram, tweetmaster_id_tweet), INDEX tweetngram_FKIndex1(tweetmaster_id_tweet) );


(34)

BAB V

KESIMPULAN DAN SARAN

5.1Kesimpulan

Dari percobaan dan pengujian yang dilakukan pada penelitian ini, didapatkan kesimpulan sebagai berikut:

1. Penerapan metode Naive Bayes Classifier untuk Analisis Sentimen Terhadap Opini Publik Melalui Jejaring Sosial Twitter Menggunakan Metode Naive Bayes telah berhasil.

2. Nilai probabilitas masing-masing kata dapat dihitung menggunakan metode Naive Bayes Classifier.

5.2Saran

1. Akurasi dari metode ini dapat lebih ditingkatkan dengan menambah metode pemilihan fitur seperti stemming.

2. Dapat dikembangkan tidak hanya untuk tokoh publik saja, tetapi juga untuk instansi-instansi yang membutuhkan feedback dari para konsumennya.

3. Bahasa yang digunakan bisa dikembangkan tidak hanya untuk bahasa Indonesia saja, tetapi juga bisa untuk bahasa lain.


(35)

75 Universitas Kristen Maranatha

DAFTAR PUSTAKA

Aliandu, P. 2013. Twitter Used by Indonesian President: An Sentiment Analysis of Timeline. Dalam Information Systems International Conference (ISICO), 2 – 4 December 2013.

Hidayatullah, Ahmad F & SN, Azhari. 2014. ANALISIS SENTIMEN DAN

KLASIFIKASI KATEGORI TERHADAP TOKOH PUBLIK PADA TWITTER. Dalam Seminar Nasional Informatika 2014 (SemnasIF 2014). 12 Agustus 2014. Yogyakarta. Komputer, Wahana. 2006. Panduan Praktis Pengolahan Database dengan MySQL.

Semarang: Penerbit Andi.

Mitchell, Tom M. 1997. Machine Learning. New York : McGraw-Hill.

Pang, B., Lee, L., & Vithyanathan, S. 2002. Thumbs Up ? SentimentClassification Using Machine Learning Techniques. Dalam Proceedings of The ACL-02 conference on Empirical methods in natural language processing, pp. 79-86. Stroudsburg: Association for computationalLinguistic.

Raharjo, Budi. 2011. Belajar Otodidak Membuat Database Menggunakan MySQL. Bandung : Informatika.

Raharjo, B, Heryanto, I & Haryono, A. 2012. Mudah Belajar Java. Bandung : Informatika.

SEVOCAB. 2008. Software and systems Engineering Vocabulary. Term : Flowchart. 31 Juli 2008. Diakses tanggal 3 Agustus 2015.

Soelistio, Yustinus E. & Surendra, M. R. S. 2013. SIMPLE TEXT MINING FOR SENTIMENT ANALYSIS OF POLITICAL FIGURE USING NAÏVE BAYES CLASSIFIER METHOD. Dalam The Proceeding of The 7th ICTS, 15-16 Mei 2013. Bali.

Twitter. 2015. http://apps.twitter.com. Diakses tanggal 3Agustus 2015.

Twittwe4j. 2015. http://twitter4j.org/en/index.htm. Diakses tanggal 3Agustus 2015. Wikipedia. id.m.wikipedia.org. Diakses tanggal 3Agustus 2015.


(36)

(1)

22 } catch (SQLException ex) {

Logger.getLogger(ConnectDatabaseClass.class.getName()).log(Level.SEVERE, null, ex);

} }

public int countRows(int id_tweet, String sentimen) throws SQLException { // select the number of rows in the table

String SQL = "SELECT * FROM tweetngram where sentimen = ? and id_tweet = ?"; PreparedStatement pstmt = null;

ResultSet rs = null; int rowCount = -1; try {

ConnectDatabaseClass db = new ConnectDatabaseClass(); Connection connections = db.getConnection();

pstmt = connections.prepareStatement(SQL); pstmt.setString(1, sentimen);

pstmt.setInt(2, id_tweet);

// get the number of rows from the result set rs.next();

rowCount = rs.getInt(1); db.closeConnection(); } finally {

rs.close(); pstmt.close(); }

return rowCount; }


(2)

23

LAMPIRAN E

Lampiran ini berisi syntax pembuata database pada MySQL.

CREATE TABLE intisari (

tweetmaster_id_tweet INTEGER UNSIGNED NOT NULL,

id_intisari INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, sentimen VARCHAR(10) NULL,

prob FLOAT NULL,

PRIMARY KEY(tweetmaster_id_tweet, id_intisari), INDEX Table_04_FKIndex1(tweetmaster_id_tweet) );

CREATE TABLE probabilitas (

id_prob INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, tweetngram_id_ngram INTEGER UNSIGNED NOT NULL,

tweetngram_tweetmaster_id_tweet INTEGER UNSIGNED NOT NULL, ngram VARCHAR(255) NULL,

qty INTEGER UNSIGNED NULL, sentimen VARCHAR(10) NULL, prob FLOAT NULL,

PRIMARY KEY(id_prob, tweetngram_id_ngram, tweetngram_tweetmaster_id_tweet), INDEX probabilitas_FKIndex1(tweetngram_id_ngram, tweetngram_tweetmaster_id_tweet) );

CREATE TABLE sentimen ( kata VARCHAR(255) NULL, sentimen VARCHAR(10) NULL );


(3)

24 CREATE TABLE stoplist (

id_stop INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, stopword VARCHAR(255) NULL,

PRIMARY KEY(id_stop) );

CREATE TABLE tweetmaster (

id_tweet INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, user_2 VARCHAR(255) NULL,

tweet VARCHAR(255) NULL, sentimen VARCHAR(10) NULL, PRIMARY KEY(id_tweet) );

CREATE TABLE tweetngram (

id_ngram INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, tweetmaster_id_tweet INTEGER UNSIGNED NOT NULL,

ngram VARCHAR(255) NULL,

PRIMARY KEY(id_ngram, tweetmaster_id_tweet), INDEX tweetngram_FKIndex1(tweetmaster_id_tweet) );


(4)

74 Universitas Kristen Maranatha

BAB V

KESIMPULAN DAN SARAN

5.1Kesimpulan

Dari percobaan dan pengujian yang dilakukan pada penelitian ini, didapatkan kesimpulan sebagai berikut:

1. Penerapan metode Naive Bayes Classifier untuk Analisis Sentimen Terhadap Opini Publik Melalui Jejaring Sosial Twitter Menggunakan Metode Naive Bayes telah berhasil.

2. Nilai probabilitas masing-masing kata dapat dihitung menggunakan metode Naive Bayes Classifier.

5.2Saran

1. Akurasi dari metode ini dapat lebih ditingkatkan dengan menambah metode pemilihan fitur seperti stemming.

2. Dapat dikembangkan tidak hanya untuk tokoh publik saja, tetapi juga untuk instansi-instansi yang membutuhkan feedback dari para konsumennya.

3. Bahasa yang digunakan bisa dikembangkan tidak hanya untuk bahasa Indonesia saja, tetapi juga bisa untuk bahasa lain.


(5)

75 Universitas Kristen Maranatha

DAFTAR PUSTAKA

Aliandu, P. 2013. Twitter Used by Indonesian President: An Sentiment Analysis of Timeline. Dalam Information Systems International Conference (ISICO), 2 – 4 December 2013.

Hidayatullah, Ahmad F & SN, Azhari. 2014. ANALISIS SENTIMEN DAN

KLASIFIKASI KATEGORI TERHADAP TOKOH PUBLIK PADA TWITTER. Dalam Seminar Nasional Informatika 2014 (SemnasIF 2014). 12 Agustus 2014. Yogyakarta. Komputer, Wahana. 2006. Panduan Praktis Pengolahan Database dengan MySQL.

Semarang: Penerbit Andi.

Mitchell, Tom M. 1997. Machine Learning. New York : McGraw-Hill.

Pang, B., Lee, L., & Vithyanathan, S. 2002. Thumbs Up ? SentimentClassification Using Machine Learning Techniques. Dalam Proceedings of The ACL-02 conference on Empirical methods in natural language processing, pp. 79-86. Stroudsburg: Association for computationalLinguistic.

Raharjo, Budi. 2011. Belajar Otodidak Membuat Database Menggunakan MySQL. Bandung : Informatika.

Raharjo, B, Heryanto, I & Haryono, A. 2012. Mudah Belajar Java. Bandung : Informatika.

SEVOCAB. 2008. Software and systems Engineering Vocabulary. Term : Flowchart. 31 Juli 2008. Diakses tanggal 3 Agustus 2015.

Soelistio, Yustinus E. & Surendra, M. R. S. 2013. SIMPLE TEXT MINING FOR SENTIMENT ANALYSIS OF POLITICAL FIGURE USING NAÏVE BAYES CLASSIFIER METHOD. Dalam The Proceeding of The 7th ICTS, 15-16 Mei 2013. Bali.

Twitter. 2015. http://apps.twitter.com. Diakses tanggal 3Agustus 2015.

Twittwe4j. 2015. http://twitter4j.org/en/index.htm. Diakses tanggal 3Agustus 2015. Wikipedia. id.m.wikipedia.org. Diakses tanggal 3Agustus 2015.


(6)

76 Universitas Kristen Maranatha