2011-09-22 82 views
2

我有一個文檔,其中包含諸如評估,HPI,ROS,Vitals等部分。 我想在每個部分中提取註釋。我正在使用GATE來達到這個目的。我已經創建了一個JAPE文件,它將在評估部分提取註釋。 Follwing是一種語法,使用JAPE語法難點

Input: Token 
Options: control=appelt debug=true 

Rule: Assess 
({Token.string =~"(?i)diagnose[d]?"}{Token.string=="with"} | {Token.string=~"(?i)suffering"}{Token.string=~"(?i)from"} | {Token.string=~"(?i)suffering"}{Token.string=~"(?i)with"}) 

(
({Token})* 
):assessments 

({Token.string =~"(?i)HPI"} | {Token.string =~"(?i)ROS"} | {Token.string =~"(?i)EXAM"} | {Token.string =~"(?i)VITAL[S]"} | {Token.string =~"(?i)TREATMENT[s]"} |{Token.string=~"(?i)use[d]?"}{Token.string=~"(?i)orderset[s]?"} | {Token.string=~"$"}) 


--> 
:assessments.Assessments = {} 

現在,當評估部分在文檔的末尾時,我可以正確檢索筆記。但是如果它介於兩部分之間,那麼這將從評估部分返回整個文檔直到文件結束。

我嘗試過以不同方式使用{Token.string =〜「$」},但無法提取只有評估部分反映其在DOC中的位置。

請解釋如何使用JAPE語法來實現這一點。

感謝RISHABH

回答

1

這是正確的,因爲Appelt模式總是傾向於儘可能長的整體匹配。由於任何令牌都可以匹配string =~ "$"assessments標籤將抓取文檔中除最後一個令牌外的所有標籤。

我會採取兩種回合方法,使用初始地名或戲言相註釋「部分的標題」,然後只在其輸入線,這些標題註釋另一個階段

Imports: { import static gate.Utils.*; } 
Phase: AnnotateBetweenHeadings 
Input: Heading 
Options: control = appelt 

Rule: TwoHeadings 
({Heading.type ="assessments"}):h1 
(({Heading})?):h2 
--> 
{ 
    Long endOffset = end(doc); 
    AnnotationSet h2Annots = bindings.get("h2"); 
    if(h2Annots != null && !h2Annots.isEmpty()) { 
    endOffset = start(h2Annots); 
    } 
    outputAS.add(end(bindings.get("h1")), endOffset, "Assessments", featureMap()); 
} 

這將標註一切在評估標題的結尾和下一個標題的開始之間,或者如果沒有以下標題,則結束文檔。

0

泰森漢密爾頓提供this alternative到註釋EOD因爲$的戲言不工作:

Rule: DOCMARKERS 
// we need to match something even though we don't use it directly 
(({Token})):doc 
--> 
:doc{ 
    FeatureMap features = Factory.newFeatureMap(); 
    features.put("rule", ruleName()); 

    try { 
     outputAS.add(0L, 0L, "SOD", features); 
     outputAS.add(docAnnots.getDocument().getContent().size(), docAnnots.getDocument().getContent().size(), "EOD", features); 
    } catch (InvalidOffsetException ioe) { 
     throw new GateRuntimeException(ioe); 
    } 
} 

我發現EOD在後來的規則給它一些長度只承認。所以我有這樣的:

Rule: DOCMARKERS 
Priority: 2 
(
    ({Sentence}) // we need to matching something even though we don't use it directly 
):doc 
--> 
:doc{ 
    FeatureMap features = Factory.newFeatureMap(); 
    features.put("rule", "DOCMARKERS"); 

    try { 
     outputAS.add(0L, 0L, "SOD", features); 
     long docsize = docAnnots.getDocument().getContent().size(); 
     // The only way I could get EOD to be recognized in later rules was to 
     // give it some length, hence the -2 and -1 
     outputAS.add(docsize-2, docsize-1, "EOD", features); 
     System.err.println("Debug: added EOD"); 
    } catch (InvalidOffsetException ioe) { 
     throw new GateRuntimeException(ioe); 
    } 
} 

然後你應該能夠在您的統治結束更改爲

...| {Token.string=~"$"})