2

アセスメント、HPI、ROS、バイタルなどのセクションを含むドキュメントがあります。各セクションのメモを抽出したいと思います。私はこの目的のために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 = {}

これで、評価セクションがドキュメントの最後にあるときに、メモを適切に取得できます。ただし、2つのセクションの間にある場合は、評価セクションからファイルの終わりまでドキュメント全体が返されます。

{Token.string =〜 "$"}をさまざまな方法で使用しようとしましたが、ドキュメント内の場所に関係なく、評価セクションのみを抽出できませんでした。

JAPE文法を使用してこれを達成する方法を説明してください。

4

2 に答える 2

1

Appelt モードは常に可能な限り長い全体的な一致を優先するため、これは正しいことです。どのトークンも一致string =~ "$"する可能性があるため、assessmentsラベルはドキュメント内の最後のトークンを除くすべてを取得します。

最初の地名辞典または JAPE フェーズを使用して「セクション見出し」に注釈を付け、次に入力行にこれらの見出し注釈のみを含む別のフェーズを使用して、2 パス アプローチを採用します。

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 は、JAPE では $ が機能しないため、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=~"$"})
于 2013-03-26T21:52:39.950 に答える