如何在JAPE右侧制作if-else语句?

时间:2016-06-17 10:33:37

标签: java annotations gate java-annotations

我是JAPE(Java Annotation Pattern Engine)的新手,是GATE的一部分。

我已经在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,则将其归类为A.如果它包含ab,则将其归类为A,假设a更强比b

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

你能告诉我一些线索吗?

感谢。

问候。

1 个答案:

答案 0 :(得分:3)

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

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

  1. RecordFinder ,返回文档中的记录,即Record注释。
  2. TagFinder ,返回文档中的代码ab
  3. 交叉点:它会在记录中搜索标记ab
  4. 档案 Main.jape

    MultiPhase: Main
    Phases: 
    RecordFinder
    TagFinder
    Intersection
    

    档案 RecordFinder.jape

    此阶段可以注释文档中的记录。此JAPE文件的唯一规则是将令牌(即由tokeniser返回的Token注释)作为输入读取,并在文档中查找记录(即标记record),最后它返回Record注释。

    请注意,在选项中,控件设置为 first ,因为目的是查找序列的第一个匹配项包含令牌<record>,后跟一个或多个其他令牌,后跟令牌</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

    此阶段将标记作为输入读取,并在文本中找到标记ab,最后返回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

    此阶段读取注释Recordab作为输入,并在a内搜索标记bRecord。阅读this作为包含运算符中的参考(我在以下规则中使用了其中一个运算符)。

    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" }