Hi Tol,

> Essentially, I want to know how to set up the cTAKES objects correctly into a 
> pipeline in a Java programs, so that medical texts are annotated, like the 
> GUI is doing. I would really appreciate any hints or how to accomplish this.

Looking at your embedded code I think that you've got the general idea of how 
to do everything.  Perhaps you are wondering how to create custom pipelines by 
programmatically adding chosen processors?

Tim Miller made a great addition (imo) to the cTakes code with the 
org.apache.ctakes.clinicalpipeline. ClinicalPipelineFactory class.  Perhaps you 
can take a look at that and see if it helps?

Sean

-----Original Message-----
From: Tol O. [mailto:tol...@gmail.com] 
Sent: Tuesday, February 03, 2015 7:35 PM
To: dev@ctakes.apache.org
Subject: Re: Question about the pipeline

>

Sean,

Thank you for the detailed reply.

As you mentioned, I had to revert the capital letters from your Outlook, and 
also, if somebody else wants to use the code and cannot get it to run: the 
getFilesInDir method needs to return the populated Collection<File> fileList, 
the variable final File[] fileList and its usage should be renamed to something 
else (as the variable name already exists) and the main method needs to throw 
an IOException.

I think these were all the changes I made so that the txt files from a folder 
are added to the collection, many thanks again.

What I am looking to do is also what the description in 
"ExampleAggregatePipeline" says, "running a pipeline programatically w/o uima 
xml descriptor xml files". This is accomplished by what I understand the 
uimaFIT classes, so that AEs can be defined in Java, added to a Pipeline and 
directly run.

The uimaFIT page gives a nice Java snippet that uses uimaFIT in a similar way 
as the cTAKES example, I pasted the few Java lines below at [1]. 
https://urldefense.proofpoint.com/v2/url?u=http-3A__uima.apache.org_d_uimafit-2Dcurrent_tools.uimafit.book.html-23ugr.tools.uimafit.introduction&d=BQICAg&c=qS4goWBT7poplM69zy_3xhKwEW14JZMSdioCoppxeFU&r=fs67GvlGZstTpyIisCYNYmQCP6r0bcpKGd4f7d4gTao&m=uhPMXYD_U8cpnenfJCFigx00DCavTuwRGY-irX80FfU&s=4s5P35eByjHcLHM6WEp5jmjquPc-wynEgjBWnY6I6Pg&e=
 

I would like to use cTAKES in my own Java programs such that, just like the 
ExampleAggregatePipeline, uimaFIT can be used create and run a cTAKES pipeline 
to annotate medical texts. Then, I could also output the result in CAS files, 
just like the CVD GUI is doing. This would allow to directly be able to add or 
modify my own AnalysisEngines.

Essentially, I want to know how to set up the cTAKES objects correctly into a 
pipeline in a Java programs, so that medical texts are annotated, like the GUI 
is doing. I would really appreciate any hints or how to accomplish this. 

Following your code example to read the files the outlined idea is:

for ( File file : files ) {
      Final String note = getTextInFile( file );
      JCas jCas = JCasFactory.createJCas();
      jCas.setDocumentText(note);

      // 1. create the AnalysisEngines for tokenizer, tagger and other cTAKES 
components etc. to annotate medical texts
      // 2. runPipeline(jCas, ...);
}

[1]
The code snippet from uimaFIT:

JCas jCas = JCasFactory.createJCas();

jCas.setDocumentText("some text");

AnalysisEngine tokenizer = createEngine(MyTokenizer.class);

AnalysisEngine tagger = createEngine(MyTagger.class);

runPipeline(jCas, tokenizer, tagger);

for(Token token : iterate(jCas, Token.class)){
    System.out.println(token.getTag());
}

Tol O.


Finan, Sean <Sean.Finan@...> writes:

