You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ctakes.apache.org by Bruce Tietjen <br...@perfectsearchcorp.com> on 2013/10/22 21:26:20 UTC

Infinite recursion in DrugMentionAnnotator.java

I've been debugging the processing of a document using the pipeline defined
by DrugAggregatePlaintextUMLSProcessor.xml that results in a
StackOverflowError.

I have traced it down to what I think is the cause and have a code
modification that appears to solve the problem but there is probably a more
appropriate solution.

Is there someone who is more experienced with the code that can evaluate
the bug?


Bug Detail:

Test document text (minimal text necessary to trigger the bug):
                 aspirin decreased from 2:00 PM.


Call path:
   generageDrugMentionsAndAnnotations
      statusChangePhraseGenerator

(infinite recursion starts here)
         generateAdditionalNER
            generateDrugMentionsAndAnnotations
               statusChangePhraseGenerator
                  generateAdditionalNER
                     ...


I believe the problem occurs in generateAdditionalNER() at ~line 2213 with
getAdjustedWindowSpan() returning -1.
This causes the call to generateDrugMentionsAndAnnotations() to process the
whole document again rather than the remaining portion of the text.

Source code snippet:

        } else if (drugChangeStatus.getChangeStatus().compareTo(
                DrugChangeStatusToken.DECREASEFROM) == 0)
        {
            if (noPriorMention) {//Look for lowest value on right side
                beginChunk = getAdjustedWindowSpan(jcas,  beginChunk,
endSpan, true)[0];
            }
            String [] changeStatusArray = new String []
{DrugChangeStatusToken.DECREASE, new Integer
(drugChangeStatus.getBegin()).toString(), new
Integer(drugChangeStatus.getEnd()).toString()};
            generateDrugMentionsAndAnnotations(jcas,
                    buildNewNER, beginChunk, endSpan,
                    tokenDrugNER, changeStatusArray, count, globalNER);


A simple fix might be to add the two lines:

            if (noPriorMention) {//Look for lowest value on right side
                beginChunk = getAdjustedWindowSpan(jcas,  beginChunk,
endSpan, true)[0];
-->                if (beginChunk == -1)
-->                   beginChunk = drugChangeStatus.getEnd();
            }

Changing the logic inside getAdjustedWindowSpan() might be a more correct
and complete fix, but requires a much more detailed knowledge of the code.


Your evaluation of the correctness of this code modification would be
appreciated.

Bruce Tietjen
Perfect Search Corp.

RE: Infinite recursion in DrugMentionAnnotator.java

Posted by "Chen, Pei" <Pe...@childrens.harvard.edu>.
Hi Bruce,
Would you mind opening up a Jira item with the details for this; sounds like a bug.
Also, there seems to be a related one in the drug-ner that going into a loop and also causes a StackOverflow- you may also want to check out:
https://issues.apache.org/jira/browse/CTAKES-246

--Pei


> -----Original Message-----
> From: Bruce Tietjen [mailto:bruce.tietjen@perfectsearchcorp.com]
> Sent: Tuesday, October 22, 2013 3:29 PM
> To: dev@ctakes.apache.org
> Subject: Infinite recursion in DrugMentionAnnotator.java
> 
> I've been debugging the processing of a document using the pipeline defined
> by DrugAggregatePlaintextUMLSProcessor.xml that results in a
> StackOverflowError.
> 
> I have traced it down to what I think is the cause and have a code
> modification that appears to solve the problem but there is probably a more
> appropriate solution.
> 
> Is there someone who is more experienced with the code that can evaluate
> the bug?
> 
> 
> Bug Detail:
> 
> Test document text (minimal text necessary to trigger the bug):
>                  aspirin decreased from 2:00 PM.
> 
> 
> Call path:
>    generageDrugMentionsAndAnnotations
>       statusChangePhraseGenerator
> 
> (infinite recursion starts here)
>          generateAdditionalNER
>             generateDrugMentionsAndAnnotations
>                statusChangePhraseGenerator
>                   generateAdditionalNER
>                      ...
> 
> 
> I believe the problem occurs in generateAdditionalNER() at ~line 2213 with
> getAdjustedWindowSpan() returning -1.
> This causes the call to generateDrugMentionsAndAnnotations() to process
> the whole document again rather than the remaining portion of the text.
> 
> Source code snippet:
> 
>         } else if (drugChangeStatus.getChangeStatus().compareTo(
>                 DrugChangeStatusToken.DECREASEFROM) == 0)
>         {
>             if (noPriorMention) {//Look for lowest value on right side
>                 beginChunk = getAdjustedWindowSpan(jcas,  beginChunk, endSpan,
> true)[0];
>             }
>             String [] changeStatusArray = new String []
> {DrugChangeStatusToken.DECREASE, new Integer
> (drugChangeStatus.getBegin()).toString(), new
> Integer(drugChangeStatus.getEnd()).toString()};
>             generateDrugMentionsAndAnnotations(jcas,
>                     buildNewNER, beginChunk, endSpan,
>                     tokenDrugNER, changeStatusArray, count, globalNER);
> 
> 
> A simple fix might be to add the two lines:
> 
>             if (noPriorMention) {//Look for lowest value on right side
>                 beginChunk = getAdjustedWindowSpan(jcas,  beginChunk, endSpan,
> true)[0];
> -->                if (beginChunk == -1)
> -->                   beginChunk = drugChangeStatus.getEnd();
>             }
> 
> Changing the logic inside getAdjustedWindowSpan() might be a more correct
> and complete fix, but requires a much more detailed knowledge of the code.
> 
> 
> Your evaluation of the correctness of this code modification would be
> appreciated.
> 
> Bruce Tietjen
> Perfect Search Corp.