0
分類のためのスタンフォードnlp APIの理解の一部として、私は非常に単純なトレーニングセット(3ラベル=> ['幸せ'、 '悲しい'、 'ニュートラル'])。このトレーニングデータセットは、これは私が境界エラーのうち、配列のインデックスを取得します(エラーの前に)分類器をトレーニングからの出力の一部スタンフォード-nlpナイーブベイズ分類器トレーニング
numDatumsPerLabel: {happy=2.0, sad=1.0, neutral=1.0}
numLabels: 3 [happy, sad, neutral]
numFeatures (Phi(X) types): 4 [1-SW-happy, 1-SW-glad, 1-SW-gloomy, 1-SW-fine]
ある
happy happy
happy glad
sad gloomy
neutral fine
です。スタックトレースを添付しました。私は問題を見つけることができません。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at edu.stanford.nlp.classify.NaiveBayesClassifierFactory.trainWeightsJL(NaiveBayesClassifierFactory.java:171)
at edu.stanford.nlp.classify.NaiveBayesClassifierFactory.trainWeights(NaiveBayesClassifierFactory.java:146)
at edu.stanford.nlp.classify.NaiveBayesClassifierFactory.trainClassifier(NaiveBayesClassifierFactory.java:84)
at edu.stanford.nlp.classify.NaiveBayesClassifierFactory.trainClassifier(NaiveBayesClassifierFactory.java:352)
at edu.stanford.nlp.classify.ColumnDataClassifier.makeClassifier(ColumnDataClassifier.java:1458)
at edu.stanford.nlp.classify.ColumnDataClassifier.trainClassifier(ColumnDataClassifier.java:2091)
at edu.stanford.nlp.classify.demo.ClassifierDemo.main(ClassifierDemo.java:35)
private NBWeights trainWeightsJL(int[][] data, int[] labels, int numFeatures, int numClasses) {
int[] numValues = numberValues(data, numFeatures);
double[] priors = new double[numClasses];
double[][][] weights = new double[numClasses][numFeatures][];
//init weights array
for (int cl = 0; cl < numClasses; cl++) {
for (int fno = 0; fno < numFeatures; fno++) {
weights[cl][fno] = new double[numValues[fno]];
// weights[cl][fno] = new double[numFeatures];
}
}
for (int i = 0; i < data.length; i++) {
priors[labels[i]]++;
for (int fno = 0; fno < numFeatures; fno++) {
weights[labels[i]][fno][data[i][fno]]++;
}
}
for (int cl = 0; cl < numClasses; cl++) {
for (int fno = 0; fno < numFeatures; fno++) {
for (int val = 0; val < numValues[fno]; val++) {
weights[cl][fno][val] = Math.log((weights[cl][fno][val] + alphaFeature)/(priors[cl] + alphaFeature * numValues[fno]));
}
}
priors[cl] = Math.log((priors[cl] + alphaClass)/(data.length + alphaClass * numClasses));
}
return new NBWeights(priors, weights);
}
に重みを得るための一環として、私は何
int[] numValues = numberValues(data, numFeatures);
手段を理解することができません。エラーがライン
weights[labels[i]][fno][data[i][fno]]++;
私は思考の重みを持つことになり機能(FNO)異なるクラス(ラベル)のための出現箇所を追跡するために2次元配列があるからです。 3次元が必要な理由がわからない
ご協力いただきますようお願い申し上げます。
私はあなたのトレーニングデータセットと分類器を構築問題ありません。プロパティファイルの設定は何ですか?これを実行するためにどのようなコマンドを発行していますか? – StanfordNLPHelp
useClassFeature = falseを 1.useSplitWords =真 1.splitWordsWithPTBTokenizer =真 #loadClassifier =プロジェクト/コア/ SRC/EDU /スタンフォード/ NLP /分類/ mood.classifier printClassifier = HighWeight printClassifierParam = 20 正当化します=真 displayedColumn = -1 小文字=真 csvInput = falseを useNB =真 useClass =真 シグマ= 1.0 前= falseを #トレーニング入力パイプライン アノテータため trainFile =プロジェクト/コア/ SRC/EDU /スタンフォード/ NLP /分類/ mood3.train TESTFILE =プロジェクト/コア/ SRC/EDU /スタンフォード/ NLP /分類/ mood3.test #= cdc – user3245722
私は/edu/stanford/nlp/classify/demo/ClassifierDemo.javaを実行しています。私はColumnDataClassifier.javaの1457行目をコメントし、代わりにlc = new NaiveBayesClassifierFactory()。trainClassifier(train);を追加しました。 –
user3245722