我正在尝试对weka进行一些测试,希望有人可以帮助我,我可以让自己清楚。
第1步:对我的数据进行标记
@attribute text string
@attribute @@class@@ {derrota,empate,win}
@data
'O Grêmio perdeu para o Cruzeiro por 1 a 0',derrota
'O Grêmio venceu o Palmeiras em um grande jogo de futebol, nesta quarta-feira na Arena',vitoria
第2步:在标记化数据上构建模型
加载后我应用StringToWordVector。应用此过滤器后,我保存一个新的arff文件,其中包含单词tokenized。像...这样的东西。
@attribute @@class@@ {derrota,vitoria,win}
@attribute o numeric
@attribute grêmio numeric
@attribute perdeu numeric
@attribute venceu numeric
@ and so on .....
@data
{0 derrota, 1 1, 2 1, 3 1, 4 0, ...}
{0 vitoria, 1 1, 2 1, 3 0, 4 1, ...}
确定!现在基于这个arff我构建我的分类器模型并保存它。
第3步:使用“模拟新数据”进行测试
如果我想用“模拟新数据”来测试我的模型,我实际上正在编辑这个最后一个arff并制作一行像
{0?,1 1,2 1,2 1,3 1,...}
第4步(我的问题):如何使用真正的新数据进行测试
到目前为止一切顺利。我的问题是当我需要将这个模型与“真正的”新数据一起使用时。 例如,如果我有一个字符串“OGrêmiocaiudiante do Palmeiras”。我有4个新单词,在我的模型中不存在,2个存在。
如何使用可以在我的模型中拟合的新数据创建一个arff文件? (好吧,我知道4个新单词不会出现,但我怎么能用它?)
提供不同的测试数据后,将显示以下消息
答案 0 :(得分:1)
如果您以编程方式使用Weka,那么您可以相当轻松地完成此任务。
Instances trainingData = ..
示例代码:
StringToWordVector() filter = new StringToWordVector();
filter.setWordsToKeep(1000000);
if(useIdf){
filter.setIDFTransform(true);
}
filter.setTFTransform(true);
filter.setLowerCaseTokens(true);
filter.setOutputWordCounts(true);
filter.setMinTermFreq(minTermFreq);
filter.setNormalizeDocLength(new SelectedTag(StringToWordVector.FILTER_NORMALIZE_ALL,StringToWordVector.TAGS_FILTER));
NGramTokenizer t = new NGramTokenizer();
t.setNGramMaxSize(maxGrams);
t.setNGramMinSize(minGrams);
filter.setTokenizer(t);
WordsFromFile stopwords = new WordsFromFile();
stopwords.setStopwords(new File("data/stopwords/stopwords.txt"));
filter.setStopwordsHandler(stopwords);
if (useStemmer){
Stemmer s = new /*Iterated*/LovinsStemmer();
filter.setStemmer(s);
}
filter.setInputFormat(trainingData);
将过滤器应用于trainingData:trainingData = Filter.useFilter(trainingData, filter);
选择分类器以创建模型
LibLinear分类器的示例代码
Classifier cls = null;
LibLINEAR liblinear = new LibLINEAR();
liblinear.setSVMType(new SelectedTag(0, LibLINEAR.TAGS_SVMTYPE));
liblinear.setProbabilityEstimates(true);
// liblinear.setBias(1); // default value
cls = liblinear;
cls.buildClassifier(trainingData);
示例代码
System.out.println("Saving the model...");
ObjectOutputStream oos;
oos = new ObjectOutputStream(new FileOutputStream(path+"mymodel.model"));
oos.writeObject(cls);
oos.flush();
oos.close();
创建测试文件(例如testing.arff)
从培训文件创建实例:Instances testingData=...
加载分类器
示例代码
Classifier myCls = (Classifier) weka.core.SerializationHelper.read(path+"mymodel.model");
使用与上面相同的StringToWordVector过滤器或为testingData创建一个新过滤器,但请记住对此命令使用trainingData:filter.setInputFormat(trainingData);
这将保留训练集的格式,不会添加不在训练集中的单词。
将过滤器应用于testingData:testingData = Filter.useFilter(testingData, filter);
分类<!/ p>
示例代码
for (int j = 0; j < testingData.numInstances(); j++) {
double res = myCls.classifyInstance(testingData.get(j));
}