2014-02-18 70 views
4

我想根據其內容將某些數據分類到不同的類中。我使用樸素貝葉斯分類器做了它,我得到了一個輸出作爲它所屬的最佳類別。但是現在我想將除了訓練集之外的新聞分類爲「其他」類。除了訓練數據之外,我不能手動將每個/每個數據添加到某個類中,因爲它擁有大量的其他類別。那麼是否有任何方法來分類其他數據?使用LingPipe將數據與樸素貝葉斯進行分類

private static File TRAINING_DIR = new File("4news-train"); 
private static File TESTING_DIR = new File("4news-test"); 
private static String[] CATEGORIES = { "c1", "c2", "c3", "others" }; 

private static int NGRAM_SIZE = 6; 

public static void main(String[] args) throws ClassNotFoundException, IOException { 
    DynamicLMClassifier<NGramProcessLM> classifier = DynamicLMClassifier.createNGramProcess(CATEGORIES, NGRAM_SIZE); 
    for (int i = 0; i < CATEGORIES.length; ++i) { 
     File classDir = new File(TRAINING_DIR, CATEGORIES[i]); 
     if (!classDir.isDirectory()) { 
      String msg = "Could not find training directory=" + classDir + "\nTraining directory not found"; 
      System.out.println(msg); // in case exception gets lost in shell 
      throw new IllegalArgumentException(msg); 
     } 

     String[] trainingFiles = classDir.list(); 
     for (int j = 0; j < trainingFiles.length; ++j) { 
      File file = new File(classDir, trainingFiles[j]); 
      String text = Files.readFromFile(file, "ISO-8859-1"); 
      System.out.println("Training on " + CATEGORIES[i] + "/" + trainingFiles[j]); 
      Classification classification = new Classification(CATEGORIES[i]); 
      Classified<CharSequence> classified = new Classified<CharSequence>(text, classification); 
      classifier.handle(classified); 
     } 
    } 
} 
+0

不確定你在問什麼。您的訓練集僅與C1,C2,C3類別進行比較,並且您想將其分爲4類:C1,C2,C3,其他? – amit

+0

我強烈建議拿鉛筆,並確保您瞭解需要做什麼計算。您面臨的挑戰與代碼沒有任何關係,但通過計算,所以您的問題可能最適合http://stats.stackexchange.com/如果您需要任何計算幫助,請參閱下面的註釋:http: //www.inf.ed.ac.uk/teaching/courses/inf2b/lectureSchedule.html – matcheek

+0

@matcheek我認爲這個問題實際上是關於LingPipe圖書館的,而不是關於幼稚bayes本身。 –

回答

0

只需序列化對象......這意味着寫中間對象到一個文件,這將是你的模型......

然後測試你只需將數據傳遞到模型中沒有必要每次訓練......這將是很容易爲你

1

樸素貝葉斯讓你在每個分類中的「信心」,因爲它計算

P(y|x) ~ P(y)P(x|y) 

截至正常化由P(x)它是xy類的一部分的可能性。你可以簡單地切斷該值和說,這

cl(x) = "other" iff max_{over y}(P(y|x)) < T 

其中T可以是在訓練例如最小置信度設置

T = min_{over x and y in Training set}(P(y|x)) 
+0

問題是如何使用LingPipe圖書館。 –

+0

我不認爲'T = min_ {訓練集中的x和y'(P(y | x))'是一個好主意,這是有偏見的,你對你訓練的結果非常感興趣......如果您正在對標記數據進行培訓,而不是合理地假設,這些在任何情況下都不應該轉到「其他人」,您可以在使用交叉驗證的同時通過 – amit

+0

@amit進行交叉驗證,當然這只是一個最簡單的想法/方法,可以通過幾十種方式「平滑」。例如,我們可以分析訓練數據上的整個P(y | x)(帶CV或不帶),並選擇閾值來切斷異常值,例如通過置信橢圓等。 – lejlot