Подтвердить что ты не робот

Что означают теги для частичной речи и зависимостей spaCy?

spaCy тегирует каждый из Token в Document с частью речи (в двух разных форматах, один из которых хранится в свойствах pos и pos_ Token, а другой хранится в свойства tag и tag_) и синтаксическую зависимость от его токена .head (сохраненного в свойствах dep и dep_).

Некоторые из этих тегов не требуют пояснений, даже для кого-то вроде меня без фона лингвистики:

>>> import spacy
>>> en_nlp = spacy.load('en')
>>> document = en_nlp("I shot a man in Reno just to watch him die.")
>>> document[1]
shot
>>> document[1].pos_
'VERB'

Другие... не являются:

>>> document[1].tag_
'VBD'
>>> document[2].pos_
'DET'
>>> document[3].dep_
'dobj'

Хуже того, официальные документы не содержат даже списка возможных тегов для большинства этих свойств, а также значений любого из их. Они иногда упоминают, какой стандарт токенизации они используют, но эти утверждения в настоящее время не совсем точны, и, кроме того, стандарты сложны для отслеживания.

Каковы возможные значения свойств tag_, pos_ и dep_, и что они означают?

4b9b3361

Ответ 1

Часть речевых жетонов

Документы spaCy в настоящее время утверждают:

Маркер части речи использует версию набора тегов Penn Treebank OntoNotes 5. Мы также сопоставляем теги с более простым набором универсальных тегов POS Google.

Точнее, свойство .tag_ предоставляет теги Treebank, а свойство pos_ предоставляет теги на основе универсальных тегов Google POS (хотя spaCy расширяет список).

Документы spaCy, похоже, рекомендуют пользователям, которые просто хотят тупо использовать его результаты, а не обучать свои собственные модели, игнорировать атрибут tag_ и использовать только атрибут pos_, заявляя, что атрибуты tag_...

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

То есть, если spaCy выпускает улучшенную модель, обученную на новом древовидном банке, атрибут tag_ может иметь значения, отличные от тех, которые были у него ранее. Это явно делает его бесполезным для пользователей, которым нужен согласованный API при обновлении версий. Однако, поскольку текущие теги являются вариантом Penn Treebank, они, скорее всего, в основном пересекаются с набором, описанным в любой документации POS-тегов Penn Treebank, например: https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html

Более полезными тегами pos_ являются

Грубый, менее подробный тег, представляющий класс слов токена

на основе набора универсальных тегов Google POS. Для английского языка список тегов в наборе универсальных тегов POS можно найти здесь со ссылками на их определения: http://universaldependencies.org/en/pos/index.html

Список выглядит следующим образом:

  • ADJ: прилагательное
  • ADP: добавление
  • ADV: наречие
  • AUX: вспомогательный глагол
  • CONJ: координационное соединение
  • DET: определитель
  • INTJ: междометие
  • NOUN: существительное
  • NUM: цифра
  • PART: частица
  • PRON: местоимение
  • PROPN: имя собственное
  • PUNCT: пунктуация
  • SCONJ: подчиненное соединение
  • SYM: символ
  • VERB: глагол
  • X: другое

Однако из модуля spaCy частей речи мы видим, что он расширяет эту схему тремя дополнительными константами POS, EOL, NO_TAG и SPACE, которые не являются частью набора универсальных тегов POS, Из них:

  • при поиске исходного кода я не думаю, что EOL вообще привыкнет, хотя я не уверен
  • NO_TAG - это код ошибки. Если вы попытаетесь разобрать предложение с моделью, которую вы не установили, все Token получат эту POS. Например, у меня не установлена модель spaCy German, и я вижу ее на своем локальном компьютере, если я пытаюсь ее использовать:

    >>> import spacy
    >>> de_nlp = spacy.load('de')
    >>> document = de_nlp('Ich habe meine Lederhosen verloren')
    >>> document[0]
    Ich
    >>> document[0].pos_
    ''
    >>> document[0].pos
    0
    >>> document[0].pos == spacy.parts_of_speech.NO_TAG
    True
    >>> document[1].pos == spacy.parts_of_speech.NO_TAG
    True
    >>> document[2].pos == spacy.parts_of_speech.NO_TAG
    True
    
  • SPACE используется для любого интервала, кроме единичных нормальных пробелов ASCII (которые не получают свой собственный токен):

    >>> document = en_nlp("This\nsentence\thas      some weird spaces in\n\n\n\n\t\t   it.")
    >>> for token in document:
    ...   print('%r (%s)' % (str(token), token.pos_))
    ... 
    'This' (DET)
    '\n' (SPACE)
    'sentence' (NOUN)
    '\t' (SPACE)
    'has' (VERB)
    '     ' (SPACE)
    'some' (DET)
    'weird' (ADJ)
    'spaces' (NOUN)
    'in' (ADP)
    '\n\n\n\n\t\t   ' (SPACE)
    'it' (PRON)
    '.' (PUNCT)
    

