2014-10-03 3 views
0

Я использую простой конвейер 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 

... который предлагает мне, чтобы классификатор каким-то образом не собирал подготовка данных из файла.

Что я делаю неправильно? Заранее спасибо!

+0

Не могли бы вы точно указать способ инициализации вашего двигателя? Почему вы используете «MyClassifier.class»? Вы пытались установить контрольную точку отладки (или несколько System.out.println) в методе 'process'? Я подозреваю, что 'if (this.isTraining())' никогда не может быть вызван. – Renaud

+0

У меня есть отладочный вывод, но здесь он опущен, чтобы он был коротким. Я отредактировал вопрос, чтобы включить отладочные отпечатки. Они отображаются в консоли, поэтому я думаю, что метод вызван. 'MyClassifier' не является фактическим именем в моем коде. Я просто заменил свое фактическое имя, чтобы его было легче читать. Однако я не изменил его дважды, поэтому я исправил его. Кроме того, я добавил код конвейера. Наконец, я изменил код инициализации на 'CleartkAnnotator.PARAM_IS_TRAINING, true'. Я все равно получаю тот же результат при его запуске. –

+0

Хорошо, звучит хорошо. Просто чтобы убедиться, добавьте 'публичный недействительным Initialize (UimaContext контекст) \t \t \t бросает ResourceInitializationException { \t \t super.initialize (контекст); \t} ' – Renaud

ответ

0

Я предполагаю, что вы импортировали неправильный класс Sentence. Вы можете легко узнать, правильно ли я отлаживаю цикл for в процессе .-метод от MyClassifier.