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; }
}