Жетоны зависимости

Как отмечено в документах, схема тегов зависимости основана на проекте ClearNLP; значения тегов (начиная с версии 3.2.0 ClearNLP, выпущенной в 2015 году, которая остается последней версией и, по-видимому, используемой spaCy) можно найти на https://github.com/clir/clearnlp-guidelines/blob/master/md/specifications/dependency_labels.md. В этом документе перечислены следующие токены:

  • ACL: модификатор Clausal существительного
  • ACOMP: Прилагательное дополнение
  • ADVCL: модификатор словесного предложения
  • ADVMOD: Модификатор наречий
  • AGENT: агент
  • AMOD: модификатор прилагательного
  • APPOS: аппозиционный модификатор
  • ATTR: атрибут
  • AUX: вспомогательный
  • AUXPASS: вспомогательный (пассивный)
  • CASE: маркер дела
  • CC: координационное соединение
  • CCOMP: дополнение к Клаусу
  • COMPOUND: Модификатор соединения
  • CONJ: соединение
  • CSUBJ: предмет клаузулы
  • CSUBJPASS: субъект предмета (пассивный)
  • DATIVE: дательный
  • DEP: несекретная зависимость
  • DET: определитель
  • DOBJ: прямой объект
  • EXPL: полный
  • INTJ: междометие
  • MARK: маркер
  • META: мета-модификатор
  • NEG: модификатор отрицания
  • NOUNMOD: модификатор номинала
  • NPMOD: существительная фраза как модификатор наречий
  • NSUBJ: номинальный предмет
  • NSUBJPASS: номинальный субъект (пассивный)
  • NUMMOD: модификатор числа
  • OPRD: предикат объекта
  • PARATAXIS: паратаксис
  • PCOMP: дополнение предлога
  • POBJ: объект предлога
  • POSS: модификатор владения
  • PRECONJ: прекорреляционное соединение
  • PREDET: предопределитель
  • PREP: модификатор предложения
  • PRT: частица
  • PUNCT: Пунктуация
  • QUANTMOD: модификатор квантификатора
  • RELCL: модификатор относительного предложения
  • ROOT: Root
  • XCOMP: открытое клаузальное дополнение

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

В дополнение к вышеприведенной документации, если вы хотите увидеть некоторые примеры этих зависимостей в реальных предложениях, вас может заинтересовать работа Джинхо Д. Чоя в 2012 году: либо его Оптимизация компонентов обработки естественного языка для надежности и Масштабируемость или его Руководство по стилю CLEAR Составная часть для преобразования зависимостей (которая, кажется, просто подраздел предыдущей статьи). Оба перечисляют все метки зависимостей CLEAR, которые существовали в 2012 году, вместе с определениями и примерами предложений. (К сожалению, набор меток зависимостей CLEAR немного изменился с 2012 года, поэтому некоторые из современных меток не перечислены или не приведены в качестве примера в работе Чой - но он остается полезным ресурсом, хотя и немного устаревшим.)

Ответ 2

Просто подскажите о том, как получить подробный смысл коротких форм. Вы можете использовать метод explain, как показано ниже:

spacy.explain('pobj')

который даст вам выход, например:

'object of preposition'

Ответ 3

В настоящее время синтаксический анализ и маркировка зависимостей в SpaCy, по-видимому, реализуется только на уровне слова, а не фразе (кроме именной) или уровне предложения. Это означает, что SpaCy можно использовать для определения таких существительных (NN, NNS), прилагательных (JJ, JJR, JJS) и глаголов (VB, VBD, VBG и т.д.), Но не прилагательных фраз (ADJP), наречных фраз ( ADVP) или вопросы (SBARQ, SQ).

Для иллюстрации, когда вы используете SpaCy для синтаксического разбора предложения "Каким образом идет автобус?", мы получаем следующее дерево.

В отличие от этого, если вы используете парсер Стэнфорда, вы получаете гораздо более глубоко структурированное синтаксическое дерево.

Ответ 4

Официальная документация теперь предоставляет гораздо больше деталей для всех этих аннотаций на https://spacy.io/api/annotation (а список других атрибутов для токенов можно найти на https://spacy.io/api/token).

Как видно из документации, их теги частей речи (POS) и зависимостей имеют как универсальные, так и специфические варианты для разных языков, а функция explain() - очень полезный ярлык, позволяющий получить лучшее описание значения тега без документации, например

spacy.explain("VBD")

который дает "глагол, прошедшее время".