You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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会只在单个Sentence Annotation的范围内查找内部的序列。
  • 元素匹配:
    • (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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:16:59