2012-12-06 3 views
2

많은 예제가 있는데, 지금까지는 행운이 없었습니다. 나는 자유 텍스트를 분류하고 싶다.Weka 텍스트 분류를 테스트하는 방법 (FilteredClassifier) ​​

  1. 텍스트 분류자를 구성하십시오.
  2. 기차 분류를 (FilteredClassifier이 StringToWordVector 및 LibSVM를 사용하여) 다음

나중에

    종료
  1. 디스크에 FilteredClassifier를 직렬화 응용 프로그램을 (문서의 많은 필터링 텍스트에 기차에서 추가)
  2. 직렬화 된 FilteredClassifier로드
  3. 분류 물건!

디스크에서 읽고 물건을 분류하려고하면 괜찮습니다. 모든 문서와 예제는 동시에 작성되는 교육 목록과 테스트 목록을 보여 주며, 제 경우에는 테스트 목록을 작성하려고합니다.

FilteredClassifier만으로는 원본 교육 집합과 동일한 "사전"으로 테스트 인스턴스를 만드는 것으로 충분하지 않으므로 나중에 분류해야하는 모든 것을 어떻게 저장합니까?

http://weka.wikispaces.com/Use+WEKA+in+your+Java+code은 "어딘가에서로드 된 인스턴스"라고 말하고 비슷한 사전을 사용하는 것에 대해서는 아무 말도하지 않습니다.

ClassifierFramework cf = new WekaSVM(); 
if (!cf.isTrained()) { 
    train(cf); // Train, save to disk 
    cf = new WekaSVM(); // reloads from file 
} 
cf.test("this is a test"); 

는 직렬화

java.lang.ArrayIndexOutOfBoundsException: 2 
at weka.core.DenseInstance.value(DenseInstance.java:332) 
at weka.filters.unsupervised.attribute.StringToWordVector.convertInstancewoDocNorm(StringToWordVector.java:1587) 
at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:688) 
at weka.classifiers.meta.FilteredClassifier.filterInstance(FilteredClassifier.java:465) 
at weka.classifiers.meta.FilteredClassifier.distributionForInstance(FilteredClassifier.java:495) 
at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:70) 
at ratchetclassify.lab.WekaSVM.test(WekaSVM.java:125) 

답변

0

을 던지는 끝 당신의 훈련 데이터와 비슷 하지만 사전의 정의를 보유하고 Instances - 당신이 당신의 분류 직렬화하는 동안 :

Instances trainInstances = ... // 

Instances trainHeader = new Instances(trainInstances, 0); 
trainHeader.setClassIndex(trainInstances .classIndex()); 

OutputStream os = new FileOutputStream(fileName); 
ObjectOutputStream objectOutputStream = new ObjectOutputStream(os); 
objectOutputStream.writeObject(classifier); 
if (trainHeader != null) 
    objectOutputStream.writeObject(trainHeader); 
objectOutputStream.flush(); 
objectOutputStream.close(); 

이 desialize하기를 :

Classifier classifier = null; 
Instances trainHeader = null; 

InputStream is = new BufferedInputStream(new FileInputStream(fileName)); 
ObjectInputStream objectInputStream = new ObjectInputStream(is); 
classifier = (Classifier) objectInputStream.readObject(); 
try { // see if we can load the header 
    trainHeader = (Instances) objectInputStream.readObject(); 
} catch (Exception e) { 
} 
objectInputStream.close(); 

Instance을 새로 만들려면 trainHeader을 사용하십시오.

int numAttributes = trainHeader.numAttributes(); 
double[] vals = new double[numAttributes]; 

for (int i = 0; i < numAttributes - 1; i++) { 
    Attribute attribute = trainHeader.attribute(i); 

    //If your attribute is nominal or string:  
    double value = attribute.indexOfValue(myStrVal); //get myStrVal from your source 

    //If your attribute is numeric 
    double value = myNumericVal; //get myNumericVal from your source 

    vals[i] = value; 
} 

vals[numAttributes] = Instance.missingValue(); 

Instance instance = new Instance(1.0, vals); 
instance.setDataset(trainHeader); 
return instance; 
관련 문제