SpaCy Matcher - 限制潜在匹配

SpaCy Matcher - Restricting Potential Matches

不太清楚问题的确切措辞,所以感谢您沉迷于标题...

我正在使用 SpaCy 的 Matcher 函数来解析子句 (adverbial/prepositional/etc.) 作为 pre-processing 的一部分。其中一些条款相当复杂,不可能为每个实例制定严格的规则。因此,我在我的 Matcher 中使用了 {'OP': ''}*说明我无法为其手动创建规则的令牌。 我的问题: 是每个子句类型都不能允许某些标记类型。 我想在我的模式匹配器中创建一个允许所有标记类型的规则,我可以指定的特定标记除外。

我当前的形容词从句匹配器的简化版本:

pattern = [{'TAG': ',', 'OP': '+'},
           {'DEP': 'det', 'OP': '*'},
           {'DEP': 'det', 'OP': '*'},
           {'DEP': 'amod', 'OP': '+'},
           {'OP': '*'},
           {'TAG': '.', 'OP': '+'}]

目标: 保持模式的核心结构,同时能够排除“ROOT”依赖项,因为包含“ROOT”依赖项令牌会创建错误匹配。

我尝试添加 {'DEP': 'ROOT', 'OP': '!'} 来为 [= 创建一个例外30=]{'OP': ''}*。结果代码如下所示:

pattern = [{'TAG': ',', 'OP': '+'},
           {'DEP': 'det', 'OP': '*'},
           {'DEP': 'det', 'OP': '*'},
           {'DEP': 'amod', 'OP': '+'},
           {'OP': '*'},
           {'DEP': 'ROOT', 'OP': '!'}
           {'TAG': '.', 'OP': '+'}]

我希望匹配器首先解析不需要的标记并在匹配器中接受它,然后在它命中 {'DEP': 'ROOT', 'OP': '! '} 规则。目标是能够解析句子 (1) 中的子句而不是解析句子 (2):

(1) “它开始了一场革命,这支快乐的乐队。” (2) “是的,这支快乐的乐队并不全是快乐的,也不是全是帅哥。”

据我所知,{'OP': '*'} 是唯一接受所有标记的规则,{'DEP': 'ROOT', 'OP': '!'} 是否定标记的唯一规则。我试过混合顺序,但这也无济于事。

如果有人知道如何利用 {'OP': '*'} 规则同时还能够限制特定的令牌类型,我们将不胜感激。谢谢!

好的朋友们,我找到答案了。这里有两个解决方案:

(1) 如果您知道跨度的开始和结束规则及其标记长度,则可以使用 Matcher 中的 'NOT_IN' 函数来接受所有可能的标记,但您选择的标记除外禁止。下面的匹配器定义了开始、结束和中间标记。开头和结尾要清楚。中间标记可以是您定义的 DEP、TAG、POS 等以外的任何内容。在这种情况下,我们想要匹配除 'nsubj' 和 'PUNCT'.

之外的任何单个标记
pattern01 = [{'POS': 'SCONJ', 'OP': '+'},
             {'DEP':{'NOT_IN': ['nsubj']}, 'POS':{'NOT_IN': ['PUNCT']}},
             {'POS': 'VERB', 'OP': '+'}]

此模式 (1) 匹配第一个标记中的 'SCONJ',(2) 匹配第二个标记中不是 'nsubj' 或 'PUCNT' 的任何标记,以及 ( 3) 匹配第三个标记中的任何 'VERB'。但是,如果您想要的开始和结束令牌之间的令牌数量不变怎么办?

(2) 为了接受无限长的匹配,在指定开始和结束标记的同时,我们结合了 {'OP': '*'}'NOT_IN' 函数。我们将上面的代码修改如下:

pattern01 = [{'POS': 'SCONJ', 'OP': '+'},
             {'OP': '*', 'DEP':{'NOT_IN': ['nsubj']}, 'POS':{'NOT_IN': ['PUNCT']}},
             {'POS': 'VERB', 'OP': '+'}]

此模式 (1) 匹配第一个标记中的 'SCONJ',(2) 匹配不确定的标记字符串,只要它们不是 'nsubj' 或 'PUNCT',并且(3) 匹配第三个标记中的任何 'VERB'。

'OP': '*' 告诉匹配器接受任何令牌。 'NOT_IN' 指定应免于上述规则的令牌列表。如果这些指定的标记之一确实存在于模式中,则匹配器将不匹配跨度。

祝大家好运!