如何在实践中使用我的文本分类器?从获取新评论的 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 BayesStringToWordVector 过滤器。如果分别对训练数据和测试数据应用过滤器,您将得到两个截然不同的词向量。训练和测试数据中的每一项都将成为一个特征,因此你会得到类似 "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计算将分开进行。