3

GATE の一部である JAPE (Java Annotation Pattern Engine) は初めてです。

LHS では、いくつかのタグ (タグ a、b、および c など) をテキストにするルールを既に作成しています。

私のテキストはいくつかの部分で構成されており、生成されたタグに基づいて各部分を分類したいと考えています。

例として:

<record id=001>
lorem <a>ipsum</a> dolor sit amet
</record>
<record id=002>
consectetur <b>adipiscing</b> elit, sed do eiusmod <a>tempor</a> incididunt ut labore et dolore magna aliqua
</record>
<record id=003>
Ut enim ad minim veniam, quis <a>nostrud</a> exercitation <c>ullamco</c> laboris nisi ut aliquip ex ea commodo consequat.
</record>

ご覧のとおり、各レコードには で生成された複数のタグを含めることができますLHS

その中のタグに基づいて各レコードを分類したいと思います。

aたとえば、レコードに tag が含まれている場合abそれを A に分類します。ab

RHS でこれを操作する必要があることに気付きましたが、これを記述する方法がわかりません。

手がかりか何かを教えてください。

ありがとう。

よろしく。

4

1 に答える 1

3

JAPE 文法を使用して if-else ステートメントを作成するために、必ずしも RHS で Java を使用する必要はありません。

ルールを記述する場合、処理を複数の段階に分割すると便利な場合がよくあります。各段階で結果が生成され、次の段階に渡すことができます。したがって、今説明した内容に基づいて、データ処理は次の 3 つのフェーズに分けることができます。

  1. ドキュメント内のレコード、つまりRecord注釈を返すRecordFinder 。
  2. ドキュメント内のタグをa返すTagFinderb
  3. Intersectiona : タグとbレコード内を検索します。

ファイルMain.jape

MultiPhase: Main
Phases: 
RecordFinder
TagFinder
Intersection

ファイルRecordFinder.jape

このフェーズでは、ドキュメント内のレコードに注釈を付けることができます。この JAPE ファイルの唯一のルールは、トークン(つまり、トークナイザーによって返される注釈) を入力として読み取り、ドキュメント内のTokenレコード (つまり、タグ) を見つけ、最後に注釈を返します。recordRecord

Optionsでは、コントロールがfirstとして設定されていることに注意してください。これは、 token を含み<record>、その後に 1 つ以上の他の token が続き、その後にtoken が続くシーケンスの最初の出現を見つけることが目的であるため</record>です。

Phase: RecordFinder
Input: Token
Options: control = first debug = true


// The following rule is able to find the sentence within a record
Rule: RuleToFindRecord
(
    ({Token.string == "<"} {Token.string == "record"} ({Token})* {Token.string == ">"})
    ({Token})*
    ({Token.string == "<"} {Token.string == "/"} {Token.string == "record"} {Token.string == ">"})
):match
-->
:match.Record = { rule = "RuleToFindRecord" }

ファイルTagFinder.jape

このフェーズでは、トークンaを入力として読み取り、タグとbテキスト内を検索し、最後ab注釈を返します。

Phase: TagFinder
Input: Token
Options: control = first debug = true


// The following rule is able to find the tag "a" within the document.
Rule: RuleToFindTag_a
(
    (
        ({Token.string == "<"} {Token.string == "a"} {Token.string == ">"})
        ({Token})*
        ({Token.string == "<"} {Token.string == "/"} {Token.string == "a"} {Token.string == ">"})
    )
    |
    ({Token.string == "<"} {Token.string == "a"} {Token.string == "/"} {Token.string == ">"})
):match
-->
:match.a = { rule = "RuleToFindTag_a" }


// The following rule is able to find the tag "b" within the document.
Rule: RuleToFindTag_b
(
    (
        ({Token.string == "<"} {Token.string == "b"} {Token.string == ">"})
        ({Token})*
        ({Token.string == "<"} {Token.string == "/"} {Token.string == "b"} {Token.string == ">"})
    )
    |
    ({Token.string == "<"} {Token.string == "b"} {Token.string == "/"} {Token.string == ">"})
):match
-->
:match.b = { rule = "RuleToFindTag_b" }

ファイルIntersection.jape

Recordこのフェーズでは、注釈aおよびを入力として読み取り、 タグまたは内bを検索します。これは、 contains演算子とwithin演算子に関するリファレンスとしてお読みください(以下のルールでこれらの演算子の 1 つを使用しました)。abRecord

Phase: Intersection
Input: Record a b
Options: control = first debug = true


// A record matches with this rule if it contains both tag a and tag b.
Rule: Rule_1
(
    {Record contains a, Record contains b}
):match
-->
:match.Record_with_both_tags = { rule = "Rule_1" }


// A record matches with this rule if it contains tag a.
Rule: Rule_2
(
    {Record contains a}
):match
-->
:match.Record_with_tag_a = { rule = "Rule_2" }
于 2016-06-17T20:36:53.020 に答える