Sentiment Analysis Pada Teks Bahasa Indonesia Menggunakan Support Vector Machine (SVM) Dan K-Nearest Neighbor (K-NN)
LAMPIRAN
Universitas Sumatera Utara
LAMPIRAN
LISTING PROGRAM
Classification.java
package usu.ti;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
edu.ucla.sspace.common.SemanticSpace;
static edu.ucla.sspace.common.Similarity.cosineSimilarity;
edu.ucla.sspace.matrix.Matrix;
edu.ucla.sspace.matrix.MatrixBuilder;
edu.ucla.sspace.matrix.TfIdfTransform;
edu.ucla.sspace.text.IteratorFactory;
edu.ucla.sspace.util.SparseArray;
edu.ucla.sspace.util.SparseIntHashArray;
edu.ucla.sspace.vector.Vector;
java.io.BufferedReader;
java.io.File;
java.io.IOException;
java.io.StringReader;
java.util.ArrayList;
java.util.Collections;
java.util.HashMap;
java.util.Iterator;
java.util.Map;
java.util.Properties;
java.util.Random;
java.util.Set;
java.util.TreeMap;
java.util.concurrent.ConcurrentHashMap;
java.util.concurrent.ConcurrentMap;
java.util.concurrent.atomic.AtomicInteger;
java.util.logging.Level;
java.util.logging.Logger;
usu.ti.model.data.Document;
weka.classifiers.Classifier;
weka.classifiers.Evaluation;
weka.classifiers.lazy.IBk;
weka.core.Attribute;
weka.core.DistanceFunction;
weka.core.FastVector;
weka.core.Instance;
weka.core.Instances;
weka.core.SelectedTag;
weka.core.SerializationHelper;
Universitas Sumatera Utara
import
import
import
import
import
weka.core.converters.TextDirectoryLoader;
weka.core.neighboursearch.LinearNNSearch;
weka.core.tokenizers.NGramTokenizer;
weka.filters.Filter;
weka.filters.unsupervised.attribute.StringToWordVector;
public class Classification implements SemanticSpace {
public Classification () {
this(System.getProperties());
}
public Classification ( Properties pProperties) {
mTermToIndex = new ConcurrentHashMap ();
mTermIndexCounter = new AtomicInteger(0);
mTermDocumentMatrixBuilder = Matrices.getMatrixBuilderForSVD();
mWordSpace = null;
mDocumentSpace = null;
}
private int mMaximumDocuments;
private int mMaximumPositive;
private int mTotalTest;
private int mTotalTrain;
private int mTotalPositiveTrain;
private int mTotalNegativeTrain;
private int mTotalNeutralTrain;
private int mTotalPositiveTest;
private int mTotalNegativeTest;
private int mTotalNeutralTest;
private int mTotalPositiveKNN;
private int mTotalNegativeKNN;
private int mTotalNeutralKNN;
private int mTotalPositiveSVM;
private int mTotalNegativeSVM;
private int mTotalNeutralSVM;
private double mKNNAccuration;
private double mSVMAccuration;
}
Universitas Sumatera Utara
Closer.java
/*
* To change this license header, choose License Headers
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
in
Project
in
Project
package usu.ti;
import java.io.Closeable;
import java.io.IOException;
public class Closer implements Closeable {
private Closeable closeable;
public T using(T t) {
closeable = t;
return t;
}
@Override public void close() throws IOException {
if (closeable != null) {
closeable.close();
}
}
}
CrawlerConfiguration.java
/*
* To change this license header, choose License Headers
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package usu.ti;
import
import
import
import
import
import
import
import
import
import
com.mongodb.BasicDBObject;
com.mongodb.DB;
com.mongodb.DBCollection;
com.mongodb.DBCursor;
com.mongodb.DBObject;
com.mongodb.MongoClient;
com.mongodb.ServerAddress;
java.io.File;
java.net.UnknownHostException;
java.util.ArrayList;
Universitas Sumatera Utara
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
public class CrawlerConfiguration {
public CrawlerConfiguration () {
try {
mMongoClient
=
new
MongoClient(Arrays.asList(new
ServerAddress("127.0.0.1", 27017)));
mDB = mMongoClient.getDB("emotional");
mListCrawlerWeb = new ArrayList ();
mCollectionCrawlerList = mDB.getCollection("CrawlerList");
if ( mCollectionCrawlerList.count() == 0 ) {
// Membuat Collection baru dan isi sementara
mDB.createCollection("CrawlerList", null);
mCollectionCrawlerList = mDB.getCollection("CrawlerList");
BasicDBObject
dObject
=
new
BasicDBObject("Name",
"TribunNews").
append("URL",
"http://www.tribunnews.com/").
append("SelectionID", "div.txtarticle");
mCollectionCrawlerList.insert(dObject);
}
DBCursor dCursor = mCollectionCrawlerList.find();
try {
// Mengambil semua data website yang mau di crawling
while ( dCursor.hasNext()) {
DBObject dObject = dCursor.next();
CrawlerWeb dCrawlerWeb = new CrawlerWeb ();
dCrawlerWeb.setName(dObject.get("Name").toString());
dCrawlerWeb.setURL(dObject.get("URL").toString());
dCrawlerWeb.setSelectionID(dObject.get("SelectionID").toString());
mListCrawlerWeb.add(dCrawlerWeb);
}
} finally {
dCursor.close();
}
// Membuat StorageFolder
File dDirectoryStorageFolder = new File (STORAGE_FOLDER);
Sentiment.java
/*
* To change
Properties.
this
license
header,
choose
License
Headers
in
Project
Universitas Sumatera Utara
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package usu.ti;
import
import
import
import
import
import
import
import
import
com.google.common.io.Files;
java.io.File;
java.io.IOException;
java.nio.charset.Charset;
java.util.ArrayList;
java.util.Iterator;
java.util.List;
java.util.logging.Level;
java.util.logging.Logger;
public class Sentiment {
private static volatile Sentiment instance = null;
private Sentiment () {
try {
arrayOfPositiveWords = new ArrayList ();
arrayOfNegativeWords = new ArrayList ();
// Load Positive Words
List
positiveWords
=
Files.readLines(new
File
(
System.getProperty("user.dir")
+
"/assets/POSITIVE_WORDS.txt"
),
Charset.defaultCharset());
String word;
int i, n;
for ( i = 0, n = positiveWords.size(); i < n; i++ ) {
word = positiveWords.get(i);
if (word.length() > 1) {
arrayOfPositiveWords.add(word);
}
}
// Load Negative Words
List
negativeWords
=
Files.readLines(new
File
(
System.getProperty("user.dir")
+
"/assets/NEGATIVE_WORDS.txt"
),
Charset.defaultCharset());
for ( i = 0, n = positiveWords.size(); i < n; i++ ) {
word = negativeWords.get(i);
if (word.length() > 1) {
arrayOfNegativeWords.add(word);
}
}
}
public int getNumberOfPositive () {
return mNumberOfPositive;
}
Universitas Sumatera Utara
public int getNumberOfNegative () {
return mNumberOfNegative;
}
public double getSentimentScore () {
return mSentimentScore;
}
private
private
private
private
private
ArrayList arrayOfPositiveWords;
ArrayList arrayOfNegativeWords;
int mNumberOfPositive;
int mNumberOfNegative;
double mSentimentScore;}
Stemming.java
package usu.ti;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
public class Stemming {
public Stemming(String directory) throws Exception{
initialization(directory);
}
private void initialization(String directory) throws Exception{
// Load all words to memory divided based on first character
words = new ConcurrentHashMap(26);
String content = "";
for (char c = 'a'; c
Universitas Sumatera Utara
LAMPIRAN
LISTING PROGRAM
Classification.java
package usu.ti;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
edu.ucla.sspace.common.SemanticSpace;
static edu.ucla.sspace.common.Similarity.cosineSimilarity;
edu.ucla.sspace.matrix.Matrix;
edu.ucla.sspace.matrix.MatrixBuilder;
edu.ucla.sspace.matrix.TfIdfTransform;
edu.ucla.sspace.text.IteratorFactory;
edu.ucla.sspace.util.SparseArray;
edu.ucla.sspace.util.SparseIntHashArray;
edu.ucla.sspace.vector.Vector;
java.io.BufferedReader;
java.io.File;
java.io.IOException;
java.io.StringReader;
java.util.ArrayList;
java.util.Collections;
java.util.HashMap;
java.util.Iterator;
java.util.Map;
java.util.Properties;
java.util.Random;
java.util.Set;
java.util.TreeMap;
java.util.concurrent.ConcurrentHashMap;
java.util.concurrent.ConcurrentMap;
java.util.concurrent.atomic.AtomicInteger;
java.util.logging.Level;
java.util.logging.Logger;
usu.ti.model.data.Document;
weka.classifiers.Classifier;
weka.classifiers.Evaluation;
weka.classifiers.lazy.IBk;
weka.core.Attribute;
weka.core.DistanceFunction;
weka.core.FastVector;
weka.core.Instance;
weka.core.Instances;
weka.core.SelectedTag;
weka.core.SerializationHelper;
Universitas Sumatera Utara
import
import
import
import
import
weka.core.converters.TextDirectoryLoader;
weka.core.neighboursearch.LinearNNSearch;
weka.core.tokenizers.NGramTokenizer;
weka.filters.Filter;
weka.filters.unsupervised.attribute.StringToWordVector;
public class Classification implements SemanticSpace {
public Classification () {
this(System.getProperties());
}
public Classification ( Properties pProperties) {
mTermToIndex = new ConcurrentHashMap ();
mTermIndexCounter = new AtomicInteger(0);
mTermDocumentMatrixBuilder = Matrices.getMatrixBuilderForSVD();
mWordSpace = null;
mDocumentSpace = null;
}
private int mMaximumDocuments;
private int mMaximumPositive;
private int mTotalTest;
private int mTotalTrain;
private int mTotalPositiveTrain;
private int mTotalNegativeTrain;
private int mTotalNeutralTrain;
private int mTotalPositiveTest;
private int mTotalNegativeTest;
private int mTotalNeutralTest;
private int mTotalPositiveKNN;
private int mTotalNegativeKNN;
private int mTotalNeutralKNN;
private int mTotalPositiveSVM;
private int mTotalNegativeSVM;
private int mTotalNeutralSVM;
private double mKNNAccuration;
private double mSVMAccuration;
}
Universitas Sumatera Utara
Closer.java
/*
* To change this license header, choose License Headers
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
in
Project
in
Project
package usu.ti;
import java.io.Closeable;
import java.io.IOException;
public class Closer implements Closeable {
private Closeable closeable;
public T using(T t) {
closeable = t;
return t;
}
@Override public void close() throws IOException {
if (closeable != null) {
closeable.close();
}
}
}
CrawlerConfiguration.java
/*
* To change this license header, choose License Headers
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package usu.ti;
import
import
import
import
import
import
import
import
import
import
com.mongodb.BasicDBObject;
com.mongodb.DB;
com.mongodb.DBCollection;
com.mongodb.DBCursor;
com.mongodb.DBObject;
com.mongodb.MongoClient;
com.mongodb.ServerAddress;
java.io.File;
java.net.UnknownHostException;
java.util.ArrayList;
Universitas Sumatera Utara
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
public class CrawlerConfiguration {
public CrawlerConfiguration () {
try {
mMongoClient
=
new
MongoClient(Arrays.asList(new
ServerAddress("127.0.0.1", 27017)));
mDB = mMongoClient.getDB("emotional");
mListCrawlerWeb = new ArrayList ();
mCollectionCrawlerList = mDB.getCollection("CrawlerList");
if ( mCollectionCrawlerList.count() == 0 ) {
// Membuat Collection baru dan isi sementara
mDB.createCollection("CrawlerList", null);
mCollectionCrawlerList = mDB.getCollection("CrawlerList");
BasicDBObject
dObject
=
new
BasicDBObject("Name",
"TribunNews").
append("URL",
"http://www.tribunnews.com/").
append("SelectionID", "div.txtarticle");
mCollectionCrawlerList.insert(dObject);
}
DBCursor dCursor = mCollectionCrawlerList.find();
try {
// Mengambil semua data website yang mau di crawling
while ( dCursor.hasNext()) {
DBObject dObject = dCursor.next();
CrawlerWeb dCrawlerWeb = new CrawlerWeb ();
dCrawlerWeb.setName(dObject.get("Name").toString());
dCrawlerWeb.setURL(dObject.get("URL").toString());
dCrawlerWeb.setSelectionID(dObject.get("SelectionID").toString());
mListCrawlerWeb.add(dCrawlerWeb);
}
} finally {
dCursor.close();
}
// Membuat StorageFolder
File dDirectoryStorageFolder = new File (STORAGE_FOLDER);
Sentiment.java
/*
* To change
Properties.
this
license
header,
choose
License
Headers
in
Project
Universitas Sumatera Utara
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package usu.ti;
import
import
import
import
import
import
import
import
import
com.google.common.io.Files;
java.io.File;
java.io.IOException;
java.nio.charset.Charset;
java.util.ArrayList;
java.util.Iterator;
java.util.List;
java.util.logging.Level;
java.util.logging.Logger;
public class Sentiment {
private static volatile Sentiment instance = null;
private Sentiment () {
try {
arrayOfPositiveWords = new ArrayList ();
arrayOfNegativeWords = new ArrayList ();
// Load Positive Words
List
positiveWords
=
Files.readLines(new
File
(
System.getProperty("user.dir")
+
"/assets/POSITIVE_WORDS.txt"
),
Charset.defaultCharset());
String word;
int i, n;
for ( i = 0, n = positiveWords.size(); i < n; i++ ) {
word = positiveWords.get(i);
if (word.length() > 1) {
arrayOfPositiveWords.add(word);
}
}
// Load Negative Words
List
negativeWords
=
Files.readLines(new
File
(
System.getProperty("user.dir")
+
"/assets/NEGATIVE_WORDS.txt"
),
Charset.defaultCharset());
for ( i = 0, n = positiveWords.size(); i < n; i++ ) {
word = negativeWords.get(i);
if (word.length() > 1) {
arrayOfNegativeWords.add(word);
}
}
}
public int getNumberOfPositive () {
return mNumberOfPositive;
}
Universitas Sumatera Utara
public int getNumberOfNegative () {
return mNumberOfNegative;
}
public double getSentimentScore () {
return mSentimentScore;
}
private
private
private
private
private
ArrayList arrayOfPositiveWords;
ArrayList arrayOfNegativeWords;
int mNumberOfPositive;
int mNumberOfNegative;
double mSentimentScore;}
Stemming.java
package usu.ti;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
public class Stemming {
public Stemming(String directory) throws Exception{
initialization(directory);
}
private void initialization(String directory) throws Exception{
// Load all words to memory divided based on first character
words = new ConcurrentHashMap(26);
String content = "";
for (char c = 'a'; c