Как добавить потоковые данные в Reader для коллекций? - PullRequest
0 голосов
/ 09 февраля 2019

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

Я знаю, как добавить статические данные из Reader в конвейер, но как я могу добиться этого с помощью потоковых данных?Есть ли способ добавить внешние данные в объект jcas?

Функция потоковой передачи:

this.twitterStream.addListener(new StatusListener() {
    public void onStatus(Status status) {
        //get data from here to collectionReader
    }

}

Считыватель сбора:

@Override
public void initialize(UimaContext context) throws ResourceInitializationException{
    super.initialize(context);

}

@Override
public Progress[] getProgress() {
    //return progress of the stream. necessary?
}

@Override
public boolean hasNext() throws IOException, CollectionException {
    //return should always be false since the stream has no end
       return false;
}

@Override
public void getNext(JCas jcas) throws IOException, CollectionException {
    //get next element of the stream
}

Данные должны передаваться изAPI-функция для CollectionReader, поэтому я могу аннотировать данные в аннотаторе.

1 Ответ

0 голосов
/ 10 февраля 2019

По сути, вы пропускаете программу чтения и вместо этого сами создаете CAS и передаете их в конвейер.

Это пример сценария UIMA / uimaFIT Groovy, который не использует программу чтения, а вместо этого передает данные напрямую.в конвейер.

@Grab(group='de.tudarmstadt.ukp.dkpro.core', 
      module='de.tudarmstadt.ukp.dkpro.core.opennlp-asl', 
      version='1.5.0')

import static org.apache.uima.fit.pipeline.SimplePipeline.*;
import static org.apache.uima.fit.util.JCasUtil.*;
import static org.apache.uima.fit.factory.AnalysisEngineFactory.*;
import org.apache.uima.fit.factory.JCasFactory;

import de.tudarmstadt.ukp.dkpro.core.opennlp.*;
import de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.*;
import de.tudarmstadt.ukp.dkpro.core.api.syntax.type.*;

def jcas = JCasFactory.createJCas();
jcas.documentText = "This is a test";
jcas.documentLanguage = "en";

runPipeline(jcas,
  createEngineDescription(OpenNlpSegmenter),
  createEngineDescription(OpenNlpPosTagger),
  createEngineDescription(OpenNlpParser,
    OpenNlpParser.PARAM_WRITE_PENN_TREE, true));

select(jcas, Token).each { println "${it.coveredText} ${it.pos.posValue}" }

select(jcas, PennTree).each { println it.pennTree }

Примечание. Этот сценарий вообще не оптимизирован для производительности.В производственном сценарии вы бы использовали пул CAS (поскольку создание CAS довольно дорого и обычно они используются повторно), и вы бы создавали конвейер, используя createEngine(...), прежде чем передать его в runPipeline(...) или вызвать * 1008.* на это, потому что в противном случае вы получите много накладных расходов на создание всех компонентов конвейера для каждого документа.

Источник: https://dkpro.github.io/dkpro-core/groovy/recipes/opennlp-postag-no-reader/

...