> 
> Hi Tol (and Maite),
> 
> I'm not entirely certain that I understand the question, but here is 
> an
attempt to help.  If I'm
> oversimplifying then I apologize.
> 
> I think that ExampleAggregatePipeline is intended to represent a very
simple single-note pipeline and
> that custom code could be produced by using it as an example.
> 
> If you want to process texts in a directory, you can find with a web
search plenty of ways to list files in a
> directory and read text from files. 
org.apache.ctakes.core.cr.FilesInDirectoryCollectionReader
> might be what you used in the CPE, and you can certainly peruse the 
> code
and take what you need.  Or, if you
> decide to write a simple diy,  here is one possibility:
> 
> Static public Collection<File> getFilesInDir( final File directory ) {
>    final Collection<File> fileList = new ArrayList<>();
>    final File[] fileList = directory.listFiles();
>    if ( fileList == null ) {
>       System.err.println( "please check the directory " +
directory.getAbsolutePath() );
>       System.exit( 1 );
>    }
>     for ( final File file : directory.listFiles() ) {
>         if ( file.canRead() ) {
>             fileList.add( file );
>         }
>     }
> }
> 
> Static public String getTextInFile( final File file ) throws 
> IOException {
  -- or handle ioE herein
>    final Path nioPath = file.toPath();
>    return new String( Files.readAllBytes( nioPath ) ); }
> 
> Static public void main( String ... args ) {
>    If ( args[0].isEmpty() ) {
>       System.out.println( "Enter a directory path" );
>       System.exit( 0 );
>    }
>    Final Collection<File> files = getFilesInDir( new File( args[0] );
>    For ( File file : files ) {
>       Final String note = getTextInFile( file );
>       ---  Insert here code a' la ExampleAggregatePipeline  ---
>       ---  swap out the writer in ExampleAggregatePipeline with 
> CasIOUtil
method (below)  ---
>    }
> }
> 
> I must admit that I have never directly used it, but there is an xmi 
> file
writing method in
> org.apache.uima.fit.util.CasIOUtil named writeXmi( JCas jCas, File file ).
 You could give this a try
> and see if it produces the type of output that you want.  The same 
> utility
class has a writeXCas(..) method.
> 
> If the above has absolutely nothing to do with your needs then please 
> send
me a bulleted list of items,
> example workflow, etc. and I'll see if I can be of service.
> 
> Oh, and I wrote the above code freehand, so MS Outlook is adding 
> capital
letters, etc.  If you cut and paste
> you'll need to change that - plus I haven't run/compiled, so there 
> might
be a typo or missed exception or
> something.  Or it may not work (in which case I'll throw in a little 
> more
effort).
> 
> Sean
> 
> -----Original Message-----
> From: Tol O. [mailto:toltox@...]
> Sent: Monday, February 02, 2015 6:56 PM
> To: dev@...
> Subject: Re: Question about the pipeline
> 
> Maite Meseure Hugues <meseure.maite <at> ...> writes:
> 
> > 
> > Hello all,
> > 
> > Thank you for your preceding answers.
> > I have a few questions regarding the pipeline example to run cTakes 
> > programmatically.
> > I am running ExampleAggregatePipeline.java with 
> > ExampleHelloWorldAnnotator but I would like to know how I can change 
> > it to run my data, as the CPE where we can choose the directory of our data.
> > My second question is about the xml output generated with the CPE, 
> > can I get the same xml output in using the example pipeline? and How?
> > Thanks for your time.
> 
> I would like to ask the same question. After successfully setting up
CTAKES following the Developers Guide
> I would also like to use a modified ExampleAggregatePipeline to output 
> a
CAS file identical to the output
> obtained by the CPE or the CVD when following the Users Guide.
> 
> This would be a great help for developers as a starting class to be 
> able
to programmatically obtain an
> annotated file based on a plaintext or XML input, same as through the 
> two
GUIs.
> 
> Right now I am reading through the Component Use Guide to replicate 
> the
CPE or the CVD tutorial with the test
> input, but it is a bit overwhelming.
> 
> Any pointers or suggestions would be really appreciated.
> 
> Tol O.
> 
> 




Reply via email to