2

我有一个文档,其中包含诸如评估、HPI、ROS、Vitals 等部分。我想在每个部分中提取注释。我为此目的使用 GATE。我制作了一个 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=~"$"} 但无法仅提取评估部分,而不管其在文档中的位置。

请解释如何使用 JAPE 语法来实现这一点。

4

2 回答 2

1

这是正确的,因为 Appelt 模式总是更喜欢尽可能长的整体匹配。由于任何标记都可以匹配string =~ "$",因此assessments标签将抓取文档中除最终标记之外的所有标记。

我将采用两遍方法,使用初始地名词典或 JAPE 阶段来注释“部分标题”,然后在另一个阶段在其输入行中仅使用这些标题注释

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());
}

这将注释评估标题的结尾和下一个标题的开头之间的所有内容,或者如果没有下一个标题,则注释文档的结尾。

于 2013-03-26T23:47:33.310 回答
0

Tyson Hamilton 提供了这种注释 EOD 的替代方法,因为 $ 在 JAPE 中不起作用:

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=~"$"})
于 2013-03-26T21:52:39.950 回答