Jape文件在一个句子中找到模式

如果我在jape规则中写的单词出现在同一个句子中,我需要注释一个句子的一部分。 例如,句子是“孩子无法抗拒他的日常生活中的任何变化”。 我在“trouble.lst”文件中添加了像抵抗这样的词,并在“alteration.lst”文件中进行了更改。 现在在这句话中,我需要注释“抵抗任何变化”的部分为“A3b”。 我尝试使用下面的代码,但它没有考虑同一句话中的单词。 我的jape规则也是从不同的句子中取词。 假设抵抗出现在一个句子中并且在其他一些后面的句子中发生变化,因此这段代码也注释了这一点。 任何人都可以帮我找出解决方案吗?

Phase:secondpass Input: Lookup Options: control = brill Rule: A3b ({Lookup.majorType == "trouble"} {Lookup.majorType == "alteration"} ):label --> :label.A3b = {rule= "A3b"} 

在这种情况下,您不能使用像{X within Y}这样的上下文运算符,因为它们仅适用于单个注释,而不适用于注释序列。

但你可以使用“技巧”:

  1. Input包含Sentence注释。
    这是主要的事情。 即使你不在规则中的任何地方使用Sentence ,它也会阻止在注释之间某处开始新句子的匹配。
    但它并不能阻止句子与注释本身在同一点开始的匹配。

  2. 使用!禁止任何句子与第二个注释在同一点开始! operator: {Lookup, !Sentence}

 Phase: secondpass Input: Lookup Sentence Options: control = brill Rule: A3b ( {Lookup.majorType == "trouble"} {Lookup.majorType == "alteration", !Sentence} ):label --> :label.A3b = {rule= "A3b"} 

除了覆盖句子本身的Sentence注释之外,句子分割器还在句子边界上创建了Split注释。 如果在Input行中包含Split但未在规则中提及{Split} ,则这将阻止跨越句子边界的匹配。

 Phase: secondpass Input: Lookup Split Options: control = brill Rule: A3b ({Lookup.majorType == "trouble"} {Lookup.majorType == "alteration"} ):label --> :label.A3b = {rule= "A3b"} 

这种方法的工作方式是Input行确定JAPE匹配器可以“看到”哪些注释 – 如果故障和更改Lookup注释在不同的句子中,则匹配器将看到序列{Lookup}{Split}{Lookup} ,与想要{Lookup}{Lookup}的规则不匹配。