Implementasi Pengujian Tanpa Normalisasi

89 case tidak: if i + 1 = list.size - 1 { list.seti, tidak + list.geti + 1; list.removei + 1; break; } } Gambar 4.13 Potongan Source Code Penanganan Kata “Tidak”

4.2.1.5 Pembobotan

Proses selanjutnya adalah pembobotan dengan menggunakan metode tf-idf. Tiap dokumen tweet direpresentasikan sebagai vector numerik dengan nilai bobot kata term yang didapat dengan persamaan 2.1. Gambar 4.14 menunjukkan potongan source code proses pembobotan menggunakan metode tf-idf. double tf; double idf; double tfIdf; tfIdfDocsVector = new LinkedHashMap; for int key : allTermsMap.keySet { double[] tfIdfVector = new double[terms.size]; int c = 0; for String term : terms { tf = tfCalculatorallTermsMap.getkey, term; idf = idfCalculatorallTermsMap, term; tfIdf = tf idf; tfIdfVector[c] = tfIdf; c++; } tfIdfDocsVector.putkey, tfIdfVector; } 90 public double tfCalculatorArrayListString docTerms, String termToCheck { int tf = 0; for String s : docTerms { if s.equalsIgnoreCasetermToCheck { tf++; } } return tf; } public double idfCalculatorLinkedHashMapInteger, ArrayListString allTermsMap, String termToCheck { int df = 0; for int key : allTermsMap.keySet { if allTermsMap.getkey.containstermToCheck { df++; } } if df = 0 { if df == allTermsMap.size { return 1 + Math.log10allTermsMap.size df; } else { return Math.log10allTermsMap.size df; } } else { return 0; } } Gambar 4.14 Potongan Source Code Pembobotan tf-idf

4.2.1.6 Hasil Preprocessing dan Pembobotan

Hasil dari tahap preprocessing dan pembobotan disimpan dalam file csv atau comma separated values. Hasil tahap preprocessing dan 91 pembobotan digunakan untuk melakukan proses selanjutnya yaitu pengujian sistem. Gambar 4.15 menunjukkan hasil tahap preprocessing dan pembobotan yang sudah disimpan dalam file feature.csv. Gambar 4.15 Hasil Tahap Preprocessing dan Pembobotan

4.2.2 Pengujian Sistem

Hasil tahap preprocessing dan pembobotan dipakai sebagai data masukan dari proses pengujian sistem. Data akan melalui tahap normalisasi, inisialisasi centroid, dan clustering. Hasil yang didapat dari pengujian sistem adalah akurasi pengelompokkan tweet berdasarkan emosi dan centroid akhir untuk proses pengujian data baru. 92

4.2.2.1 Normalisasi

Normalisasi dilakukan agar tidak ada nilai dalam data yang melampaui nilai lain. Normalisasi yang digunakan yaitu normalisasi z- score dan normalisasi min-max. Kedua normalisasi dilakukan secara terpisah untuk mengetahui normalisasi yang lebih cocok pada penelitian ini.

4.2.2.1.1 Z-Score

Gambar 4.16 menunjukkan potongan source code proses normalisasi menggunakan metode z-score. Normalisasi z-score menggunakan batas threshold. Nilai yang lebih dari sama dengan batas akan dinormalisasi, sedangkan nilai yang kurang dari batas tetap seperti semula. getMeanmatrix; getStdDevmatrix; for int i = 0; i matrix.length; i++ { for int j = 0; j matrix[i].length; j++ { if int matrix[i][j] = 3 { matrix[i][j] = matrix[i][j] - mean[i] std[i]; } } } Gambar 4.16 Potongan Source Code Normalisasi Z-Score

4.2.2.1.2 Min-Max

Gambar 4.17 menunjukkan potongan source code proses normalisasi menggunakan metode min-max. Normalisasi min-max 93 menggunakan batas threshold. Nilai yang lebih dari sama dengan batas akan dinormalisasi, sedangkan nilai yang kurang dari batas tetap seperti semula. getMinmatrix; getMaxmatrix; for int i = 0; i matrix[0].length; i++ { for int j = 0; j matrix.length; j++ { if int matrix[j][i] = 5 { if min[i] == max[i] { matrix[j][i] = 0.5; } else { matrix[j][i] = matrix[j][i] - min[i] max[i] - min[i]; } } } } Gambar 4.17 Potongan Source Code Normalisasi Min-Max

