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?
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:
ADJ
: adjectifADP
: adpositionADV
: adverbeAUX
: verbe auxiliaireCONJ
: coordination conjonctionDET
: déterminantINTJ
: interjectionNOUN
: nomNUM
: chiffrePART
: particulePRON
: pronomPROPN
: nom proprePUNCT
: ponctuationSCONJ
: conjonction subordonnéeSYM
: symboleVERB
: verbeX
: autreCependant, 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:
EOL
soit utilisé du tout, bien que je ne sois pas sûrNO_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)
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 nomACOMP
: complément adjectivalADVCL
: modificateur de clause publicitaireADVMOD
: modificateur publicitaireAGENT
: AgentAMOD
: modificateur adjectivalAPPOS
: modificateur d'applicationATTR
: attributAUX
: AuxiliaireAUXPASS
: Auxiliaire (passif)CASE
: marqueur de casseCC
: Coordonner la conjonctionCCOMP
: Complément ClausalCOMPOUND
: modificateur composéCONJ
: ConjointCSUBJ
: sujet clausalCSUBJPASS
: Sujet clausal (passif)DATIVE
: DatifDEP
: Dépendant non classéDET
: déterminantDOBJ
: Objet directEXPL
: explicatifINTJ
: InterjectionMARK
: marqueurMETA
: modificateur MetaNEG
: modificateur de négationNOUNMOD
: Modificateur de nominalNPMOD
: Phrase substantielle comme modificateur adverbialNSUBJ
: Sujet nominalNSUBJPASS
: Sujet nominal (passif)NUMMOD
: modificateur de nombreOPRD
: prédicat d'objetPARATAXIS
: parataxiePCOMP
: Complément de prépositionPOBJ
: objet de prépositionPOSS
: modificateur de possessionPRECONJ
: Conjonction pré-corrélativePREDET
: prédéterminateurPREP
: modificateur prépositionnelPRT
: ParticulePUNCT
: ponctuationQUANTMOD
: Modificateur de quantificateurRELCL
: modificateur de clause relativeROOT
: racineXCOMP
: Ouvrir le complément clausalLa 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é.)
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'
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é".
À 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é.