Как лемматизировать список предложений - PullRequest
0 голосов
/ 04 июня 2018

Как я могу лемматизировать список предложений в Python?

from nltk.stem.wordnet import WordNetLemmatizer
a = ['i like cars', 'cats are the best']
lmtzr = WordNetLemmatizer()
lemmatized = [lmtzr.lemmatize(word) for word in a]
print(lemmatized)

Это то, что я пробовал, но оно дает мне те же предложения.Нужно ли токенизировать слова, прежде чем они будут работать должным образом?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы должны лемматизировать каждое слово отдельно.Вместо этого вы лемматизируете предложения .Правильный фрагмент кода:

from nltk.stem.wordnet import WordNetLemmatizer
from nltk import word_tokenize
sents = ['i like cars', 'cats are the best']
lmtzr = WordNetLemmatizer()
lemmatized = [[lmtzr.lemmatize(word) for word in word_tokenize(s)]
              for s in sents]
print(lemmatized)
#[['i', 'like', 'car'], ['cat', 'are', 'the', 'best']]

Вы также можете получить лучшие результаты, если сначала сделаете пометки POS, а затем предоставите информацию о POS лемматизатору.

0 голосов
/ 05 июня 2018

TL; DR :

pip3 install -U pywsd

Тогда:

>>> from pywsd.utils import lemmatize_sentence

>>> text = 'i like cars'
>>> lemmatize_sentence(text)
['i', 'like', 'car']
>>> lemmatize_sentence(text, keepWordPOS=True)
(['i', 'like', 'cars'], ['i', 'like', 'car'], ['n', 'v', 'n'])

>>> text = 'The cat likes cars'
>>> lemmatize_sentence(text, keepWordPOS=True)
(['The', 'cat', 'likes', 'cars'], ['the', 'cat', 'like', 'car'], [None, 'n', 'v', 'n'])

>>> text = 'The lazy brown fox jumps, and the cat likes cars.'
>>> lemmatize_sentence(text)
['the', 'lazy', 'brown', 'fox', 'jump', ',', 'and', 'the', 'cat', 'like', 'car', '.']

В противном случае посмотрите, как работает функция в pywsd:

  • Токенизация строки
  • Использование тега POS и сопоставление с набором тегов WordNet POS
  • Попытка стебля
  • Наконец, вызов лемматизатора с помощью POSи / или стебли

См. https://github.com/alvations/pywsd/blob/master/pywsd/utils.py#L129

...