В зависимости от того, есть ли у вас теггер, вы можете настроить исключения лемматизатора на основе правил или таблицу поиска:
import spacy
# original
nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"])
# may be "up" or "ups" depending on exact version of spacy/model because it
# depends on the POS tag
assert nlp("ups")[0].lemma_ in ("ups", "up")
# 1. Exception for rule-based lemmatizer (with tagger)
# reload to start with a clean lemma cache
nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"])
# add an exception for "ups" as with POS NOUN or VERB
nlp.vocab.lookups.get_table("lemma_exc")["noun"]["ups"] = ["ups"]
nlp.vocab.lookups.get_table("lemma_exc")["verb"]["ups"] = ["ups"]
assert nlp("ups")[0].lemma_ == "ups"
# 2. New entry for lookup lemmatizer (without tagger)
nlp = spacy.load("en_core_web_sm", disable=["tagger", "parser", "ner"])
nlp.vocab.lookups.get_table("lemma_lookup")["ups"] = "ups"
assert nlp("ups")[0].lemma_ == "ups"
Если вы обрабатываете слова изолированно, теггер не будет очень надежный (вы можете получить NOUN
, PROPN
или VERB
для чего-то вроде ups
), поэтому, возможно, будет проще настроить лемматизатор поиска. Качество лемм, основанных на правилах, в целом выше, но для получения разумных результатов вам нужны как минимум полные фразы, предпочтительно полные предложения.