2017-10-09 17 views
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次元が必要な理由がわからない

ご協力いただきますようお願い申し上げます。

+0

私はあなたのトレーニングデータセットと分類器を構築問題ありません。プロパティファイルの設定は何ですか?これを実行するためにどのようなコマンドを発行していますか? – StanfordNLPHelp

+0

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

+0

私は/edu/stanford/nlp/classify/demo/ClassifierDemo.javaを実行しています。私はColumnDataClassifier.javaの1457行目をコメントし、代わりにlc = new NaiveBayesClassifierFactory ()。trainClassifier(train);を追加しました。 – user3245722

答えて

0

私はこれらの性質を持つすべての問題を持っていないよ:

# 
# Features 
# 
useClassFeature=true 
1.useNGrams=true 
1.usePrefixSuffixNGrams=true 
1.maxNGramLeng=4 
1.minNGramLeng=1 
1.binnedLengths=10,20,30 
# 
# Printing 
# 
# printClassifier=HighWeight 
printClassifierParam=200 
# 
# Mapping 
# 
goldAnswerColumn=0 
displayedColumn=1 
# 
# Optimization 
# 
intern=true 
sigma=3 
useQN=true 
QNsize=15 
tolerance=1e-4 
useNB=true 
useClass=true 
# 
# Training input 
# 
trainFile=simple-classifier-training-set.txt 
serializeTo=model.txt 

そして、このコマンドを実行している:

java -Xmx8g edu.stanford.nlp.classify.ColumnDataClassifier -prop example.prop 
関連する問題