nltk: Как лемматизировать окружающие слова в контексте?

Следующий код выводит leaf:

from nltk.stem.wordnet import WordNetLemmatizer

lem = WordNetLemmatizer()
print(lem.lemmatize('leaves'))

Это может быть или не быть точным в зависимости от окружающего контекста, например. Mary leaves the room против Dew drops fall from the leaves. Как я могу указать NLTK лемматизировать слова с учетом окружающего контекста?


person James Ko    schedule 19.03.2018    source источник
comment
Взгляните на kaggle.com/alvations/basic-nlp-with-nltk (раздел стемминга и лемматизации).   -  person alvas    schedule 19.03.2018


Ответы (1)


TL;DR

Сначала пометьте предложение, затем используйте тег POS в качестве дополнительного входного параметра для лемматизации.

from nltk import pos_tag
from nltk.stem import WordNetLemmatizer

wnl = WordNetLemmatizer()

def penn2morphy(penntag):
    """ Converts Penn Treebank tags to WordNet. """
    morphy_tag = {'NN':'n', 'JJ':'a',
                  'VB':'v', 'RB':'r'}
    try:
        return morphy_tag[penntag[:2]]
    except:
        return 'n' 

def lemmatize_sent(text): 
    # Text input is string, returns lowercased strings.
    return [wnl.lemmatize(word.lower(), pos=penn2morphy(tag)) 
            for word, tag in pos_tag(word_tokenize(text))]

lemmatize_sent('He is walking to school')

Подробное описание того, как и почему тег POS необходим, см. на странице https://www.kaggle.com/alvations/basic-nlp-with-nltk


В качестве альтернативы вы можете использовать токенизатор pywsd + лемматизатор, обертку WordNetLemmatizer NLTK:

Установить:

pip install -U nltk
python -m nltk.downloader popular
pip install -U pywsd

Код:

>>> from pywsd.utils import lemmatize_sentence
Warming up PyWSD (takes ~10 secs)... took 9.307677984237671 secs.

>>> text = "Mary leaves the room"
>>> lemmatize_sentence(text)
['mary', 'leave', 'the', 'room']

>>> text = 'Dew drops fall from the leaves'
>>> lemmatize_sentence(text)
['dew', 'drop', 'fall', 'from', 'the', 'leaf']
person alvas    schedule 19.03.2018
comment
Я совсем новичок в питоне. Можете ли вы объяснить, как работает эта часть? вернуть [wnl.lemmatize(word.lower(), pos=penn2morphy(tag)) для слова, пометить в pos_tag(word_tokenize(text))] или, может быть, разделить его - person snailp4el; 07.08.2020
comment
Взгляните на github.com/usaarhat/pywarmups, особенно сессия 2 =) - person alvas; 07.08.2020