2

これについて多くの例を見ましたが、これまでのところ運がありません。フリーテキストを分類したいと思います。

  1. テキスト分類子を構成します。(StringToWordVector と LibSVM を使用した FilteredClassifier)
  2. 分類子をトレーニングします (多数のドキュメントを追加し、フィルター処理されたテキストでトレーニングします)
  3. FilteredClassifier をディスクにシリアル化し、アプリを終了します

じゃあ後で

  1. シリアル化された FilteredClassifier をロードする
  2. モノを分類!

ディスクから読み取って物事を分類しようとするときまでは問題ありません。すべてのドキュメントと例は、トレーニング リストとテスト リストが同時に作成されていることを示しています。私の場合は、事後的にテスト リストを作成しようとしています。

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

1 に答える 1

0

Serialize your Instances which holds the definition of the trained data -similar dictionary?- while you are serializing your classifier:

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

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

Use trainHeader to create new Instance:

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;
于 2012-12-11T07:50:13.267 に答える