2016-05-27 4 views
1

Я начинаю с weka.Классифицировать текст с weka после того, как классификатор прошел обучение

Мне удалось импортировать набор данных с диска (по одной папке по категории, весь текст, относящийся к этой категории внутри папки), применить StringToWordVector с токенизатором, направить наивный многочленный классификатор ... Код ниже (это C#, но Java, конечно, конечно)

Однако вряд ли я найду информацию о том, как использовать классификатор для проекта. Скажем, у меня есть текст с неизвестной категорией, введенный пользователем, как я могу применить категоризатор к этому тексту и сделать вывод о том, к какой категории он принадлежит? (код «// что делать ниже»). Любая помощь будет принята с благодарностью ;-)

Заранее спасибо

Жюльен

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

Благодарности

ответ

0

Лучшее место, чтобы узнать, как использовать Weka в вашем приложении Java находится в официальный Weka wiki.

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

В принципе, вы предоставляете новый набор данных (классификатор будет игнорировать атрибут категории), и вы спросите его, чтобы маркировать каждый экземпляр для вас, как этот

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(); 
Смежные вопросы