Классификатор Mallet NaiveBayes в нулевом указателе Java

Я пытаюсь создать экземпляр наивного байесовского классификатора для классификации текстовых блоков (с заранее определенной классификацией). Пример ниже просто пытается сделать это с мужчиной/женщиной. Я попытался загрузить данные из файла (CSVloader) и создать экземпляры ниже. Проблема в том, что метод train.train() выдает исключение нулевого указателя. Кажется, это потому, что targetDictionary имеет значение null. Словарь данных заполнен. Как заставить targetDictionary заполнить экземпляр?

Моя фактическая цель - классифицировать бумажные рефераты, которые у меня есть в базе данных, как «Науку, политику, право, здоровье и т. Д.». Похоже, что байесовский классификатор является правильным выбором для этого.

Я повторил загруженный instanceList, и он, кажется, заполнен правильно, и dataDictionary заполнен, но TargetDictionary имеет значение null.

Использование Mallet 2.0.8 в Windows

public TestMallet() throws IOException {

ArrayList<Pipe> pipelist = new ArrayList<Pipe>();

    pipelist.add (new CharSequenceLowercase() ) ;
    pipelist.add (new CharSequence2TokenSequence(Pattern.compile("\\p{L}[\\p{L}\\p{P}]+\\p{L}")) ) ;

    pipelist.add (new TokenSequenceRemoveStopwords (new File ("c:\\test\\config\\stopwords_en.txt"), "UTF-8", false, false, false) ) ;
    pipelist.add (new TokenSequence2FeatureSequence()) ;
    pipelist.add (new FeatureSequence2FeatureVector()) ; // Added but doesnt make any difference

    InstanceList instances = new InstanceList (new SerialPipes(pipelist)) ;

    Instance instance0 = new Instance("Hello World I am here and i am male my name is roger",   "Male",   "roger", "test") ;
    Instance instance1 = new Instance("Hello World I am here and i am male my name is phil",    "Male",   "phil",  "test") ;
    Instance instance2 = new Instance("Hello World I am here and i am male my name is joe",     "Male",   "joe",   "test") ;
    Instance instance3 = new Instance("Hello World I am here and i am female my name is vira",  "Female", "vira",  "test") ;
    Instance instance4 = new Instance("Hello World I am here and i am female my name is josie", "Female", "josie", "test") ;

    instances.addThruPipe (instance0) ;
    instances.addThruPipe (instance1) ;
    instances.addThruPipe (instance2) ;
    instances.addThruPipe (instance3) ;
    instances.addThruPipe (instance4) ;

    // Using Instance List to train
    // ----------------------------

    ClassifierTrainer trainer = new NaiveBayesTrainer();
    trainer.train(instances); 

// Null pointer exception here ( debugging, it looks like TargetDictionary is null) 

}

Ожидая, что тренер правильно проанализирует.


person Roger Brackin    schedule 30.07.2019    source источник


Ответы (1)


Классификатор учится предсказывать выходные данные на основе входных признаков. В обоих случаях нам обычно нужно преобразовать строки в числовые представления. Вы говорите Маллету, как сделать это преобразование для входных объектов, но не для выходной метки.

Добавление канала Target2Label() должно сделать это, см. класс Csv2Vectors для примера.

person David Mimno    schedule 31.07.2019