2017-09-21 10 views
1

Ich verwende Mallet mit dem SVMLight Eingabeformat zu tun classification mit NaiveBayes Klassifikator. Aber ich bekomme eine NumberFormatException. Ich frage mich, wie ich Strings Features verwenden kann, wenn Sie SVMLight verwenden. Wie ich in der Richtlinie 1 gelesen habe, können die Features auch Strings sein.Was ist das korrekte svmlight-Eingabeformat in Mallet?

Kann mir jemand helfen, was ist falsch mit meinem Code oder Eingabe?

Hier ist mein Code:

public void trainMalletNaiveBayes() throws Exception { 

     ArrayList<Pipe> pipes = new ArrayList<Pipe>(); 
     pipes.add(new SvmLight2FeatureVectorAndLabel()); 
     pipes.add(new PrintInputAndTarget()); 

     SerialPipes pipe = new SerialPipes(pipes); 

     //prepare training instances 
     InstanceList trainingInstanceList = new InstanceList(pipe); 

     trainingInstanceList.addThruPipe(new CsvIterator(new FileReader("/tmp/featureFiles_svm.csv"), "^(\\S*)[\\s,]*(.*)$", 2, 1, -1)); 

     //prepare test instances 
     InstanceList testingInstanceList = new InstanceList(pipe); 
     testingInstanceList.addThruPipe(new CsvIterator(new FileReader("/tmp/test_set.csv"), "^(\\S*)[\\s,]*(.*)$", 2, 1, -1)); 

     ClassifierTrainer trainer = new NaiveBayesTrainer(); 
     Classifier classifier = trainer.train(trainingInstanceList); 

Und hier ist die ersten drei Zeilen meiner Eingabedatei:

No f1:NP f2:NN f3:1 f4:1 f5:0 f6:0 f7:0 f8:0.0 f9:1 f10:true f11:false f12:false f13:false f14:false f15:ROOT f16:NN f17:NOTHING 
No f1:NP f2:NN f3:8 f4:4 f5:0 f6:0 f7:1 f8:4.127134385045092 f9:8 f10:true f11:false f12:false f13:false f14:false f15:ROOT f16:DT f17:NOTHING 
Yes f1:NP f2:NN f3:4 f4:3 f5:0 f6:0 f7:0 f8:0.0 f9:4 f10:true f11:false f12:false f13:false f14:false f15:NP f16:DT f17:NN 

Die erste Spalte die Bezeichnung der Instanz ist und dort Rest der Daten enthält die Funktionen und ihre Werte. Zum Beispiel zeigt NN die POS des Kopfwortes einer Phrase.

In der Zwischenzeit bekomme ich die Ausnahme für die NN (NumberFormatException: For input string: "NN"). Ich wundere mich, warum es kein Problem mit der NP hat, die davor kommt, aber an der NN stoppt.

Antwort

1

Alle Features müssen numerische Werte haben. Für Boolesche Werte können Sie true = 1 und false = 0 verwenden. Sie müssten auch f1: NP zu f1_NP = 1 ändern. Der Grund dafür, dass die Klasse SvmLight2FeatureVectorAndLabel nicht erwartet, dass eine ganze Zeile (Label und Daten) analysiert wird, liegt darin, dass der Code die Datei mit einer CsvIterator liest, die das erste Element als Beschriftung abspaltet .

Die classify.tui.SvmLight2Vectors Klasse verwendet diesen Code für einen Iterator:

new SelectiveFileLineIterator (fileReader, "^\\s*#.+") 
+0

Vielen Dank für Ihre Antwort. Und sollte ich alle anderen Funktionen mit einem Nullwert zur Zeile hinzufügen. Zum Beispiel, wenn ich einen NP-Wert für ein Feature habe, heißt das, dass es nicht VP, S, FRAG usw. ist. Sollte ich auch f2_VP hinzufügen: 0, f3_S: 0 usw.? Ich meine, sollte ich meine Kategoriale konvertieren Funktionen zu numerischen Funktionen? Dann werde ich einen wirklich spärlichen Merkmalsvektor haben. Recht? – user1419243

+0

Konvertieren Sie Kategorien in Features, lassen Sie alles aus, was einen Wert von Null hat, und es wird effizient gehandhabt. –

+0

Danke. Es funktioniert jetzt ohne Fehler :) Nur eine andere Frage, mit dem obigen Format und dem geschriebenen Code, bekomme ich den Namen: csvline: 1 Ziel: f1_NP: 1 Eingabe: f2 (0) = 0.0 f3 (1) = 0.0 f4 (2) = 2.65 ... Es scheint, dass es mein Ziel nicht richtig liest und ein Feature als Ziel nimmt. Ist mein Code oder Eingabeformat irgendwo falsch oder funktioniert PrintInputAndTarget() nicht mit SVMLight und ist nur für das andere Format? – user1419243

Verwandte Themen