如何在实践中使用我的文本分类器?从获取新评论的 tf-idf 值开始
How can I use my text classifier in practice? As of getting the tf-idf values of new comments
假设我正在 java 中构建 classifier,它将 class 将评论过滤为垃圾邮件。数据集很简单它有两个属性字符串注释和标称class.
现在我需要使用 StringToWordVector 过滤器来过滤我的训练数据集。我的第一个问题是测试数据集,如果它被过滤,它将与训练集属性不同。我研究并发现我可以使用批量过滤,如:
StringToWordVector filter = new StringToWordVector();
//Here I will set the options, I would be using tf-idf and someothers
filter.setInputFormat(TrainingData);
现在这个方法正确吗?所以如果使用这个过滤器,这两个数据集应该是兼容的,但它们是以正确的方式过滤的吗?恐怕测试的 tf-idf 值会受到影响,从而降低准确性。
现在我的主要问题是如何在实践中使用 classifier?在实践中,我将得到一个字符串评论,我想我会把它作为一个实例,但我如何过滤它以获得 tf-idf 值 classify 呢?!!我想也许我可以将评论添加到原始训练数据集并每次都重新计算 tf-idf,但实际上是这样做的吗?
我正在尝试使用与垃圾邮件分类不同的文本分类任务来回答问题。
说,我有以下训练数据:
"The US government had imposed extra taxes on crude oil", petrolium
"The German manufacturers are observing different genes of Canola oil", non-petrolium
及以下测试数据:
"Canada is famous for producing quality corn oil", ?
现在,假设您将使用 Naive Bayes
和 StringToWordVector
过滤器。如果分别对训练数据和测试数据应用过滤器,您将得到两个截然不同的词向量。训练和测试数据中的每一项都将成为一个特征,因此你会得到类似 "Training and test data are not compatible" 的错误。因此,解决方案是使用 FilteredClassifier
来选择分类器(在我们的例子中是 Naive Bayes
)和过滤器(在我们的例子中是 StringToWordVector
)。您将需要类似于以下内容的内容:
private NaiveBayes nb;
private FilteredClassifier fc;
private StringToWordVector filter;
private double[] clsLabel;
// Set the filter--->
filter = new StringToWordVector();
filter.setTokenizer(tokenizer);
filter.setWordsToKeep(1000000);
filter.setDoNotOperateOnPerClassBasis(true);
filter.setLowerCaseTokens(true);
filter.setTFTransform(true);
filter.setIDFTransform(true);
filter.setStopwords(stopwords);
filter.setInputFormat(trainingData);
//<---setting of filter ends
//setting the classifier--->
fc = new FilteredClassifier();
nb = new NaiveBayes();
fc.setFilter(filter);
fc.setClassifier(nb);
//<---setting of the classifier ends
fc.buildClassifier(trainingData);
//Classification--->
clsLabel = new double[testData.numInstances()]; //holds class label of the test documents
//for each test document--->
for (int i = 0; i < testData.numInstances(); i ++){
try {
clsLabel[i] = fc.classifyInstance(testData.instance(i));
} catch (Exception e) {
System.out.println("Error from Classification.classify(). Cannot classify instance");
}
testData.instance(i).setClassValue(clsLabel[i]);
}//end for
//<---classification ends
注意。训练和测试数据的TF-IDF计算将分开进行。
假设我正在 java 中构建 classifier,它将 class 将评论过滤为垃圾邮件。数据集很简单它有两个属性字符串注释和标称class.
现在我需要使用 StringToWordVector 过滤器来过滤我的训练数据集。我的第一个问题是测试数据集,如果它被过滤,它将与训练集属性不同。我研究并发现我可以使用批量过滤,如:
StringToWordVector filter = new StringToWordVector();
//Here I will set the options, I would be using tf-idf and someothers
filter.setInputFormat(TrainingData);
现在这个方法正确吗?所以如果使用这个过滤器,这两个数据集应该是兼容的,但它们是以正确的方式过滤的吗?恐怕测试的 tf-idf 值会受到影响,从而降低准确性。
现在我的主要问题是如何在实践中使用 classifier?在实践中,我将得到一个字符串评论,我想我会把它作为一个实例,但我如何过滤它以获得 tf-idf 值 classify 呢?!!我想也许我可以将评论添加到原始训练数据集并每次都重新计算 tf-idf,但实际上是这样做的吗?
我正在尝试使用与垃圾邮件分类不同的文本分类任务来回答问题。
说,我有以下训练数据:
"The US government had imposed extra taxes on crude oil", petrolium
"The German manufacturers are observing different genes of Canola oil", non-petrolium
及以下测试数据:
"Canada is famous for producing quality corn oil", ?
现在,假设您将使用 Naive Bayes
和 StringToWordVector
过滤器。如果分别对训练数据和测试数据应用过滤器,您将得到两个截然不同的词向量。训练和测试数据中的每一项都将成为一个特征,因此你会得到类似 "Training and test data are not compatible" 的错误。因此,解决方案是使用 FilteredClassifier
来选择分类器(在我们的例子中是 Naive Bayes
)和过滤器(在我们的例子中是 StringToWordVector
)。您将需要类似于以下内容的内容:
private NaiveBayes nb;
private FilteredClassifier fc;
private StringToWordVector filter;
private double[] clsLabel;
// Set the filter--->
filter = new StringToWordVector();
filter.setTokenizer(tokenizer);
filter.setWordsToKeep(1000000);
filter.setDoNotOperateOnPerClassBasis(true);
filter.setLowerCaseTokens(true);
filter.setTFTransform(true);
filter.setIDFTransform(true);
filter.setStopwords(stopwords);
filter.setInputFormat(trainingData);
//<---setting of filter ends
//setting the classifier--->
fc = new FilteredClassifier();
nb = new NaiveBayes();
fc.setFilter(filter);
fc.setClassifier(nb);
//<---setting of the classifier ends
fc.buildClassifier(trainingData);
//Classification--->
clsLabel = new double[testData.numInstances()]; //holds class label of the test documents
//for each test document--->
for (int i = 0; i < testData.numInstances(); i ++){
try {
clsLabel[i] = fc.classifyInstance(testData.instance(i));
} catch (Exception e) {
System.out.println("Error from Classification.classify(). Cannot classify instance");
}
testData.instance(i).setClassValue(clsLabel[i]);
}//end for
//<---classification ends
注意。训练和测试数据的TF-IDF计算将分开进行。