Как реализовать пространственный лемматизатор с аргументом univ_pos

tokens = [The, wage, productivity, nexus, the, process, of, development,....]

Я пытаюсь преобразовать список токенов в их лемматизированную форму, используя Lemmatizer SpaCy. Вот документация, которую я использую.

Мой код:

from spacy.lemmatizer import Lemmatizer
from spacy.lookups import Lookups
lookups = Lookups()
lookups.add_table("lemma_rules")
lemmatizer = Lemmatizer(lookups)
lemmas = []
for tokens in filtered_tokens:
    lemmas.append(lemmatizer(tokens))

сообщение об ошибке

TypeError                                 Traceback (most recent call last)
 in 
      7 lemmas = []
      8 for tokens in filtered_tokens:
----> 9     lemmas.append(lemmatizer(tokens))

TypeError: __call__() missing 1 required positional argument: 'univ_pos'

В этом обсуждении я понял, как работает Lemmatizer SpaCy, и понял его в теории. Однако я не уверен, как я могу реализовать это.

Как я могу узнать univ_pos для своих токенов?


person sheth7    schedule 16.02.2020    source источник
comment
Теги UPOS — это такие вещи, как СУЩЕСТВИТЕЛЬНОЕ, ГЛАГОЛ,... Обычно, когда вы запускаете spaCy, вы анализируете предложение , который помечает каждое слово этими тегами. Функциональность леммы доступна в атрибуте .lemma_. Если вы не можете проанализировать полное предложение, вам придется применить теги вручную. Если ваши токены являются spaCy Tokens, вы должны просто вызвать .lemma_, чтобы получить лемму.   -  person bivouac0    schedule 17.02.2020
comment
при синтаксическом анализе я использую «конвейер Tokenizer» spacy spacy.io/api/tokenizer . Вы не знаете, могу ли я получить теги upos с помощью конвейера токенизатора? Спасибо.   -  person sheth7    schedule 17.02.2020


Ответы (1)


Вот пример, адаптированный из документации spaCy...

import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple is looking at buying U.K. startup for $1 billion")
for token in doc:
    print(token.text, token.pos_, token.lemma_)

Здесь .pos_ дает вам универсальную часть речи, которую вы ищете в своем исходном вопросе.

Однако для тегирования, лемматизации и т. д. требуется полный конвейер компонентов. Существует тег для добавления данных pos. Если Tokenizer — единственная функция в вашем пайплайне, у вас, вероятно, не будет информации pos.

person bivouac0    schedule 16.02.2020
comment
Это не выполняет токенизацию с использованием конвейера токенизации SpaCy и, следовательно, не так быстро. Я хотел бы использовать конвейер для токенизации и получения тегов pos. Мысли? - person sheth7; 17.02.2020
comment
В приведенном выше примере используется конвейер spaCy. Я не понимаю, что вы спрашиваете. Можете ли вы объяснить свою проблему более подробно и указать, почему приведенный выше пример не работает? - person bivouac0; 17.02.2020
comment
Этот метод будет работать, но не так быстро, как использование конвейера SpaCy Tokenizer. Смотрите это — spacy.io/api/tokenizer. Конвейер Tokenizer позволяет выполнять пакетную обработку и т. д. - person sheth7; 17.02.2020
comment
Это быстрее, потому что не помечается (по крайней мере, это одна из причин). Лемматизатор SpaCy должен знать upos, поэтому, если вы собираетесь его использовать, вам нужно пометить его. Вы можете посмотреть на lemminflect.getAllLemmas. Lemminflect использует другой подход (на основе словаря) для лемматизации и может работать немного лучше для вас. Обратите внимание, что есть несколько слов, которые могут возвращать разные леммы, если вы не знаете тег, но вы можете правильно лемматизировать большинство без него. - person bivouac0; 17.02.2020