如何使用Spacy Matcher选择单个组

时间:2018-09-13 09:13:46

标签: python regex nlp spacy

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

matcher = Matcher(nlp.vocab)
matcher.add('GRAMMAR', None, [{'TAG': 'JJ', 'OP': '+'}, {'POS': NOUN', 'OP': '+'}])

当我只需要匹配一组时,问题就开始了。例如,如果我需要一个形容词后面的名词,但我只想匹配该名词而不是整个模式。 在一个简单的正则表达式中,我将所需的组放在括号中(如下所示)(具有虚函数):

r'JJ+(NOUN+)'

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

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': '+'}])

但是,此解决方案存在几个问题:

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

有什么想法吗?

0 个答案:

没有答案