Я использую простой конвейер Cleartk (V. 2.0) для разработки бинарного классификатора для отдельных предложений в CAS. Однако, несмотря на то, что данные обучения генерируются, классификатор не выбирает его во время обучения, см. Ниже.Cleartk - Mallet Классификатор тренируется на 0 экземплярах, несмотря на то, что там есть
Я отработка this example, в частности, этот фрагмент кода:
AnalysisEngineFactory.createPrimitiveDescription(
<name-of-your-cleartk-annotator>.class,
CleartkAnnotator.PARAM_IS_TRAINING, true,
DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
<your-output-directory-file>,
DefaultSequenceDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
<name-of-your-selected-classifier's-data-writer>.class);
Так что мой код инициализации выглядит следующим образом:
AnalysisEngine trainClassifier = AnalysisEngineFactory.createPrimitive(MyClassifier.class,
CleartkAnnotator.PARAM_IS_TRAINING, true,
DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY, "target/classifier-data/",
DefaultSequenceDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME, MalletCrfStringOutcomeDataWriter.class.getName());
Когда я запускаю мой трубопровод данные получают созданные и сохраненные в target/classifier-data/training-data.malletcrf
, где каждая строка представляет собой вектор функций с отдельными записями, имеющими формат <featurename>_<value>
и мой логический целевой атрибут. Я могу открыть его в текстовом редакторе и посмотреть на него.
Я использую классификатор результатов String, потому что мой аннотатор переменной цели наследует от CleartkSequenceAnnotator
и, как я понимаю из предыдущих ответов на список Cleartk, не существует логического классификатора, который может работать с несколькими задачами классификации за CAS.
Мой грубый код Классификатор:
public class MyClassifier extends CleartkSequenceAnnotator<String> {
@Override
public void process(JCas jCas) throws AnalysisEngineProcessException {
// retrieve sentences in the cas
for (Sentence sentence : sentences) {
// apply feature extractors here to add features
// add target variable
}
if (this.isTraining()) {
// write the features and outcomes as training instances
this.dataWriter.write(Instances.toInstances(targets, featureLists));
try {
System.out.println("training the classifier ... ");
Train.main("target/classifier-data/");
System.out.println("done training classifier");
} catch (Exception e) {
System.out.println("ERROR while training the classifier.");
e.printStackTrace();
}
} else /* Classification */ {...}
}
Вот код трубопровода:
SimplePipeline.runPipeline(reader,
trainClassifier,
XmiWriter);
При запуске конвейера, даже если подготовка данных была написана, я получаю следующий вывод на консоль :
... reader initialization ...
Couldn't open cc.mallet.util.MalletLogger resources/logging.properties file.
Perhaps the 'resources' directories weren't copied into the 'class' directory.
Continuing.
starting pipeline
training the classifier ...
Okt 02, 2014 11:19:48 PM cc.mallet.fst.SimpleTagger main
INFORMATION: Number of features in training data: 0
Okt 02, 2014 11:19:48 PM cc.mallet.fst.SimpleTagger main
INFORMATION: Number of predicates: 0
Okt 02, 2014 11:19:48 PM cc.mallet.fst.SimpleTagger main
INFORMATION: Labels: O
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRF addOrderNStates
INFORMATION: Preparing O
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRF addOrderNStates
INFORMATION: O->O(O) O,O
State #0 "O"
initialWeight=0.0, finalWeight=0.0
#destinations=1
-> O
Okt 02, 2014 11:19:48 PM cc.mallet.fst.SimpleTagger train
INFORMATION: Training on 0 instances
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRF setWeightsDimensionAsIn
INFORMATION: CRF weights[O,O] num features = 0
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRF setWeightsDimensionAsIn
INFORMATION: Number of weights = 1
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRFTrainerByLabelLikelihood train
INFORMATION: CRF about to train with 1 iterations
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRFOptimizableByLabelLikelihood getValue
INFORMATION: getValue() (loglikelihood, optimizable by label likelihood) = 0.0
Okt 02, 2014 11:19:48 PM cc.mallet.optimize.LimitedMemoryBFGS optimize
INFORMATION: L-BFGS initial gradient is zero; saying converged
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRFTrainerByLabelLikelihood train
INFORMATION: CRF finished one iteration of maximizer, i=0
Okt 02, 2014 11:19:48 PM cc.mallet.fst.CRFTrainerByLabelLikelihood train
INFORMATION: CRF training has converged, i=0
done training classifier
... который предлагает мне, чтобы классификатор каким-то образом не собирал подготовка данных из файла.
Что я делаю неправильно? Заранее спасибо!
Не могли бы вы точно указать способ инициализации вашего двигателя? Почему вы используете «MyClassifier.class»? Вы пытались установить контрольную точку отладки (или несколько System.out.println) в методе 'process'? Я подозреваю, что 'if (this.isTraining())' никогда не может быть вызван. – Renaud
У меня есть отладочный вывод, но здесь он опущен, чтобы он был коротким. Я отредактировал вопрос, чтобы включить отладочные отпечатки. Они отображаются в консоли, поэтому я думаю, что метод вызван. 'MyClassifier' не является фактическим именем в моем коде. Я просто заменил свое фактическое имя, чтобы его было легче читать. Однако я не изменил его дважды, поэтому я исправил его. Кроме того, я добавил код конвейера. Наконец, я изменил код инициализации на 'CleartkAnnotator.PARAM_IS_TRAINING, true'. Я все равно получаю тот же результат при его запуске. –
Хорошо, звучит хорошо. Просто чтобы убедиться, добавьте 'публичный недействительным Initialize (UimaContext контекст) \t \t \t бросает ResourceInitializationException { \t \t super.initialize (контекст); \t} ' – Renaud