2017-11-27 8 views
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) 

:

답변

0

훈련 세트에없는 데이터 모델을 사용하여 다른 결정을 확인하기 위해 SVM를 호출하는 것만 큼 간단합니다 문서 번호 here.