4.2.2.2 Variance Initialization

Gambar 4.18 menunjukkan potongan source code proses variance initialization. Proses variance initialization digunakan untuk menentukan centroid awal cluster. Centroid awal yang didapat dengan proses ini selanjutnya dipakai pada tahap K-Means clustering. getVariancetermsMap; sortMapfeature; getInitCentsortedMap, k; Gambar 4.18 Potongan Source Code Variance Initialization 94 Gambar 4.19 menunjukkan centroid awal yang diperoleh melalui tahap variance initialization. Centroid akan digunakan sebagai pusat awal pada proses clustering. Gambar 4.19 Centroid Awal Berdasarkan Variance Initialization

4.2.2.3 Langkah K-Means Clustering

K-Means clustering diawali dengan penentuan jumlah cluster. Langkah kedua adalah menempatkan data tweet pada cluster terdekat. Kedekatan data tweet dengan pusat cluster dihitung menggunakan cosine similarity. Langkah ketiga adalah meng-update pusat cluster dengan mencari rata-rata dari anggota cluster tersebut. Hasil rata-rata akan menjadi pusat centroid baru. Ulangi langkah kedua dan ketiga hingga centroid cluster tidak berubah. Pada penelitian ini, cluster yang digunakan adalah 5. Masing- masing cluster akan mewakili satu kelompok emosi. Cluster 1 merupakan cluster emosi cinta, cluster 2 merupakan cluster emosi marah, cluster 3 merupakan cluster emosi sedih, cluster 4 merupakan cluster emosi senang, dan cluster 5 merupakan cluster takut. Gambar 4.20 menunjukkan potongan source code proses K- Means clustering. 95 public LinkedHashMap kmeansClusteringLinkedHashMapInteger, double[] feature, LinkedHashMapInteger, double[] centroidMap, int k { clusters.clear; step.clear; for int key : centroidMap.keySet { step.putcentroidMap.getkey, new TreeSetInteger; } boolean go = true; int iteration = 1; while go { clusters = new LinkedHashMapstep; predicted = new int[feature.size]; for Integer key : feature.keySet { double[] cent = null; double[] cosSim = new double[k]; double[] distances = new double[k]; double sim = -1; double dist = 9999; int i = 0; for double[] c : clusters.keySet { double csim = new Distance.cosineSimilarityfeature.getkey, c; cosSim[i] = csim; if csim sim { sim = csim; cent = c; } i++; } clusters.getcent.addkey; int index = 0; 96 for int j = 1; j cosSim.length; j++ { if cosSim[j] cosSim[index] { index = j; } } predicted[key - 1] = index + 1; } step.clear; for double[] cent : clusters.keySet { double[] updatec = new double[cent.length]; for int d : clusters.getcent { double[] doc = feature.getd; for int i = 0; i updatec.length; i++ { updatec[i] += doc[i]; } } for int i = 0; i updatec.length; i++ { updatec[i] = clusters.getcent.size; } step.putupdatec, new TreeSetInteger; } String oldCent = , newCent = ; for double[] x : clusters.keySet { oldCent += Arrays.toStringx; } for double[] x : step.keySet { newCent += Arrays.toStringx; } if oldCent.equalsnewCent { go = false; } iteration++; 97 } return clusters; } Gambar 4.20 Potongan Source Code K-Means Clustering Gambar 4.21 menunjukkan hasil pengelompokkan tweet menggunakan K-Means clustering. Gambar 4.21 Hasil Implementasi K-Means Clustering

4.2.2.4 Output Centroid

Proses K-Means clustering akan menghasilkan keluaran berupa centroid akhir sebagai pusat dari masing-masing cluster. Centroid akhir akan digunakan untuk menguji data baru. Data baru akan dimasukkan ke sistem untuk mendapatkan label cluster menurut prediksi sistem. Gambar 4.22 menunjukkan centroid akhir hasil proses K-Means clustering. 98 Gambar 4.22 Output Centroid

4.2.2.5 Akurasi

Pada penelitian ini, pengujian akurasi yang digunakan adalah confusion matrix. Hasil prediksi akan dibandingkan dengan label aktual. Banyaknya kecocokan antara prediksi dengan label aktual akan mempengaruhi tingkat akurasi sistem. Gambar 4.23 menunjukkan potongan source code proses K- Means clustering. public void getConfusionMatrixint[] pred, int[] act, int centroid { int[][] confMat = new int[centroid][centroid]; int[] row = new int[centroid]; int rightAnswers = 0; for int i = 0; i pred.length; i++ { confMat[act[i] - 1] [pred[i] - 1]++; row[pred[i] - 1]++; } System.out.printlnConfusion Matrix : ; for int i = 0; i confMat.length; i++ { int[] x = confMat[i]; for int j = 0; j x.length; j++ { int d = x[j]; 99 System.out.print\t + d + ; if i == j { rightAnswers += d; } } System.out.println; } float accuration; int rows = 0; for int i = 0; i row.length; i++ { rows += row[i]; } System.out.println; accuration = float rightAnswers rows 100; System.out.printlnAccuration = + accuration + ; } Gambar 4.23 Potongan Source Code Confusion Matrix Gambar 4.24 Hasil Implementasi Confusion Matrix

4.2.3 Pengujian Data Baru

Pengujian data baru dilakukan pada sebuah kalimat tweet. Data baru tersebut akan melalui tahap ekstraksi fitur kemudian sistem akan menentukan tweet termasuk dalam cluster cinta, marah, sedih, senang, 100 atau takut. Penentuan dilakukan dengan mengukur kedekatan data baru pada centroid tiap cluster. Gambar 4.25 menunjukkan contoh tweet yang digunakan sebagai data baru. Menurut prediksi sistem, data baru termasuk dalam cluster senang. Hasil prediksi sistem ditunjukkan pada Gambar 4.26. astiastung 17.02.2016, Yogyakarta Selamat Wisuda Kelulusan dear, Moch Ryan Ardiansyah Semoga ilmunya bermanfaat : proudofyou Gambar 4.25 Input Uji Data Baru Gambar 4.26 Output Uji Data Baru 101

5. BAB V

PENUTUP

5.1 Kesimpulan

Berdasarkan hasil penelitian ini, analisis sentimen data Twitter menggunakan K-Means clustering, diperoleh kesimpulan sebagai berikut: 1. Percobaan tanpa normalisasi dengan minimal kemunculan kata 3 memperoleh hasil akurasi sebesar 69,4. 2. Percobaan menggunakan normalisasi z-score dengan batas nilai yang dinormalisasi 7 dan minimal kemunculan kata 4 memperoleh hasil akurasi sebesar 68,9. 3. Percobaan menggunakan normalisasi min-max dengan batas nilai yang dinormalisasi 5 dan minimal kemunculan kata 3 memperoleh hasil akurasi sebesar 76,3. 4. Berdasarkan kesimpulan 1, 2, dan 3, akurasi tertinggi diperoleh dengan perlakuan percobaan menggunakan metode normalisasi min-max. 5. Penelitian tentang analisis sentimen data Twitter menggunakan K- Means clustering mendapat akurasi tertinggi sebesar 76,3. 102

5.2 Saran

