3

我是 GATE 的一部分 JAPE(Java 注释模式引擎)的新手。

我已经在 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

我想根据里面的标签对每条记录进行分类。

比如说,如果一条记录包含 tag a,则将其分类为 A。如果它包含aand b,则将其分类为 A,假设a强于b

我注意到我应该在 RHS 中操作它,但我不知道如何编写它。

你能给我一个线索或什么吗?

谢谢。

问候。

4

1 回答 1

3

为了使用 JAPE 语法构建 if-else 语句,并不总是需要在 RHS 中使用 Java。

在编写规则时,将处理划分为多个阶段通常很方便:每个阶段产生一些结果,然后可以将其传递给下一个阶段。所以,根据你刚才的描述,数据处理可以分为以下三个阶段。

  1. RecordFinder,它返回文档中的记录,即Record注释。
  2. TagFinder,它返回标签ab文档内。
  3. Intersectiona :它在记录中搜索标签b

文件Main.jape

MultiPhase: Main
Phases: 
RecordFinder
TagFinder
Intersection

文件RecordFinder.jape

此阶段能够注释文档中的记录。这个 JAPE 文件的唯一规则是读取标记(即标记Token器返回的注释)作为输入,并在文档中查找记录(即标签record),最后返回Record注释。

请注意,在Options中,控件设置为first,因为目的是找到包含 token 的序列的第一次出现<record>,然后是一个或多个其他 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" }

文件交叉口.jape

此阶段读取注释Recorda并将b其作为输入并搜索标签ab内部Record。阅读作为有关containswithin运算符的参考(我在以下规则中使用了这些运算符之一)。

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 回答