Если вы посмотрите на исходный код WordNetLemmatizer
def lemmatize(self, word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return min(lemmas, key=len) if lemmas else word
wordnet._morphy
возвращает ['us', 'u']
min(lemmas, key=len)
возвращает самое короткое слово, которое u
wordnet._morphy
использует правило для существительных, которое заменяет окончание "s"
на ""
.
Вот список замен
[('s', ''),
('ses', 's'),
('ves', 'f'),
('xes', 'x'),
('zes', 'z'),
('ches', 'ch'),
('shes', 'sh'),
('men', 'man'),
('ies', 'y')]
Донне вижу очень чистого выхода.
1) Вы можете написать специальное правило для исключения слов, написанных только заглавными буквами.
2) Или вы можете добавить строку us us
в файл nltk_data/corpora/wordnet/noun.exc
3) Вы можете написать свою собственную функцию для выбора самого длинного слова (что может быть неправильно для других слов)
from nltk.corpus.reader.wordnet import NOUN
from nltk.corpus import wordnet
def lemmatize(word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return max(lemmas, key=len) if lemmas else word