Java examples for Machine Learning AI:weka
implements a simple sentiment classifier in Java using WEKA
/**/*from w w w. j av a 2s . co m*/ * A Java class that implements a simple sentiment classifier, based on WEKA. * It requires a serialized model of the type FilteredClassifier. * WEKA is available at: http://www.cs.waikato.ac.nz/ml/weka/ * Copyright (C) 2013 Jose Maria Gomez Hidalgo - http://www.esp.uem.es/jmgomez * * This program is free software: you can redistribute it and/or modify * it for any purpose. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ import weka.core.*; import weka.classifiers.meta.FilteredClassifier; import java.util.List; import java.util.ArrayList; import java.io.*; /** * This class implements a simple sentiment classifier in Java using WEKA. * It loads a file with the text to classify, and the model that has been * learnt with the learn.sh script. * @author Jose Maria Gomez Hidalgo - http://www.esp.uem.es/jmgomez * @see MyFilteredLearner */ public class SentimentClassifier { /** * String that stores the text to classify. */ String text; /** * Object that stores the instance. */ Instances instances; /** * Object that stores the classifier. */ FilteredClassifier classifier; /** * This method loads the text to be classified. * @param fileName The name of the file that stores the text. */ public void load(String fileName) { try { BufferedReader reader = new BufferedReader(new FileReader( fileName)); String line; text = ""; while ((line = reader.readLine()) != null) { text = text + " " + line; } System.out.println("===== Loaded text data: " + fileName + " ====="); reader.close(); System.out.println(text); } catch (IOException e) { System.out.println("Problem found when reading: " + fileName); } } /** * This method loads the model to be used as classifier. * @param fileName The name of the file that stores the text. */ public void loadModel(String fileName) { try { ObjectInputStream in = new ObjectInputStream( new FileInputStream(fileName)); Object tmp = in.readObject(); classifier = (FilteredClassifier) tmp; in.close(); System.out .println("===== Loaded model: " + fileName + " ====="); } catch (Exception e) { // Given the cast, a ClassNotFoundException must be caught along with the IOException System.out.println("Problem found when reading: " + fileName); } } /** * This method creates the instance to be classified, from the text that has been read. */ public void makeInstance() { // Create the header List attributeList = new ArrayList(2); // Create first attribute, the text Attribute attribute1 = new Attribute("text", (List) null); attributeList.add(attribute1); // Create second attribute, the class List values = new ArrayList(2); values.add("no"); values.add("yes"); Attribute attribute2 = new Attribute("@@class@@", values); attributeList.add(attribute2); // Build instance set with just one instance instances = new Instances("Test relation", (java.util.ArrayList<Attribute>) attributeList, 1); // Set class index instances.setClassIndex(1); // Create and add the instance DenseInstance instance = new DenseInstance(2); instance.setDataset(instances); instance.setValue(attribute1, text); instances.add(instance); System.out .println("===== Instance created with reference dataset ====="); System.out.println(instances); } /** * This method performs the classification of the instance. * Output is done at the command-line. */ public void classify() { try { double pred = classifier .classifyInstance(instances.instance(0)); System.out.println("===== Classified instance ====="); System.out.println("Class predicted: " + instances.classAttribute().value((int) pred)); } catch (Exception e) { System.out.println("Problem found when classifying the text"); } } /** * Main method. It is an example of the usage of this class. * @param args Command-line arguments: fileData and fileModel. */ public static void main(String[] args) { SentimentClassifier classifier; if (args.length < 2) System.out .println("Usage: java SentimentClassifier <fileData> <fileModel>"); else { classifier = new SentimentClassifier(); classifier.load(args[0]); classifier.loadModel(args[1]); classifier.makeInstance(); classifier.classify(); } } }