Использование Маллета для наивной байесовской классификации: как и где настраиваются алфавиты?

Я пытаюсь использовать библиотеку машинного обучения MALLET в проекте для устранения неоднозначности смысла слов. Мои векторы признаков состоят из окна токена фиксированного размера, состоящего из x токенов слева и справа от целевого токена. Учебные экземпляры MALLET создаются следующим образом:

// Create training list
Pipe pipe = new TokenSequenceLowercase();
InstanceList instanceList = new InstanceList(pipe);
Instance trainingInstance = new Instance(data, senseID, instanceID, text);
instanceList.add(trainingInstance);
...
// Training
ClassifierTrainer classifierTrainer = new NaiveBayesTrainer();
Classifier classifier = classifierTrainer.train(trainingList);

куда

  • «данные» — это ArrayList‹String› с токенами функций
  • «senseID» — это метка класса соответствующего смысла слова.
  • «instanceID» — это просто строка для идентификации обучающего экземпляра.
  • "текст" - исходный текст

Я ожидал, что свойства dataAlphabet и targetAlphabet InstanceList создаются на лету по мере добавления обучающих экземпляров, но это не так. Следовательно, мой код не работает в последней строке выше с NPE, поскольку свойство targetAlphabet тренера NB равно NULL.

Глядя на код MALLET (благодаря открытому исходному коду), я вижу, что основная причина отсутствия построения Alphabets заключается в том, что мои данные и метки не реализуют интерфейс AlphabetCarrying. Поэтому здесь в классе Instance возвращается NULL:

public Alphabet getDataAlphabet() {
    if (data instanceof AlphabetCarrying)
        return ((AlphabetCarrying)data).getAlphabet();
    else
        return null;
}

Я нахожу это довольно запутанным, потому что в документации сказано, что данные и метки могут относиться к любому типу объекта. Но эта ошибка выше, кажется, наоборот, указывает на то, что мне нужно построить определенный класс данных/меток, который реализует AlphabetCarrying.

Я чувствую, что упускаю что-то важное на концептуальном уровне в отношении этих алфавитов. Кроме того, мне не ясно, должен ли алфавит данных быть получен из всех обучающих экземпляров или только из одного. Может ли кто-нибудь объяснить ошибку здесь?

Ваше здоровье,

Мартин


person martin_wun    schedule 27.12.2014    source источник


Ответы (1)


Отвечая на мой собственный вопрос здесь: решение состояло в том, чтобы добавить несколько каналов, в частности, канал TokenSequence2FeatureSequence для построения алфавита данных и Target2Label для построения алфавита меток. Кроме того, обучающие экземпляры необходимо добавить с помощью instanceList.addThruPipe(trainingInstance).

Это основано на ответах из списка рассылки Mallet.

person martin_wun    schedule 05.01.2015
comment
Возможно, у вас возникла проблема с импортом данных, с которыми должно помочь это руководство: mallet.cs. umass.edu/import-devel.php - person c-chavez; 18.06.2017