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