фрагментация существительных создает неожиданную лемму, pos, тег и dep

#nlp #spacy

#nlp #разбиение

Вопрос:

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

 # Import spacy
import spacy
nlp = spacy.load("en_core_web_lg")

# Add noun chunking to the pipeline
merge_noun_chunks = nlp.create_pipe("merge_noun_chunks")
nlp.add_pipe(merge_noun_chunks)

# Process the document
docs = nlp.pipe(["The big dogs chased the fast cat"])

# Print out the tokens
for doc in docs:
    for token in doc:
        print("text: {}, lemma: {}, pos: {}, tag: {}, dep: {}".format(tname, token.text, token.lemma_, token.pos_, token.tag_, token.dep_))
  

Результат, который я получаю, выглядит следующим образом:

 text: The big dogs, lemma: the, pos: NOUN, tag: NNS, dep: nsubj
text: chased, lemma: chase, pos: VERB, tag: VBD, dep: ROOT
text: the fast cat, lemma: the, pos: NOUN, tag: NN, dep: dobj
  

Проблема заключается в первой строке вывода, где «большие собаки» были проанализированы неожиданным образом: она создает «лемму» из «the» и указывает, что это «pos» из «NOUN», «тег» из «NNS» и «dep» из «nsubj».

Результат, который я надеялся получить, выглядит следующим образом:

 text: The big dogs, lemma: the big dog, pos: NOUN, tag: NNS, dep: nsubj
text: chased, lemma: chase, pos: VERB, tag: VBD, dep: ROOT
text: the fast cat, lemma: the fast cat, pos: NOUN, tag: NN, dep: dobj
  

Я ожидал, что «леммой» будет фраза «большая собака» с формой множественного числа, измененной на единственное число, и фраза будет «pos» из «СУЩЕСТВИТЕЛЬНОГО», «tag» из «NNS» и «dep» из «nsubj».

Это правильное поведение, или я неправильно использую spacy? Если я неправильно использую spacy, пожалуйста, дайте мне знать, как правильно выполнить эту задачу.

Ответ №1:

Здесь следует учитывать несколько моментов

  1. Лемматизация основана на токенах
  2. Пометка POS и анализ зависимостей являются прогностическими

Вы, вероятно, получите, the big dog если возьмете lemma_ атрибут для каждого токена. Это не обновляет токен pos, который вы используете для атрибута.

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

Кроме проблемы с леммой, кажется, вы используете spacy правильно