web-dev-qa-db-fra.com

Que signifient les balises de partie du discours et de dépendance de spaCy?

spaCy balise chacun des Token dans un Document avec une partie de la parole (dans deux formats différents, un stocké dans les pos et pos_ propriétés des Token et des autres stockées dans les tag et tag_ propriétés) et une dépendance syntaxique à son .head jeton (stocké dans les dep et dep_ Propriétés).

Certaines de ces balises sont explicites, même pour quelqu'un comme moi sans formation linguistique:

>>> 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'

D'autres ... ne sont pas:

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

Pire encore, les documents officiels ne contiennent même pas une liste des balises possibles pour la plupart de ces propriétés, ni la signification de l'une d'entre elles. Ils mentionnent parfois la norme de tokenisation qu'ils utilisent, mais ces affirmations ne sont pas actuellement entièrement précises et en plus de cela, les normes sont difficiles à localiser.

Quelles sont les valeurs possibles de tag_, pos_, et dep_ propriétés, et que signifient-elles?

30
Mark Amery

Partie des jetons de parole

Les docs spaCy affirment actuellement:

Le tagger de partie de discours utilise la version OntoNotes 5 du jeu de tags Penn Treebank. Nous mappons également les balises à l'ensemble de balises POS universel de Google plus simple.

Plus précisément, la propriété .tag_ Expose les balises Treebank, et la propriété pos_ Expose les balises en fonction des Google Universal POS Tags (bien que spaCy étend la liste).

les documents de spaCy semblent recommander aux utilisateurs qui souhaitent simplement utiliser ses résultats, plutôt que de former leurs propres modèles, d'ignorer l'attribut tag_ et de n'utiliser que pos_, indiquant que les attributs tag_ ...

sont principalement conçus pour être de bonnes fonctionnalités pour les modèles ultérieurs, en particulier l'analyseur syntaxique. Ils dépendent de la langue et des arbres.

Autrement dit, si spaCy publie un modèle amélioré formé sur un nouveau treebank , l'attribut tag_ Peut avoir des valeurs différentes de celles qu'il avait auparavant. Cela rend clairement inutile les utilisateurs qui souhaitent une API cohérente lors des mises à niveau de version. Cependant, étant donné que les balises actuelles sont une variante de Penn Treebank, elles sont susceptibles de se croiser principalement avec l'ensemble décrit dans toute documentation de balises Penn Treebank POS, comme ceci: https://www.ling.upenn.edu/ courses/Fall_2003/ling001/penn_treebank_pos.html

Les balises pos_ Les plus utiles sont

Une balise à grain grossier et moins détaillée qui représente la classe Word du jeton

sur la base de l'ensemble de balises POS universel de Google. Pour l'anglais, une liste des balises dans l'ensemble de balises POS universelles peut être trouvée ici, avec des liens vers leurs définitions: http://universaldependencies.org/en/pos/index.html

La liste est la suivante:

Cependant, nous pouvons voir dans le module parties du discours de spaCy qu'il étend ce schéma avec trois constantes POS supplémentaires, EOL, NO_TAG Et SPACE, qui ne font pas partie de l'ensemble d'étiquettes POS universelles. Parmi ceux-ci:

  • De recherche dans le code source , je ne pense pas que EOL soit utilisé du tout, bien que je ne sois pas sûr
  • NO_TAG Est un code d'erreur. Si vous essayez d'analyser une phrase avec un modèle que vous n'avez pas installé, tous les Token sont affectés à ce POS. Par exemple, je n'ai pas installé le modèle allemand de spaCy, et je le vois sur mon local si j'essaie de l'utiliser:

    >>> 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 est utilisé pour tout espacement en plus des espaces normaux simples ASCII espaces (qui n'ont pas leur propre jeton):

    >>> 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)
    

Jetons de dépendance

Comme indiqué dans les documents, le schéma de balises de dépendance est basé sur le projet ClearNLP; la signification des balises (à partir de la version 3.2.0 de ClearNLP, publiée en 2015, qui reste la dernière version et semble être ce que spaCy utilise) peut être trouvée sur https://github.com/clir/ clearnlp-guidelines/blob/master/md/specifications/dependency_labels.md . Ce document répertorie ces jetons:

  • ACL: modificateur clausal du nom
  • ACOMP: complément adjectival
  • ADVCL: modificateur de clause publicitaire
  • ADVMOD: modificateur publicitaire
  • AGENT: Agent
  • AMOD: modificateur adjectival
  • APPOS: modificateur d'application
  • ATTR: attribut
  • AUX: Auxiliaire
  • AUXPASS: Auxiliaire (passif)
  • CASE: marqueur de casse
  • CC: Coordonner la conjonction
  • CCOMP: Complément Clausal
  • COMPOUND: modificateur composé
  • CONJ: Conjoint
  • CSUBJ: sujet clausal
  • CSUBJPASS: Sujet clausal (passif)
  • DATIVE: Datif
  • DEP: Dépendant non classé
  • DET: déterminant
  • DOBJ: Objet direct
  • EXPL: explicatif
  • INTJ: Interjection
  • MARK: marqueur
  • META: modificateur Meta
  • NEG: modificateur de négation
  • NOUNMOD: Modificateur de nominal
  • NPMOD: Phrase substantielle comme modificateur adverbial
  • NSUBJ: Sujet nominal
  • NSUBJPASS: Sujet nominal (passif)
  • NUMMOD: modificateur de nombre
  • OPRD: prédicat d'objet
  • PARATAXIS: parataxie
  • PCOMP: Complément de préposition
  • POBJ: objet de préposition
  • POSS: modificateur de possession
  • PRECONJ: Conjonction pré-corrélative
  • PREDET: prédéterminateur
  • PREP: modificateur prépositionnel
  • PRT: Particule
  • PUNCT: ponctuation
  • QUANTMOD: Modificateur de quantificateur
  • RELCL: modificateur de clause relative
  • ROOT: racine
  • XCOMP: Ouvrir le complément clausal

La documentation liée de ClearNLP contient également de brèves descriptions de la signification de chacun des termes ci-dessus.

En plus de la documentation ci-dessus, si vous souhaitez voir quelques exemples de ces dépendances dans de vraies phrases, vous pourriez être intéressé par le travail de 2012 de Jinho D. Choi: soit son Optimisation des composants de traitement du langage naturel pour la robustesse et l'évolutivité ou son ( Lignes directrices pour la conversion du Constituant de style CLEAR en dépendance (qui ne semble être qu'une sous-section de l'ancien article). Les deux répertorient toutes les étiquettes de dépendance CLEAR qui existaient en 2012, ainsi que les définitions et les exemples de phrases. (Malheureusement, l'ensemble des étiquettes de dépendance CLEAR a légèrement changé depuis 2012, donc certaines des étiquettes modernes ne sont pas répertoriées ou illustrées dans le travail de Choi - mais cela reste une ressource utile en dépit d'être légèrement dépassé.)

72
Mark Amery

Juste un petit conseil pour obtenir la signification détaillée des formulaires courts. Vous pouvez utiliser la méthode explain comme suit:

spacy.explain('pobj')

ce qui vous donnera une sortie comme:

'object of preposition'
16
Nuhil Mehdy

La documentation officielle fournit maintenant beaucoup plus de détails pour toutes ces annotations à https://spacy.io/api/annotation (et la liste des autres attributs pour les jetons peut être trouvée à https: //spacy.io/api/token ).

Comme le montre la documentation, leurs parties de discours (POS) et leurs balises de dépendance ont des variations à la fois universelles et spécifiques pour différentes langues et la fonction explain() est un raccourci très utile pour obtenir une meilleure description de la signification d'une balise sans la documentation, par exemple.

spacy.explain("VBD")

qui donne "verbe, passé".

2
Silveri

À l'heure actuelle, l'analyse et le balisage des dépendances dans SpaCy semblent être mis en œuvre uniquement au niveau Word, et non au niveau de la phrase (autre que la phrase nominale) ou de la clause. Cela signifie que SpaCy peut être utilisé pour identifier des choses comme les noms (NN, NNS), les adjectifs (JJ, JJR, JJS) et les verbes (VB, VBD, VBG, etc.), mais pas les phrases adjectives (ADJP), les phrases adverbiales ( ADVP), ou des questions (SBARQ, SQ).

Par exemple, lorsque vous utilisez SpaCy pour analyser la phrase "Dans quel sens va le bus?", Nous obtenons l'arborescence suivante.

En revanche, si vous utilisez l'analyseur Stanford, vous obtenez n arbre de syntaxe beaucoup plus profondément structuré.

2
rebeccabilbro