1
카테고리별로 텍스트 예제 뉴스를 분류하려고합니다. 나는 데이터베이스에 범주로 뉴스 텍스트의 거대한 데이터 세트를 가지고있다. 기계를 훈련 받아 뉴스 카테고리를 결정해야합니다.텍스트 분류 NaiveBayes
public static string[] Tokenize(string text)
{
StringBuilder sb = new StringBuilder(text);
char[] invalid = "!-;':'\",.?\n\r\t".ToCharArray();
for (int i = 0; i < invalid.Length; i++)
sb.Replace(invalid[i], ' ');
return sb.ToString().Split(new[] { ' ' }, System.StringSplitOptions.RemoveEmptyEntries);
}
private void Form1_Load(object sender, EventArgs e)
{
string strDSN = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = c:\\users\\158820\\Documents\\Database4.accdb";
string strSQL = "SELECT * FROM NewsRepository";
// create Objects of ADOConnection and ADOCommand
OleDbConnection myConn = new OleDbConnection(strDSN);
OleDbDataAdapter myCmd = new OleDbDataAdapter(strSQL, myConn);
myConn.Open();
DataSet dtSet = new DataSet();
myCmd.Fill(dtSet, "NewsRepository");
DataTable dTable = dtSet.Tables[0];
myConn.Close();
StringBuilder sWords = new StringBuilder();
string[][] swords = new string[dTable.Rows.Count][];
int i = 0;
foreach (DataRowView dr in dTable.DefaultView)
{
swords[i] = Tokenize(dr[1].ToString());
i++;
}
Codification codebook = new Codification(dTable, new string[] { "NewsTitle", "Category" });
DataTable symbols = codebook.Apply(dTable);
int[][] inputs = symbols.ToJagged<int>(new string[] { "NewsTitle" });
int[] outputs = symbols.ToArray<int>("Category");
bagOfWords(inputs, outputs);
}
private static void bagOfWords(int[][] inputs, int[] outputs)
{
var bow = new BagOfWords<int>();
var quantizer = bow.Learn(inputs);
string filenamebow = Path.Combine(Application.StartupPath, "News_BOW.accord");
Serializer.Save(obj: bow, path: filenamebow);
double[][] histograms = quantizer.Transform(inputs);
// One way to perform sequence classification with an SVM is to use
// a kernel defined over sequences, such as DynamicTimeWarping.
// Create the multi-class learning algorithm as one-vs-one with DTW:
var teacher = new MulticlassSupportVectorLearning<ChiSquare, double[]>()
{
Learner = (p) => new SequentialMinimalOptimization<ChiSquare, double[]>()
{
// Complexity = 100 // Create a hard SVM
}
};
// Learn a multi-label SVM using the teacher
var svm = teacher.Learn(histograms, outputs);
// Get the predictions for the inputs
int[] predicted = svm.Decide(histograms);
// Create a confusion matrix to check the quality of the predictions:
var cm = new GeneralConfusionMatrix(predicted: predicted, expected: outputs);
// Check the accuracy measure:
double accuracy = cm.Accuracy;
string filename = Path.Combine(Application.StartupPath, "News_SVM.accord");
Serializer.Save(obj: svm, path: filename);
}
나는 accord.net 개체를 훈련시키는 방법에 약간 혼란 스럽다. 나는 훈련 된 모델을 연재 할 수있다. (9 개 범주 내에서 3600 개의 고유 한 뉴스에 약 106MB이다.)
새로운 뉴스 텍스트의 카테고리를 예측하기 위해 어떻게 모델을 사용 하는가? 당신이 당신의 훈련 모델이되는 Serializer.Load<T>
를 사용하여 SVM 객체를 인스턴스화 할 수 연재했기 때문에
svm.Decide(outofSampleData)
: