gpt4 book ai didi

java - 如何测试 Weka 文本分类 (FilteredClassifier)

转载 作者:行者123 更新时间:2023-11-29 09:08:08 25 4
gpt4 key购买 nike

为此查看了很多示例,但到目前为止还没有成功。我想对自由文本进行分类。

  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)

最佳答案

序列化您的 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();

反序列化:

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

使用trainHeader创建新的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;

关于java - 如何测试 Weka 文本分类 (FilteredClassifier),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13751162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com