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.
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
Konvertieren Sie Kategorien in Features, lassen Sie alles aus, was einen Wert von Null hat, und es wird effizient gehandhabt. –
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