как использовать пространственный лемматизатор, чтобы привести слово к базовой форме

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

Примеры:

  • 'слова' => 'слово'
  • «сделал» => «сделал»

Спасибо.


person yi wang    schedule 04.08.2016    source источник
comment
textminingonline.com/getting-started-with-spacy   -  person RAVI    schedule 04.08.2016
comment
spacy.io/docs   -  person RAVI    schedule 04.08.2016
comment
спасибо, я видел этот веб-сайт раньше, но они не объяснили в нем подробностей, хорошо, я попробую веб-код, еще раз спасибо.   -  person yi wang    schedule 04.08.2016


Ответы (5)


Предыдущий ответ запутан и не может быть отредактирован, поэтому вот более традиционный.

# make sure your downloaded the english model with "python -m spacy download en"

import spacy
nlp = spacy.load('en')

doc = nlp(u"Apples and oranges are similar. Boots and hippos aren't.")

for token in doc:
    print(token, token.lemma, token.lemma_)

Выход:

Apples 6617 apples
and 512 and
oranges 7024 orange
are 536 be
similar 1447 similar
. 453 .
Boots 4622 boot
and 512 and
hippos 98365 hippo
are 536 be
n't 538 not
. 453 .

Из официального тура по освещению

person damio    schedule 24.03.2017
comment
Вам нужно указать, что текст является юникодом, прежде чем передавать его в nlp? См. здесь - person Philip O'Brien; 21.07.2017
comment
@PhilipO'Brien, возможно, с Python 2, но здесь я использую Python 3. - person damio; 21.07.2017
comment
Ах, хорошо, с Python 2 я должен явно указать, что это юникод. Спасибо! (Я действительно должен переключиться на 3!) - person Philip O'Brien; 21.07.2017
comment
Одна из проблем заключается в том, что любые местоимения лемматизируются как «-PRON-», что сбивает с толку. Почему бы просто не сохранить само местоимение? - person wordsforthewise; 06.11.2017
comment
Найдите '-PRON-' здесь, чтобы увидеть решение, но я думаю, что это не должно быть поведением по умолчанию. Это кажется запутанным. - person wordsforthewise; 06.11.2017
comment
Почему яблоки остаются яблоками, а другие формы множественного числа заменяются на единственное число? - person Major Major; 14.12.2019

Если вы хотите использовать только Lemmatizer, вы можете сделать это следующим образом:

from spacy.lemmatizer import Lemmatizer
from spacy.lang.en import LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES

lemmatizer = Lemmatizer(LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES)
lemmas = lemmatizer(u'ducks', u'NOUN')
print(lemmas)

Выход

['duck']

Обновить

Начиная с версии spacy 2.2, LEMMA_INDEX, LEMMA_EXC и LEMMA_RULES объединены в объект Lookups:

import spacy
nlp = spacy.load('en')

nlp.vocab.lookups
>>> <spacy.lookups.Lookups object at 0x7f89a59ea810>
nlp.vocab.lookups.tables
>>> ['lemma_lookup', 'lemma_rules', 'lemma_index', 'lemma_exc']

Вы по-прежнему можете использовать лемматизатор напрямую со словом и тегом POS (часть речи):

from spacy.lemmatizer import Lemmatizer, ADJ, NOUN, VERB

lemmatizer = nlp.vocab.morphology.lemmatizer
lemmatizer('ducks', NOUN)
>>> ['duck']

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

lemmatizer('ducks', 'NOUN')
>>> ['duck']

from spacy.lemmatizer import Lemmatizer, ПРИЛАГ, СУЩЕСТВИТЕЛЬНОЕ, ГЛАГОЛ

person joel    schedule 23.02.2018
comment
Я попробовал ваш код, но получаю сообщение об ошибке ```не могу импортировать имя 'LEMMA_INDEX' из 'spacy.lang.en'``` - person Daniel dos Santos; 09.11.2019

Код:

import os
from spacy.en import English, LOCAL_DATA_DIR

data_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR)

nlp = English(data_dir=data_dir)

doc3 = nlp(u"this is spacy lemmatize testing. programming books are more better than others")

for token in doc3:
    print token, token.lemma, token.lemma_

Вывод:

this 496 this
is 488 be
spacy 173779 spacy
lemmatize 1510965 lemmatize
testing 2900 testing
. 419 .
programming 3408 programming
books 1011 book
are 488 be
more 529 more
better 615 better
than 555 than
others 871 others

Ссылка на пример: здесь

person RAVI    schedule 04.08.2016
comment
nlp = English(data_dir=data_dir): data_dir = data_dir, что это значит, они выглядят одинаково. - person yi wang; 05.08.2016
comment
проходная переменная. Метод English() принимает аргумент data_dir. Итак, вы передаете data_dir = local_variable_name. Это может быть также d_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR) nlp = English(data_dir=d_dir) Это просто базовый материал для Python. - person RAVI; 05.08.2016
comment
Хорошо, я попробую эти. - person yi wang; 05.08.2016
comment
Это дает ModuleNotFoundError: No module named 'spacy.en' в текущей версии (2.2). - person Suzana; 23.04.2020

Я использую Spacy версии 2.x

import spacy
nlp = spacy.load('en_core_web_sm', disable=['parser', 'ner'])
doc = nlp('did displaying words')
print (" ".join([token.lemma_ for token in doc]))

и вывод:

do display word

Надеюсь, поможет :)

person Syauqi Haris    schedule 19.04.2020
comment
Использовать только компонент tagger — хорошая идея! Иногда это может иметь большое значение и повысить скорость загрузки. - person Kirill Malakhov; 13.07.2020

Я использовал:

import spacy

nlp = en_core_web_sm.load()
doc = nlp("did displaying words")
print(" ".join([token.lemma_ for token in doc]))
>>> do display word

Но это дало ошибку OSError: [E050] Can't find model 'en_core_web_sm'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory., я использовал:

pip3 install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.0/en_core_web_sm-2.2.0.tar.gz

чтобы избавиться от ошибки.

person Community    schedule 30.08.2020