2016-05-27 3 views
1

Ich bin ein Anfänger mit Weka.Klassifizieren Sie einen Text mit Weka nachdem der Klassifikator trainiert wurde

Ich habe es geschafft, ein Dataset von der Festplatte zu importieren (ein Ordner nach Kategorie, alle Texte zu dieser Kategorie innerhalb des Ordners), StringToWordVector mit Tokenizer anwenden, ein Naive Multniomial-Kategorisierungsmodul trainieren ... Der Code ist unten (es ist C# aber Java ist natürlich ok)

Allerdings kann ich kaum Informationen finden, wie Sie das Kategorisierungsmodul für ein Projekt verwenden. Angenommen, ich habe einen Text mit unbekannter Kategorie, der von einem Benutzer eingegeben wurde. Wie kann ich das Kategorisierungsmodul nur auf diesen Text anwenden und daraus die Kategorie ableiten, zu der es gehört? (Code "// was hier unten zu tun ist"). Jede Hilfe sehr ;-) würde geschätzt

Vielen Dank im Voraus

Julien

string filepath = @"C:\Users\Julien\Desktop\Meal\"; 
    ClassificationDatasetHelper classHelper = new ClassificationDatasetHelper(); 
    weka.core.converters.TextDirectoryLoader tdl = new 
    weka.core.converters.TextDirectoryLoader(); 
    tdl.setDirectory(new java.io.File(filepath)); 
    tdl.setCharSet("UTF-8"); 

    weka.core.Instances insts = tdl.getDataSet(); 

    weka.filters.unsupervised.attribute.StringToWordVector swv = new weka.filters.unsupervised.attribute.StringToWordVector(); 
    swv.setInputFormat(insts); 
    swv.setDoNotOperateOnPerClassBasis(false); 
    swv.setOutputWordCounts(true); 
    swv.setWordsToKeep(1000); 
    swv.setIDFTransform(true); 
    swv.setMinTermFreq(1); 
    swv.setDoNotOperateOnPerClassBasis(false); 
    swv.setPeriodicPruning(-1); 
    weka.core.tokenizers.NGramTokenizer tokenizer = new weka.core.tokenizers.NGramTokenizer(); 
    tokenizer.setNGramMinSize(2); 
    tokenizer.setNGramMaxSize(2); 
    swv.setTokenizer(tokenizer); 

    insts = weka.filters.Filter.useFilter(insts, swv); 

    insts.setClassIndex(0); 

    weka.classifiers.Classifier cl = new weka.classifiers.bayes.NaiveBayesMultinomial(); 
    int trainSize = insts.numInstances() * percentSplit/100; 
    int testSize = insts.numInstances() - trainSize; 
    weka.core.Instances train = new weka.core.Instances(insts, 0, trainSize); 

    cl.buildClassifier(train); 
    string s = "Try to classify this text"; 
    weka.core.Instance instanceToClassify = new weka.core.Instance(); 

    // what to do here 
    // ??? 

    double predictedClass = cl.classifyInstance(instanceToClassify); 

Dank

Antwort

0

Der beste Ort, um zu erfahren wie Weka App in Ihrer Java zu verwenden ist in der offizielles Weka Wiki.

https://weka.wikispaces.com/Use+Weka+in+your+Java+code#Classification-Classifying%20instances

Grundsätzlich bieten Sie einen neuen Datensatz (der Klassifikator die Kategorie Attribut ignorieren) und fragt Sie es jede Instanz für Sie zu beschriften, wie diese

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileReader; 
import java.io.FileWriter; 
import weka.core.Instances; 
... 
// load unlabeled data 
Instances unlabeled = new Instances(
         new BufferedReader(
          new FileReader("/some/where/unlabeled.arff"))); 

// set class attribute 
unlabeled.setClassIndex(unlabeled.numAttributes() - 1); 

// create copy 
Instances labeled = new Instances(unlabeled); 

// label instances 
for (int i = 0; i < unlabeled.numInstances(); i++) { 
    double clsLabel = tree.classifyInstance(unlabeled.instance(i)); 
    labeled.instance(i).setClassValue(clsLabel); 
} 
// save labeled data 
BufferedWriter writer = new BufferedWriter(
          new FileWriter("/some/where/labeled.arff")); 
writer.write(labeled.toString()); 
writer.newLine(); 
writer.flush(); 
writer.close(); 
Verwandte Themen