uimaFIT: создание списка экземпляров JCas

Для оценки моего uimaFIT-конвейера я хочу создать список экземпляров JCas, которые были аннотированы конвейером и записаны в xmi-файлы. В своей оценке я читал xmi-файлы и хочу получить доступ к JCas для каждого xmi-файла и сохранить его в списке, чтобы обрабатывать их дальше.

JCasIterable goldIterable = SimplePipeline.iteratePipeline(xmiReaderGold);
JCasIterator goldIterator = goldIterable.iterator();

ArrayList<JCas> goldJCasList = new ArrayList<JCas>();

while (goldIterator.hasNext()) {
    JCas goldJCas = goldIterator.next().getCas().getJCas();
    goldJCasList.add(goldJCas);
}

Проблема в том, что на каждой итерации цикла while JCas в списке, который был добавлен на итерации до этого, перезаписывается текущим JCas. Как мне этого избежать и как правильно составить список? Я попытался создать новый JCas-объект с помощьюJCas goldJCas = JCasFactory.createJCas() перед звонком next()на итераторе и добавив JCas в список. Но все равно получаю тот же результат.

1 ответ

Решение

Экземпляр JCas, возвращаемый iteratePipelineвсегда один и тот же - он используется повторно. Это из соображений производительности.

Если вы хотите получить список JCas-ов, вы можете сделать это примерно так:

CollectionReader reader = CollectionReaderFactory.createReader(MyReader.class, <parameters>);
List<JCas> documents = new ArrayList<>();
while (reader.hasNext()) {
   JCas document = JCasFactory.createJCas();
   reader.getNext(document.getCas());
   documents.add(document);
}
Другие вопросы по тегам