3

我一直在尝试使用动词时态和情绪为 spacy 匹配器制作特定的模式。
我发现了如何使用 model.vocab.morphology.tag_map[token.tag_] 访问用 spacy 解析的单词的形态特征,当动词处于虚拟语气模式(我感兴趣的模式)时,它会打印出类似这样的内容:

{'Mood_sub':真,'Number_sing':真,'Person_three':真,'Tense_pres':真,'VerbForm_fin':真,74:100}

但是,我想要一个像这样的模式来重新标记特定的动词短语:pattern = [{'TAG':'Mood_sub'}, {'TAG':'VerbForm_ger'}]

对于像“Que siga aprendiendo”这样的西班牙语短语,“siga”在其标签中具有“Mood_sub”=True,而“aprendiendo”在其标签中具有“VerbForm_ger”=True。但是,匹配器没有检测到这个匹配。

谁能告诉我为什么会这样以及我该如何解决?这是我正在使用的代码:

model = spacy.load('es_core_news_md')
text = 'Que siga aprendiendo de sus alumnos'
doc = model(text)
pattern = [{'TAG':'Mood_sub'}, {'TAG':'VerbForm_ger'}] 
matcher.add(1, None, pattern)
matches = matcher(doc)
for i, start, end in matches:
    span = doc[start:end]
    if len(span) > 0:
       with doc.retokenize() as retokenizer:
            retokenizer.merge(span)
4

1 回答 1

2

morph支持在 spacy v2 中并未完全实现,因此使用直接变形值(如Mood_sub.

相反,我认为 to 的最佳选择Matcher是使用REGEX组合/扩展TAG值。它不会特别优雅,但它应该可以工作:

import spacy
from spacy.matcher import Matcher

nlp = spacy.load('es_core_news_sm')
doc = nlp("Que siga aprendiendo de sus alumnos")
assert doc[1].tag_ == "AUX__Mood=Sub|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin"
matcher = Matcher(nlp.vocab)
matcher.add("MOOD_SUB", [[{"TAG": {"REGEX": ".*Mood=Sub.*"}}]])
assert matcher(doc) == [(513366231240698711, 1, 2)]
于 2020-09-04T10:59:52.983 回答