Thanks Kean. I was able to get the desired  output using selectCovered method.

From: Kean Kaufmann [mailto:k...@recordsone.com]
Sent: Friday, March 2, 2018 12:30 AM
To: Mathew, Abilash (Cognizant) <abilash.mat...@cognizant.com>
Cc: dev@ctakes.apache.org
Subject: Re: Lab Value - Range finder

Abilash,
The org.apache.uima.fit.util.JCasUtil methods selectCovered and indexCovered 
may be what you're looking for here.

If you run cTAKES on the following text:

"Sodium Latest Range: 135-145 mmol/L 138"

note that "135-145" is covered by a RangeAnnotation;
"135" and "145" are covered by NumTokens;
and "-" is covered by a PunctuationToken.

Similarly, "21.1 L" is covered by a MeasurementAnnotation, in which "21.1" is 
covered by both a FractionAnnotation and a NumToken, and  "L" by a WordToken.

Have you used the CAS Visual Debugger? 
https://uima.apache.org/d/uimaj-current/tools.html#ugr.tools.cvd
It will show you all the annotations covering a given stretch of text -- very 
helpful.


On Wed, Feb 28, 2018 at 6:51 AM, 
<abilash.mat...@cognizant.com<mailto:abilash.mat...@cognizant.com>> wrote:
Kean,
I was able to get the annotation tagged as Range and measurement annotations as 
shown below. As a next step, I would like to get the individual token like 42 
,52 and 21 etc. I know I can try a pattern or index based search to extract the 
information, but I am trying to see if any options currently available in 
CTAKES to do the same.
28 Feb 2018 15:04:04  INFO LabValueFinder - Set to value: LabMention(349-352): 
HCT
28 Feb 2018 15:04:04  INFO LabValueFinder - Set to value: 
RangeAnnotation(365-370): 42-52
28 Feb 2018 15:04:04  INFO LabValueFinder - Set to value: 
MeasurementAnnotation(354-360): 21.1 L

Thanks,
Abilash Mathew
From: Kean Kaufmann [mailto:k...@recordsone.com<mailto:k...@recordsone.com>]
Sent: Monday, February 12, 2018 8:44 PM
To: Mathew, Abilash (Cognizant) 
<abilash.mat...@cognizant.com<mailto:abilash.mat...@cognizant.com>>
Subject: Re: Lab Value - Range finder

 > I could see setReferenceRangeNarrative method in LabMention class. Is that 
 > the one are you referring?

Yes -- that's the setter method generated from the type system: 
https://svn.apache.org/repos/asf/ctakes/trunk/ctakes-type-system/src/main/resources/org/apache/ctakes/typesystem/types/TypeSystem.xml
Feature: referenceRangeNarrative
Value type: org.apache.ctakes.typesystem.type.textsem.LabReferenceRangeModifier

> Also, what is your suggestion to create new class similar to LabValueFinder?

Well, if the LabValueFinder suits your needs, then I'd suggest using its 
annotations as starting points.
Run the LabValueFinder and inspect the LabMentions it creates.
If getLabValue() gives you a RangeAnnotation, it's probably the reference range,
which the LabValueFinder fell back to because it couldn't find a value.
Otherwise, search for RangeAnnotations nearby.
You may find various 
org.apache.uima.fit.util.JCasUtil<https://uima.apache.org/d/uimafit-current/api/org/apache/uima/fit/util/JCasUtil.html>
 methods useful, e.g. selectBetween, selectPreceding, selectFollowing.
In my data, the range could often be found between the LabMention and the 
LabValue; your data may vary.
For a general-purpose annotator, you'd want to make that configurable.

Also, make you're getting the RangeAnnotations you expect.
Last year, I found it expedient to write a quick-fix regular-expression 
annotator to pick up decimal ranges like the ones below.
It would be more civic-minded to change the annotator that generates 
RangeAnnotations
(the ContextDependentTokenizerAnnotator? Not sure offhand).

                                            "Potassium Latest Range: 3.5-5.3 
mmol/L 3.8\n" + // range not annotated
                                            "TSH, High Sensitivity Latest 
Range: 0.450-5.100 uIU/mL 1.939\n" + // range not annotated


On Mon, Feb 12, 2018 at 6:24 AM, 
<abilash.mat...@cognizant.com<mailto:abilash.mat...@cognizant.com>> wrote:
Thanks Kean for the suggestions. I could see setReferenceRangeNarrative method 
in LabMention class. Is that the one are you referring?  Also, what is your 
suggestion to create new class similar to LabValueFinder?

