Python 如何使用空间匹配器选择单个组

Python 如何使用空间匹配器选择单个组,python,regex,nlp,spacy,Python,Regex,Nlp,Spacy,我正在尝试从NLTK转移到Spacy,我需要的功能之一是将“子树”与正则表达式匹配。 在简单的情况下,Matcher做得很好: matcher = Matcher(nlp.vocab) matcher.add('GRAMMAR', None, [{'TAG': 'JJ', 'OP': '+'}, {'POS': NOUN', 'OP': '+'}]) 当我只需要匹配其中一个组时,问题就开始了。例如,如果我需要一个名词跟在一个形容词后面,但我只想匹配这个名词,而不是整个模式。 在一个简单的正则表

我正在尝试从NLTK转移到Spacy,我需要的功能之一是将“子树”与正则表达式匹配。 在简单的情况下,Matcher做得很好:

matcher = Matcher(nlp.vocab)
matcher.add('GRAMMAR', None, [{'TAG': 'JJ', 'OP': '+'}, {'POS': NOUN', 'OP': '+'}])
当我只需要匹配其中一个组时,问题就开始了。例如,如果我需要一个名词跟在一个形容词后面,但我只想匹配这个名词,而不是整个模式。 在一个简单的正则表达式中,我会将所需的组放在括号中,如下所示(使用一个虚函数):

我的临时解决方案是只获取回调函数中的一些令牌,如下所示:

hits = []
matcher = Matcher(nlp.vocab)
matcher.add('GRAMMAR', lambda matcher, doc, i, matches: hits.append(('GRAMMAR', doc[matches[i][1]+1:matches[i][2]].text)), [{'TAG': 'JJ', 'OP': '+'}, {'POS': 'NOUN', 'OP': '+'}])
但是,此解决方案存在以下几个问题:

  • 我想将模式列表提取到外部源,因此回调函数对于所有模式都必须相同,尽管对于每个模式,我需要选择不同的组(有时是第一个,有时是第二个,有时是整个模式)
  • 我的解决方案计算代币。如果模式涉及运算符(例如,
    *
    +
    ),我不一定知道所需匹配从哪个标记开始/结束
  • 我对此不确定,但我可能希望避免将匹配项附加到外部列表。我更喜欢将匹配项保留在
    Matcher
    对象中的解决方案
  • 有什么想法吗

    hits = []
    matcher = Matcher(nlp.vocab)
    matcher.add('GRAMMAR', lambda matcher, doc, i, matches: hits.append(('GRAMMAR', doc[matches[i][1]+1:matches[i][2]].text)), [{'TAG': 'JJ', 'OP': '+'}, {'POS': 'NOUN', 'OP': '+'}])