Я использую Spacy для разбора предложений.
С этим предложением на английском языке sh 'Аристотель - человек.' и с моделью en_core_web_sm
я получаю дерево
{
{
Aristote dep_ [nsubj] tag_ (NNP) pos_ (PROPN)
}
is dep_ [ROOT] tag_ (VBZ) pos_ (AUX)
{
{
a dep_ [det] tag_ (DT) pos_ (DET)
}
man dep_ [attr] tag_ (NN) pos_ (NOUN)
}
{
. dep_ [punct] tag_ (.) pos_ (PUNCT)
}
}
узел root - это глагол 'is' Это то, что я хочу.
С то же самое предложение на французском «Aristote est un homme». и с моделью 'fr_core_news_sm' я получаю дерево
{
{
Aristote dep_ [nsubj] tag_ (NOUN__Gender=Masc|Number=Sing) pos_ (NOUN)
}
{
est dep_ [cop] tag_ (AUX__Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin) pos_ (AUX)
}
{
un dep_ [det] tag_ (DET__Definite=Ind|Gender=Masc|Number=Sing|PronType=Art) pos_ (DET)
}
homme dep_ [ROOT] tag_ (NOUN__Gender=Masc|Number=Sing) pos_ (NOUN)
{
. dep_ [punct] tag_ (PUNCT___) pos_ (PUNCT)
}
}
Узлом root является имя 'homme'
Глагол 'est' считается вспомогательным и не root
Как настроить Spacy таким образом, чтобы «is» считался глаголом и чтобы это было root?
Дерево отображается со следующим кодом
def showTree(sent):
def __showTree(token, level):
tab = "\t" * level
sys.stdout.write("\n%s{" % (tab))
[__showTree(t, level+1) for t in token.lefts]
sys.stdout.write("\n%s\t%s dep_ [%s] tag_ (%s) pos_ (%s)" % (tab, token, token.dep_, token.tag_, token.pos_))
[__showTree(t, level+1) for t in token.rights]
sys.stdout.write("\n%s}" % (tab))
return __showTree(sent.root, 1)