Строка IN, строка OUT?
Я новичок в ClearTK и UIMA. До сих пор я не смог найти примеров того, как создать конвейер, в котором нет файлов.
Я пытаюсь обработать небольшой текст, хранящийся в переменной Java String, используя cleartk и UIMA, и получить обратно XML String (результат аннотаторов ClearTK TimeML).
Я смог предоставить String в качестве входных данных (см. Фрагмент кода), но код далек от элегантного (необходим для выполнения набора и очистки URI для CAS.) Кроме того, выходные данные сохраняются в файл, но я хочу получить строку назад (не имеет смысла сохранять выходные данные в файл, а затем считывать файл обратно в память).
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.fit.factory.AnalysisEngineFactory;
import org.apache.uima.fit.pipeline.SimplePipeline;
import org.apache.uima.jcas.JCas;
import org.cleartk.corpus.timeml.TempEval2007Writer;
import org.cleartk.opennlp.tools.PosTaggerAnnotator;
import org.cleartk.snowball.DefaultSnowballStemmer;
import org.cleartk.timeml.event.*;
import org.cleartk.timeml.time.TimeTypeAnnotator;
import org.cleartk.timeml.tlink.TemporalLinkEventToDocumentCreationTimeAnnotator;
import org.cleartk.timeml.tlink.TemporalLinkEventToSameSentenceTimeAnnotator;
import org.cleartk.timeml.tlink.TemporalLinkEventToSubordinatedEventAnnotator;
import org.cleartk.timeml.type.DocumentCreationTime;
import org.cleartk.token.tokenizer.TokenAnnotator;
import org.cleartk.util.cr.FilesCollectionReader;
...
String documentText = "First make sure that you are using eggs that are several days old...";
JCas sourceCas = createJCas();
sourceCas.setDocumentText(documentText);
ViewUriUtil.setURI(sourceCas, new URI(""));
SimplePipeline.runPipeline(
sourceCas,
org.cleartk.opennlp.tools.SentenceAnnotator.getDescription(),
TokenAnnotator.getDescription(),
PosTaggerAnnotator.getDescription(),
DefaultSnowballStemmer.getDescription("English"),
org.cleartk.opennlp.tools.ParserAnnotator.getDescription(),
org.cleartk.timeml.time.TimeAnnotator.FACTORY.getAnnotatorDescription(),
TimeTypeAnnotator.FACTORY.getAnnotatorDescription(),
EventAnnotator.FACTORY.getAnnotatorDescription(),
EventTenseAnnotator.FACTORY.getAnnotatorDescription(),
EventAspectAnnotator.FACTORY.getAnnotatorDescription(),
EventClassAnnotator.FACTORY.getAnnotatorDescription(),
EventPolarityAnnotator.FACTORY.getAnnotatorDescription(),
EventModalityAnnotator.FACTORY.getAnnotatorDescription(),
AnalysisEngineFactory.createEngineDescription(AddEmptyDCT.class),
TemporalLinkEventToDocumentCreationTimeAnnotator.FACTORY.getAnnotatorDescription(),
TemporalLinkEventToSameSentenceTimeAnnotator.FACTORY.getAnnotatorDescription(),
TemporalLinkEventToSubordinatedEventAnnotator.FACTORY.getAnnotatorDescription(),
TempEval2007Writer.getDescription("file:///tmp/out.tml"));
Каков был бы рекомендуемый способ, чтобы конвейер брал строку в качестве входных данных и генерировал другую строку в качестве результата выполнения?
2 ответа
Запустите ваши двигатели с SimplePipeline
как вы, а затем получить аннотации, которые вас интересуют, из вашего sourceCas
как это:
Collection<MyAnnotation> myAnnotation = JCasUtil.select(sourceCas, MyAnnotation.class);
String myproperty = myAnnotation.getMyproperty();
Мой любимый подход к этому состоял в том, чтобы не использовать конвейер, а вручную создать механизм анализа с помощью org.apache.uima.fit.factory.AggregateBuilder
в соответствии с рекомендациями Ли Беккера на этот пост.
AggregateBuilder builder = new AggregateBuilder();
builder.add(org.cleartk.opennlp.tools.SentenceAnnotator.getDescription());
builder.add(TokenAnnotator.getDescription());
builder.add(DefaultSnowballStemmer.getDescription("English"));
builder.add(org.cleartk.opennlp.tools.ParserAnnotator.getDescription());
builder.add(org.cleartk.timeml.time.TimeAnnotator.FACTORY.getAnnotatorDescription());
builder.add(TimeTypeAnnotator.FACTORY.getAnnotatorDescription());
builder.add(EventAnnotator.FACTORY.getAnnotatorDescription());
builder.add(EventTenseAnnotator.FACTORY.getAnnotatorDescription());
builder.add(EventAspectAnnotator.FACTORY.getAnnotatorDescription());
builder.add(EventClassAnnotator.FACTORY.getAnnotatorDescription());
builder.add(EventPolarityAnnotator.FACTORY.getAnnotatorDescription());
builder.add(EventModalityAnnotator.FACTORY.getAnnotatorDescription());
builder.add(AnalysisEngineFactory.createEngineDescription(AddEmptyDCT.class));
builder.add(TemporalLinkEventToDocumentCreationTimeAnnotator.FACTORY.getAnnotatorDescription());
builder.add(TemporalLinkEventToSameSentenceTimeAnnotator.FACTORY.getAnnotatorDescription());
builder.add(TemporalLinkEventToSubordinatedEventAnnotator.FACTORY.getAnnotatorDescription());
AnalysisEngine aggregateEngine = builder.createAggregate();
JCas sourceCas = createJCas();
sourceCas.setDocumentText(documentText);
ViewUriUtil.setURI(sourceCas, new URI(""));
aggregateEngine.process(sourceCas);
String timeMlXml = TempEval2007Writer.toTimeML(sourceCas);