【问题标题】:How to do text classification with Accord.Net?如何使用 Accord.Net 进行文本分类?
【发布时间】:2023-03-29 12:10:01
【问题描述】:

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

【问题讨论】:

    标签: accord.net


    【解决方案1】:

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

    可以在 Accord.Statistics.Kernels.Sparse 命名空间中找到稀疏内核,例如 SparseLinear 和 SparseGaussian。这些内核期望数据以 LibSVM 的稀疏格式给出。此格式的规范可以在问题Why sometimes not all attributes of a data appear in the training/model files? 下的LibSVM's FAQ 中找到。

    基本上,在这种格式中,一个特征向量可以表示为

    1 0 2 0
    

    表示为

    1:1 3:2
    

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

    这是一个示例,说明如何使用带有 SparseLinear 内核的 SVM,使用 LibSVM 的稀疏线性格式:

    // 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]);
    

    【讨论】:

    • 使用稀疏向量,训练时是否仍需要内存中的输入和输出,还是可以批量训练?
    • 你仍然需要它们在内存中。不幸的是,使用 SVM,批量训练非常棘手。但是,如果您使用的是 64 位 Windows,则可以使用 msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx 分配总大小大于 2 GB 的数组,并让操作系统根据需要负责将其换入和换出
    • 这取决于矩阵的大小。然而,尺寸为 50,000x500,000 的双精度型稀疏矩阵(完全有可能)需要大约 1500 GB 的空间。如果经常使用交换空间,这也可能需要很长时间才能训练。
    • 在这种情况下,可以更改策略:您可以使用随机梯度下降来批量学习线性模型,而不是使用 SVM。不幸的是,生成的模型不会像 SVM 那样具有良好的最优性保证,但是对于大型数据集,这可能是唯一可行的选择
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 2015-06-24
    • 2015-06-19
    • 2011-09-04
    • 2020-03-10
    • 2018-09-13
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多