如何用Accord.Net做文本分类?

How to do text classification with Accord.Net?

我正在尝试使用 accord.net 进行文本分类。但是我找不到表示稀疏向量和矩阵的方法。例如,我们有很多文本,在使用 ngrams 和哈希进行标记化之后,每个文本都表示为具有权重 (tf) 的特征索引(由 featureHasher 给出)。并且不可能将所有数据作为非稀疏矩阵加载到内存中。有没有一种方法可以进行增量处理或表示稀疏矩阵或使用稀疏数据进行特征缩减?

遗憾的是,目前并非所有模型和方法都支持稀疏矩阵。但是,如果您尝试进行文本分类,则可以使用具有稀疏内核的支持向量机来完成。

稀疏内核可以在 Accord.Statistics.Kernels.Sparse 命名空间中找到,例如 SparseLinear and SparseGaussian. Those kernels expect data to be given in LibSVM's Sparse format. The specification for this format can be found in LibSVM's FAQ under the question Why sometimes not all attributes of a data appear in the training/model files?.

基本上,在这种格式中,特征向量将表示为

1 0 2 0

表示为

1:1 3:2

或者换句话说,作为 position:value 对的列表,其中 position 从 1.

开始

下面是一个示例,说明如何使用 LibSVM 的稀疏线性格式将 SVM 与 SparseLinear 内核一起使用:

// Example AND problem
double[][] inputs =
{
    new double[] {          }, // 0 and 0: 0 (label -1)
    new double[] {      2,1 }, // 0 and 1: 0 (label -1)
    new double[] { 1,1      }, // 1 and 0: 0 (label -1)
    new double[] { 1,1, 2,1 }  // 1 and 1: 1 (label +1)
};

// Dichotomy SVM outputs should be given as [-1;+1]
int[] labels =
{
    // 0,  0,  0, 1
        -1, -1, -1, 1
};

// Create a Support Vector Machine for the given inputs
// (sparse machines should use 0 as the number of inputs)
var machine = new KernelSupportVectorMachine(new SparseLinear(), inputs: 0); 

// Instantiate a new learning algorithm for SVMs
var smo = new SequentialMinimalOptimization(machine, inputs, labels);

// Set up the learning algorithm
smo.Complexity = 100000.0;

// Run
double error = smo.Run(); // should be zero

double[] predicted = inputs.Apply(machine.Compute).Sign();

// Outputs should be -1, -1, -1, +1
Assert.AreEqual(-1, predicted[0]);
Assert.AreEqual(-1, predicted[1]);
Assert.AreEqual(-1, predicted[2]);
Assert.AreEqual(+1, predicted[3]);