如果我在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"}
答案 0 :(得分:2)
除了涵盖句子本身的Sentence
注释外,句子分割器还会在句子边界上创建Split
注释。如果您在Split
行中添加Input
但在规则中不提及{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}
的规则不匹配。
答案 1 :(得分:1)
在这种情况下,您不能像{X within Y}
一样使用Contextual Operators,因为它们仅适用于单个注释,而不适用于注释序列。
但你可以使用"技巧":
在Sentence
中添加Input
注释。
这是主要的事情。即使您未在规则中的任何位置使用Sentence
,也会阻止此类匹配,其中新句子在注释之间。
但它并不能阻止句子以相同的点开始>>作为注释本身的匹配。
使用!
运算符禁止任何句子与第二个注释在同一点开始:{Lookup, !Sentence}
。
Phase: secondpass
Input: Lookup Sentence
Options: control = brill
Rule: A3b
(
{Lookup.majorType == "trouble"}
{Lookup.majorType == "alteration", !Sentence}
):label
--> :label.A3b = {rule= "A3b"}