我是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.如果它包含a
和b
,则将其归类为A,假设a
更强比b
。
我注意到我应该在RHS中操纵它,但我不知道如何写这个。
你能告诉我一些线索吗?感谢。
问候。
答案 0 :(得分:3)
为了使用JAPE语法构建if-else语句,并不总是需要在RHS中使用Java。
在编写规则时,通常可以方便地在多个阶段划分处理:每个阶段产生一些结果,然后可以将其传递到下一个阶段。因此,根据您刚才描述的内容,数据处理可以分为以下三个阶段。
Record
注释。a
和b
。a
和b
。档案 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
此阶段将标记作为输入读取,并在文本中找到标记a
和b
,最后返回a
和b
注释
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
作为输入,并在a
内搜索标记b
或Record
。阅读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" }