Почему в основе слова got все еще есть слово get, а не get?

from stemming.porter2 import stem

documents = ['got',"get"]

documents = [[stem(word) for word in sentence.split(" ")] for sentence in documents]
print(documents)

Результат:

[['got'], ['get']]

Может кто-нибудь помочь объяснить это? Спасибо !


person Jiazhao Li    schedule 25.08.2018    source источник
comment
NIT: это артефакт используемой библиотеки / метода стемминга, а не Python, который является просто фреймворком / средой выполнения. Таким образом, конкретная используемая библиотека должна быть включена в вопрос: это pypi. org / project / stemming / 1.0?   -  person user2864740    schedule 25.08.2018
comment
Это один из тех странных случаев, когда стеммер недостаточно мощный, чтобы понять, чего вы хотите. Сначала попробуйте лемматизировать это слово, а затем сформулировать лемму: nltk.WordNetLemmatizer().lemmatize("got","v") - ›"get".   -  person DYZ    schedule 26.08.2018


Ответы (1)


Вам нужен лемматизатор вместо стеммера. Разница небольшая.

Как правило, стеммер отбрасывает суффиксы в максимально возможном количестве и в некоторых случаях обрабатывает список исключений для слов, которые не могут найти нормализованную форму, просто отбрасывая суффиксы.

Лемматизатор пытается найти «базовую» / корневую / инфинитивную форму слова и обычно требует специальных правил для разных языков.

Видеть


Лемматизация с использованием NLTK-реализации лемматизатора морфии требует, чтобы тег части речи (POS) был достаточно точным.

Избегайте (или никогда) пытайтесь лемматизировать отдельные слова в отдельности. Попробуйте лемматизировать предложение, полностью помеченное POS-тегами, например

from nltk import word_tokenize, pos_tag
from nltk import wordnet as wn

def penn2morphy(penntag, returnNone=False, default_to_noun=False):
    morphy_tag = {'NN':wn.NOUN, 'JJ':wn.ADJ,
                  'VB':wn.VERB, 'RB':wn.ADV}
    try:
        return morphy_tag[penntag[:2]]
    except:
        if returnNone:
            return None
        elif default_to_noun:
            return 'n'
        else:
            return ''

С помощью вспомогательной функции penn2morphy вам нужно преобразовать тег POS из pos_tag() в теги morphy, и тогда вы сможете:

>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> sent = "He got up in bed at 8am."
>>> [(token, penn2morphy(tag)) for token, tag in pos_tag(word_tokenize(sent))]
[('He', ''), ('got', 'v'), ('up', ''), ('in', ''), ('bed', 'n'), ('at', ''), ('8am', ''), ('.', '')]
>>> [wnl.lemmatize(token, pos=penn2morphy(tag, default_to_noun=True)) for token, tag in pos_tag(word_tokenize(sent))]
['He', 'get', 'up', 'in', 'bed', 'at', '8am', '.']

Для удобства вы также можете попробовать pywsd лемматизатор .

>>> from pywsd.utils import lemmatize_sentence
Warming up PyWSD (takes ~10 secs)... took 7.196984529495239 secs.
>>> sent = "He got up in bed at 8am."
>>> lemmatize_sentence(sent)
['he', 'get', 'up', 'in', 'bed', 'at', '8am', '.']

См. Также https://stackoverflow.com/a/22343640/610569

person alvas    schedule 26.08.2018