Regards,
Abilash Mathew
-----Original Message-----
From: Kean Kaufmann [mailto:k...@recordsone.com<mailto:k...@recordsone.com>]
Sent: Friday, February 9, 2018 10:35 PM
To: dev@ctakes.apache.org<mailto:dev@ctakes.apache.org>
Subject: Re: Lab Value - Range finder

Hi Abilash,

By design, the Lab Value annotator avoids ranges if possible:

https://svn.apache.org/repos/asf/ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/ae/LabValueFinder.java

            // prefer non-range values, if any
>             value = candidateList.stream()
>                   .filter( a -> !(a instanceof RangeAnnotation) )
>                   .findFirst()
>                   .orElse( candidateList.get( 0 ) );


The design is intended to cope with the widest possible variety of formats, and 
avoid confusion.

If you know where the reference ranges are going to be in your data, I'd 
suggest annotating those separately, using the referenceRangeNarrative feature 
with LabReferenceRange values rather than conflating them with labValue / 
LabMention.

https://svn.apache.org/repos/asf/ctakes/trunk/ctakes-type-system/src/main/resources/org/apache/ctakes/typesystem/types/TypeSystem.xml

Caveat: When I wrote this last year, the range annotator didn't seem to be 
picking up on decimal points.  So, below, the first two got RangeAnnotations, 
and the second two didn't.

"Sodium Latest Range: 135-145 mmol/L 138\n" +
> "Anion Gap Latest Range: 13-16 mmol/L\n" + "Potassium Latest Range:
> 3.5-5.3 mmol/L 3.8\n" + // range not annotated "TSH, High Sensitivity
> Latest Range: 0.450-5.100 uIU/mL 1.939\n" + // range not annotated




On Wed, Feb 7, 2018 at 6:46 AM, 
<abilash.mat...@cognizant.com<mailto:abilash.mat...@cognizant.com>> wrote:

> Hi All,
>
> I am trying to extend the current Lab Value finder annotator to
> include the Range annotation also.
>
> "Blood Urea Nitrogen (BUN) 10 mg/dL 8-23"
>
> Using current module , I am able to pull lab value as " BUN 10 mg"
> from above text  and  trying to tag "8-23"  as reference range.
>
>       final Map<Annotation, List<IdentifiedAnnotation>> subsumeMap =
> createCoveringMap( jCas, valueClasses,
>             Arrays.asList( FractionAnnotation.class,
> RangeAnnotation.class, MeasurementAnnotation.class ) );
>
> The range annotator is already added in the Labvalue finder class, but
> only MeasurementAnnotation is getting tagged in the output. Can anyone
> help here?
>
>
> Thanks,
> Abilash Mathew
> This e-mail and any files transmitted with it are for the sole use of
> the intended recipient(s) and may contain confidential and privileged
> information. If you are not the intended recipient(s), please reply to
> the sender and destroy all copies of the original message. Any
> unauthorized review, use, disclosure, dissemination, forwarding,
> printing or copying of this email, and/or any action taken in reliance
> on the contents of this e-mail is strictly prohibited and may be
> unlawful. Where permitted by applicable law, this e-mail and other
> e-mail communications sent to and from Cognizant e-mail addresses may be 
> monitored.
>
This e-mail and any files transmitted with it are for the sole use of the 
intended recipient(s) and may contain confidential and privileged information. 
If you are not the intended recipient(s), please reply to the sender and 
destroy all copies of the original message. Any unauthorized review, use, 
disclosure, dissemination, forwarding, printing or copying of this email, 
and/or any action taken in reliance on the contents of this e-mail is strictly 
prohibited and may be unlawful. Where permitted by applicable law, this e-mail 
and other e-mail communications sent to and from Cognizant e-mail addresses may 
be monitored.

This e-mail and any files transmitted with it are for the sole use of the 
intended recipient(s) and may contain confidential and privileged information. 
If you are not the intended recipient(s), please reply to the sender and 
destroy all copies of the original message. Any unauthorized review, use, 
disclosure, dissemination, forwarding, printing or copying of this email, 
and/or any action taken in reliance on the contents of this e-mail is strictly 
prohibited and may be unlawful. Where permitted by applicable law, this e-mail 
and other e-mail communications sent to and from Cognizant e-mail addresses may 
be monitored.

This e-mail and any files transmitted with it are for the sole use of the 
intended recipient(s) and may contain confidential and privileged information. 
If you are not the intended recipient(s), please reply to the sender and 
destroy all copies of the original message. Any unauthorized review, use, 
disclosure, dissemination, forwarding, printing or copying of this email, 
and/or any action taken in reliance on the contents of this e-mail is strictly 
prohibited and may be unlawful. Where permitted by applicable law, this e-mail 
and other e-mail communications sent to and from Cognizant e-mail addresses may 
be monitored.

Reply via email to