2015-06-15 4 views
2

Я пытаюсь использовать accord.net для текста classifaction. Но я не могу найти способ представления разреженных векторов и матриц. Например, у нас есть много текстов и после токенизации с помощью ngrams и хэширования, каждый текст представлен как индекс функции (заданный функциейHasher) с весом (tf). И невозможно загрузить все данные в виде не разреженной матрицы в память. Есть ли способ сделать инкрементную обработку или представлять разреженную матрицу или уменьшить функцию с разреженными данными?Как сделать классификацию текста с помощью Accord.Net?

ответ

2

К сожалению, не все модели и методы поддерживают разреженные матрицы в это время. Однако, если вы пытаетесь выполнить категоризацию текста, вы можете сделать это, используя машину поддержки Vector с ядром Sparse.

Редкие ядра можно найти в пространстве имен Accord.Statistics.Kernels.Sparse, например, SparseLinear и SparseGaussian. Эти ядра ожидают, что данные будут предоставлены в разреженном формате LibSVM. Спецификацию для этого формата можно найти в LibSVM's FAQ по вопросу Why sometimes not all attributes of a data appear in the training/model files?.

В принципе, в этом формате, вектор признаков, который будет представлен в виде

1 0 2 0 

представлен как

1:1 3:2 

или, другими словами, в виде списка позиции: значение пар , где позиция начинается с 1.

Вот пример того, как использовать SVMs с SparseLinear ядром, используя редкий линейный формат 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]); 
+0

с редкими векторами вы все еще необходимы на входах и выходах в памяти во время обучения или вы можете тренировать в партиях? – Telavian

+0

Вы все еще нуждаетесь в них в памяти. К сожалению, с помощью SVM очень сложно тренироваться партиями. Однако, если вы используете 64-битную Windows, вы можете выделить массивы размером более 2 ГБ, используя https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110). aspx, и пусть ОС позаботится об их замене и при необходимости – Cesar

+0

Это работает в зависимости от размера матрицы. Однако разреженная матрица типа double с размерами 50 000 x 500 000, что вполне возможно, потребует около 1500 ГБ пространства. Это также, вероятно, потребует бесконечного обучения, если пространство подкачки будет постоянно использоваться. – Telavian

 Смежные вопросы

  • Нет связанных вопросов^_^