NLTK WordNetLemmatizer обрабатывает «US» как «u» - PullRequest
0 голосов
/ 20 февраля 2019

Если вы введете слово "US" (США), после предварительной обработки (которое становится "us", то есть в нижнем регистре) в WordNetLemmatizer из пакета nltk.stem, оно будет переведено в "u".Например:

from nltk.stem import WordNetLemmatizer
lmtzr = WordNetLemmatizer()
word = "US".lower()  #  "US" becomes "us"
lemma = lmtzr.lemmatize(word)
print(lemma)  # prints "u"

Я даже пытался лемматизировать слово с помощью POS-тегов, что приводит к 'NNP' (NN = существительное и P = правильное, то есть собственное существительное) в соответствии с pos_tag()функция из пакета nltk.Но 'NNP' - это wordnet.NOUN, который является поведением лемматизатора по умолчанию при обработке слова.Следовательно, lmtzr.lemmatize(word) и lmtz.lemmatize(word, wordnet.NOUN) одинаковы (где wordnet импортируется из пакета nltk.stem.wordnet).

Любые идеи о том, как решить эту проблему, кроме неуклюжего способа явного исключенияобработка слова "us" в тексте из лемматизатора с использованием оператора if?

1 Ответ

0 голосов
/ 20 февраля 2019

Если вы посмотрите на исходный код 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
...