Berikut ini adalah saran yang dapat membantu penelitian ini agar lebih baik dan berkembang: 1. Kamus kata dasar dan kamus sinonim kata dilengkapi dan disesuaikan dengan bahasa yang digunakan dalam menulis tweet atau media sosial lain. 2. Data yang digunakan lebih banyak sehingga dapat mencakup lebih banyak kosakata dan pengenalan emosi menjadi lebih akurat. 3. Pengumpulan data tweet dilakukan secara otomatis menggunakan fasilitas Twitter API dan library bahasa pemrograman. 4. Pembuatan user interface untuk memudahkan pengguna menggunakan sistem ini. 103 DAFTAR PUSTAKA Agha, M. E., Ashour, W. M. 2012. Efficient and Fast Initialization Algorithm for K-means Clustering. International Journal of Intelligent Systems and Applications, 41, 21-31. Agusta, L. 2009. Perbandingan Algoritma Stemming Porter dengan Algoritma Nazief Adriani untuk Stemming Dokumen Teks Bahasa Indonesia. Konferensi Nasional Sistem dan Informatika, hal. 196-201. Bali. Al-Daoud, M. B. 2007. A New Algorithm for Cluster Initialization. International Journal of Computer, Electrical, Automation, Control and Information Engineering, 14. Destuardi, I., Sumpeno, S. 2009. Klasifikasi Emosi Untuk Teks Bahasa Indonesia Menggunakan Metode Naive Bayes. Seminar Nasional Pascasarjana Institut Teknologi Sepuluh Nopember. Surabaya. Goleman, D. 2006. Emotional Intelligence : Kecerdasan Emosional, Mengapa EI Lebih Penting Daripada IQ. T. Hermaya, Penerj. Jakarta: P.T. Gramedia Pustaka Utama. Liu, B. 2012. Sentiment Analysis and Opinion Mining. Morgan Claypool Publishers. Luhulima, Y. Y. 2013. Sentiment Analysis Pada Review Barang Berbahasa Indonesia dengan Metode K-Nearest Neighbor. Jurnal Mahasiswa PTIIK UB, 25, 1-7. Manning, C. D., Raghavan, P., Schütze, H. 2009. An Introduction to Information Retrieval. Cambridge: Cambridge University Press. Mustaffa, Z., Yusof, Y. 2011. A Comparison of Normalization Techniques in Predicting Dengue Outbreak. 2010 International Conference on Business and Economics Research. 1, hal. 345-349. Kuala Lumpur: IACSIT Press. Nur, M. Y., Santika, D. D. 2011. Analisis Sentimen Pada Dokumen Berbahasa Indonesia Dengan Pendekatan Support Vector Machine. Konferensi Nasional Sistem dan Informatika 2011. Bali. Putri, P. A. 2013. Implementasi Metode Improved K-Nearest Neighbor Pada Analisis Sentimen Twitter Berbahasa Indonesia. Jurnal Mahasiswa PTIIK UB, 22, 1-8. Shaver, P. R., Murdaya, U., Fraley, R. C. 2001. Structure of the Indonesian Emotion Lexicon. Asian Journal of Social Psychology, 4, 201-224. 104 Sujana, A. P. 2013. Memanfaatkan Big Data Untuk Mendeteksi Emosi. Jurnal Teknik Komputer Unikom - Komputika, 22, 1-4. Tan, P.-N., Steinbach, M., Kumar, V. 2006. Introduction To Data Mining. Boston: Pearson Addison Wesley. 105 LAMPIRAN A. Source Code 1. Tokenizing.java To change this license header, choose License Headers in Project Properties. To change this template file, choose Tools | Templates and open the template in the editor. package sentimentanalysis; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.StringTokenizer; author agung public class Tokenizing { private LinkedHashMapInteger, ArrayListString map; private ArrayListString token; private String fileLocation; private final static String HASHTAG = \\w+; private final static String NUMBER = [0-9]; private final static String NON_WORD = [\\p{L}\\p{Nd}]+; private final static String URL = www\\.[\\s]+|https?:[\\s]+; private final static String USERNAME = [\\s]+; private final static String STARTS_WITH_NUMBER = [0-9]\\s\\w+; private final static String CONSECUTIVE_CHAR = [.?\\w]\\1{2,}; private String[] label = {cinta, marah, sedih, senang, seneng, takut}; private String[] noise = {view, translation, jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec, rt, hours, hour, ago}; public TokenizingString fileLocation { this.fileLocation = fileLocation; } public Tokenizing { } public LinkedHashMap getAllTokenint j throws FileNotFoundException, IOException { map = new LinkedHashMap; String line; 106 BufferedReader bufferedReader = new BufferedReadernew FileReaderfileLocation; while line = bufferedReader.readLine = null { StringTokenizer stringTokenizer = new StringTokenizerline; token = new ArrayList; while stringTokenizer.hasMoreTokens { String nextToken = stringTokenizer.nextToken; nextToken = nextToken.toLowerCase; for String lbl : label { if lbl.equalsIgnoreCasenextToken { nextToken = ; } } for String thisnoise : noise { if thisnoise.equalsIgnoreCasenextToken { nextToken = ; } } if nextToken.length 2 { nextToken = nextToken.replaceAllHASHTAG, nextToken.substring1; nextToken = nextToken.replaceAllHASHTAG, ; } nextToken = nextToken.replaceAllURL, ; nextToken = nextToken.replaceAllUSERNAME, ; nextToken = nextToken.replaceAllSTARTS_WITH_NUMBER, ; nextToken = nextToken.replaceAllCONSECUTIVE_CHAR, 1; nextToken = nextToken.replaceAllNUMBER, ; nextToken = nextToken.replaceAllNON_WORD, ; if nextToken.length = 2 { if nextToken.contains { String[] temp = nextToken.split ; token.addAllArrays.asListtemp; token.remove; } else { token.addnextToken; } } } if token.size 1 { map.putj, token; j++; } } return map; } }