2016-06-12 2 views
0

This questions описывает, как повторно использовать трубопровод в dkpro, но если я создать только один JCas, а затем попытаться изменить текст, то я получаю исключениеИзменить текст в многоразовой трубопроводе в DKPro

org.apache.uima.cas.CASRuntimeException: Data for Sofa feature setLocalSofaData() has already been set.

Как я обойти это?

ответ

2

Данные о диване в CAS можно установить только один раз. Он не может быть изменен после его установки.

Чтобы повторно использовать CAS, вызовите на нем метод reset(). Это очищает все аннотации и позволяет снова установить диван/текст.

Чтобы создать CAS поэтапно, общей стратегией является добавление аннотаций к CAS при добавлении текста в строковый буфер и установка текста только в конце процесса.

пример uimaFIT основе может выглядеть примерно так:

Strings[] texts = { 
    "Hello world.", 
    "This is a test." }; 

// Create empty CAS/JCas initialized using uimaFIT typesystem auto-detection 
JCas jcas = JCasFactory.createJCas(); 

// Instantiate some analysis engine 
AnalysisEngine engine = AnalysisEngineFactory.createEngine(...); 

// Process texts re-using the previously created CAS/JCas instance 
for (String t : texts) { 
    jcas.reset(); 
    jcas.setDocumentText(t); 
    jcas.setDocumentLanguage("en"); 
    engine.process(jcas); 
} 

engine.collectionProcessComplete(); 
engine.destroy(); 

Раскрытие информации: Я работаю над проектом Apache UIMA.

+0

Вы по-прежнему получаете преимущества в производительности от необходимости перезагружать все модели и т. Д. (Адрес является упомянутым вопросом), делая это таким образом? – zode64

+0

Если вы создаете экземпляр фактических компонентов, используя, например, uimaFIT 'AnalysisEngine engine = AnalysisEngineFactory.createEngine (...)' вызывает, то обычно модели/ресурсы загружаются только один раз (при создании экземпляра или в первом обработанном документе). Обработка CASes с использованием 'engine.process (cas);'. – rec