如何在GATE的JAPE语法中限定匹配模式处于同一句子内?
GATE JAPE规则:匹配同句内的{person}→任意Token→"call"→任意Token→{person}
我经常帮人调试GATE的JAPE规则,刚好这个场景很典型,直接给你一个可以直接用(或者微调)的规则代码,然后给你拆解下逻辑:
Phase: PersonCallPerson Input: Token person Sentence Options: control = appelt Rule: PersonCallsPerson // 匹配同一句子内的「人物 + 任意内容 + call + 任意内容 + 另一人物」结构 ( Sentence{ (person) (Token)* (Token.string == "call") (Token)* (person) } ):callPattern // 如果需要生成新的标注(比如标记这是一个通话关系),可以加Action部分 Action: { // 创建一个新的Annotation,类型自定义,比如"PersonCallRelation" Annotation callRel = new Annotation( inputAS, "PersonCallRelation", callPattern.startNode(), callPattern.endNode() ); // 可以给新标注加属性,比如记录两个人物 callRel.setFeatures(new Features()); callRel.getFeatures().put("caller", callPattern.get("person", 0)); callRel.getFeatures().put("callee", callPattern.get("person", 1)); }
关键细节说明:
- 上下文限定:用
Sentence把整个匹配序列包起来,这是确保所有元素都在同一句子内的核心——JAPE会只在单个SentenceAnnotation的范围内查找内部的序列。 - 元素匹配:
(person):匹配你已经定义好的person类型标注(如果你的人物标注类型不是person,记得改成你实际用的名称,比如Person)(Token)*:*表示匹配0个或多个该类型的标注,完美覆盖“任意数量Token”的需求Token.string == "call":精准匹配字符串为call的Token
- 大小写适配:如果需要忽略大小写(比如匹配
Call、CALL),把这行改成Token.string =~ "(?i)call"即可 - Action部分:这部分是可选的,如果不需要生成新标注,可以删掉;如果需要标记这个通话关系,这段代码会创建一个覆盖整个匹配区间的新标注,还能关联两个人物实体
注意事项:
要确保你的GATE语料库中已经存在person类型的Annotation,以及Sentence和Token的标注(这些通常由GATE的默认ANNIE插件处理,比如Tokenizer、Sentence Splitter、Named Entity Recognizer)。
内容的提问来源于stack exchange,提问作者SFS
相关产品推荐
相关产品推荐

