Advertisement
Guest User

WekaTextClassification

a guest
Nov 12th, 2012
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.69 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.nio.MappedByteBuffer;
  5. import java.nio.channels.FileChannel;
  6. import java.nio.charset.Charset;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9.  
  10. import weka.classifiers.functions.LibSVM;
  11. import weka.classifiers.functions.SMO;
  12. import weka.classifiers.functions.supportVector.PolyKernel;
  13. import weka.core.Attribute;
  14. import weka.core.Instance;
  15. import weka.core.Instances;
  16. import weka.core.SerializationHelper;
  17. import weka.core.converters.TextDirectoryLoader;
  18. import weka.core.tokenizers.NGramTokenizer;
  19. import weka.filters.Filter;
  20. import weka.filters.unsupervised.attribute.StringToWordVector;
  21.  
  22. public class Finalizer {
  23.  
  24.     private static SMO svm;
  25.     private static Instances data;
  26.     private static StringToWordVector vectoriser;
  27.  
  28.     public Finalizer() throws Exception {
  29.         // this.svm = (LibSVM) SerializationHelper.read("SVM_NG_2_Movie.model");
  30.         this.svm = (SMO) SerializationHelper.read("SVM_NG_2_1_Movie.model");
  31.         this.data = (Instances) SerializationHelper.read("InstSMO.bin");
  32.         this.vectoriser = vectorizer();
  33.     }
  34.  
  35.     public static void buildSVMClassifier(String strDirPath) throws Exception {
  36.         NGramTokenizer ngt = new NGramTokenizer();
  37.         ngt.setNGramMaxSize(2);
  38.         TextDirectoryLoader tdl = new TextDirectoryLoader();
  39.         tdl.setDirectory(new File(strDirPath));
  40.         Instances instances = tdl.getDataSet();
  41.  
  42.         StringToWordVector stwv = new StringToWordVector();
  43.         stwv.setTokenizer(ngt);
  44.         stwv.setTFTransform(true);
  45.         stwv.setIDFTransform(true);
  46.         stwv.setUseStoplist(true);
  47.         stwv.setLowerCaseTokens(true);
  48.         stwv.setInputFormat(instances);
  49.  
  50.         Instances filterdInstances = Filter.useFilter(instances, stwv);
  51.  
  52.         /*
  53.          * LibSVM svm = new LibSVM(); SelectedTag kt = new SelectedTag(0,
  54.          * LibSVM.TAGS_KERNELTYPE); SelectedTag svmt = new SelectedTag(0,
  55.          * LibSVM.TAGS_SVMTYPE); svm.setKernelType(kt); svm.setSVMType(svmt);
  56.          * svm.setProbabilityEstimates(true);
  57.          * svm.buildClassifier(filterdInstances);
  58.          */
  59.         SMO smosvm = new SMO();
  60.         // RBFKernel kernal = new RBFKernel();
  61.         PolyKernel kernal = new PolyKernel();
  62.         smosvm.setKernel(kernal);
  63.  
  64.         smosvm.buildClassifier(filterdInstances);
  65.  
  66.         SerializationHelper sh = new SerializationHelper();
  67.         sh.write("SVM_NG_2_1_Movie.model", svm);
  68.         sh.write("InstSMO.bin", instances);
  69.  
  70.     }
  71.  
  72.     public static StringToWordVector vectorizer() throws Exception {
  73.         NGramTokenizer ngt = new NGramTokenizer();
  74.         ngt.setNGramMaxSize(2);
  75.         StringToWordVector stwv = new StringToWordVector();
  76.         stwv.setTokenizer(ngt);
  77.         stwv.setTFTransform(true);
  78.         stwv.setIDFTransform(true);
  79.         stwv.setUseStoplist(true);
  80.         stwv.setLowerCaseTokens(true);
  81.         // stwv.setInputFormat(data);
  82.  
  83.         return stwv;
  84.     }
  85.  
  86.     public static Instance makeInstance(String text, Instances data) {
  87.         int cIdx = data.numAttributes() - 1;
  88.         data.setClassIndex(cIdx);
  89.         Instance instance = new Instance(2);
  90.         Attribute messageAtt = data.attribute("text");
  91.         instance.setValue(messageAtt, messageAtt.addStringValue(text));
  92.         instance.setDataset(data);
  93.         instance.setClassMissing();
  94.         return instance;
  95.     }
  96.  
  97.     public static String classify(String msg) throws Exception {
  98.         // Filter.useFilter(data, vectoriser);
  99.         Instance inst = makeInstance(msg, data);
  100.  
  101.         vectoriser.setInputFormat(data);
  102.  
  103.         Filter.useFilter(data, vectoriser);
  104.         // data.
  105.         vectoriser.input(inst);
  106.         // vectoriser.setInputFormat(data);
  107.         Instance filteredInstance = vectoriser.output();
  108.         filteredInstance.setClassMissing();
  109.         //double predicted = 0;
  110.         String label = "uk";
  111.         try {
  112.             double predicted = svm.classifyInstance(filteredInstance);
  113.             label = data.classAttribute().value((int) predicted);
  114.         } catch (Exception e) {
  115.             e.printStackTrace();
  116.         }
  117.         // System.out.println(predicted);
  118.         //String label = data.classAttribute().value((int) predicted);
  119.         return label;
  120.     }
  121.  
  122.     // /////////For testing only
  123.     public static List<String> listFiles(String pathF) {
  124.         String path = pathF;
  125.  
  126.         String files;
  127.         File folder = new File(path);
  128.         File[] listOfFiles = folder.listFiles();
  129.  
  130.         List<String> fileList = new ArrayList<String>();
  131.  
  132.         for (int i = 0; i < listOfFiles.length; i++) {
  133.  
  134.             if (listOfFiles[i].isFile()) {
  135.                 files = listOfFiles[i].getAbsolutePath().toString();
  136.                 if (files.endsWith(".txt")) {
  137.                     // System.out.println(files);
  138.                     fileList.add(files);
  139.                 }
  140.             }
  141.         }
  142.         return fileList;
  143.     }
  144.  
  145.     // ///////////////////
  146.     // //
  147.     private static String readFile(String path) throws IOException {
  148.         FileInputStream stream = new FileInputStream(new File(path));
  149.         try {
  150.             FileChannel fc = stream.getChannel();
  151.             MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0,
  152.                     fc.size());
  153.             return Charset.defaultCharset().decode(bb).toString();
  154.         } finally {
  155.             stream.close();
  156.         }
  157.     }
  158.  
  159.     public static String extractFromTextFile(String FilePath)
  160.             throws IOException {
  161.         return readFile(FilePath);
  162.     }
  163.  
  164.     // /////////////////////////////
  165.  
  166.     public static void main(String[] args) throws Exception {
  167.         // String dp = "/usr/share/nltk_data/corpora/movie_reviews";
  168.         // buildSVMClassifier(dp);
  169.         String dir = "/home/u179995/nltk_data/pos";
  170.         List<String> files = listFiles(dir);
  171.  
  172.         Finalizer classifier = new Finalizer();
  173.         int file = 0;
  174.         int type = 0;
  175.         int typeNeg = 0;
  176.  
  177.         for (String string : files) {
  178.             file += 1;
  179.             System.out.println(string);
  180.             String content = extractFromTextFile(string);
  181.             String label = classifier.classify(content);
  182.             System.out.println("L : " + label + " :POS");
  183.  
  184.             if (label.equalsIgnoreCase("pos")) {
  185.                 type += 1;
  186.             } else {
  187.                 typeNeg += 1;
  188.             }
  189.         }
  190.  
  191.         System.out.println("NEG :" + type);
  192.         System.out.println("NEG AS POS :" + typeNeg);
  193.     }
  194.  
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement