Обучение наивному байесовскому классификатору Stanford-NLP

как часть понимания Стэнфордского nlp API для классификации, я тренирую наивный байесовский классификатор на очень простом тренировочном наборе (3 метки => ['счастливый', 'грустный', 'нейтральный']). Этот набор обучающих данных

happy   happy
happy   glad
sad gloomy
neutral fine

это часть результата обучения классификатора (до ошибки)

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]

Я получаю индекс массива за пределами ошибки. Я приложил трассировку стека. Я не могу найти проблему.

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) для разных классов (меток). Не уверен, зачем нужно третье измерение.

Любая помощь будет оценена.


person user3245722    schedule 09.10.2017    source источник
comment
У меня нет проблем с созданием классификатора с вашим набором обучающих данных. Каковы настройки в вашем файле свойств. Какую команду вы вводите, чтобы запустить это?   -  person StanfordNLPHelp    schedule 11.10.2017
comment
useClassFeature=false 1.useSplitWords=true 1.splitWordsWithPTBTokenizer=true # loadClassifier=projects/core/src/edu/stanford/nlp/classify/mood.classifier printClassifier=HighWeight printClassifierParam=20 justify=true displayColumn=-1 нижний регистр=true csvInput =false useNB=true useClass=true sigma=1.0 prior=false # Учебный ввод trainFile=projects/core/src/edu/stanford/nlp/classify/mood3.train testFile=projects/core/src/edu/stanford/nlp/ classify/mood3.test # для пайплайна annotators=cdc   -  person user3245722    schedule 11.10.2017
comment
я запускаю файл /edu/stanford/nlp/classify/demo/ClassifierDemo.java. я прокомментировал строку 1457 ColumnDataClassifier.java и вместо этого добавил lc = new NaiveBayesClassifierFactory‹String,String›().trainClassifier(train);   -  person user3245722    schedule 11.10.2017


Ответы (1)


У меня нет проблем с этими свойствами:

#
# 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
person StanfordNLPHelp    schedule 11.10.2017