Я думаю, что вам не хватает той части, где вы используете базу данных spaCy в качестве ссылки для лемматизации. Если вы видите изменения, которые я внес в ваш код ниже, и предоставили вывод. duck
является правильным lemma_
для ducks
.
import spacy
from spacy.lemmatizer import Lemmatizer
from spacy.lookups import Lookups
lookups = Lookups()
lemmatizer = Lemmatizer(lookups)
word = "ducks"
#load spacy core database
nlp = spacy.load('en_core_web_sm')
#run NLP on input/doc
doc = nlp(word)
#Print formatted token attributes
print("Token Attributes: \n", "token.text, token.pos_, token.tag_, token.dep_, token.lemma_")
for token in doc:
# Print the text and the predicted part-of-speech tag
print("{:<12}{:<12}{:<12}{:<12}{:<12}".format(token.text, token.pos_, token.tag_, token.dep_, token.lemma_))
Выход
Token Attributes:
token.text, token.pos_, token.tag_, token.dep_, token.lemma_
ducks NOUN NNS ROOT duck
Лемматизация в решающей степени зависит от части речи токена. Только жетоны с одинаковой частью речи отображаются на одну и ту же лемму.
В предложении «Это сбивает с толку» confusing
анализируется как прилагательное, и, следовательно, оно превращается в confusing
. В предложении «я тебя с кем-то путал», напротив, confusing
анализируется как глагол и переводится в confuse
.
Если вы хотите, чтобы токены с разными частями речи были сопоставлены с одной и той же леммой, вы можете использовать алгоритм стволов, такой как Porter Stemming (Java), который вы можете просто вызвать на каждом жетоне.