Jape文件在句子中找到模式

时间:2015-03-22 19:07:28

标签: java nlp gate

如果我在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"}

2 个答案:

答案 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,因为它们仅适用于单个注释,而不适用于注释序列。

但你可以使用"技巧":

  1. Sentence中添加Input注释。
    这是主要的事情。即使您未在规则中的任何位置使用Sentence,也会阻止此类匹配,其中新句子注释之间。
    但它并不能阻止句子以相同的点开始>作为注释本身的匹配。

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

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