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);
}