python - propn - ¿Qué significan las etiquetas de dependencia y de voz de spaCy?
spacy sentiment analysis (4)
Parte de tokens de habla
Los documentos de spaCy actualmente afirman:
El etiquetador de parte de discurso utiliza la versión OntoNotes 5 del conjunto de etiquetas Penn Treebank. También asignamos las etiquetas al conjunto de etiquetas de POS universal de Google más sencillo.
Más precisamente, la propiedad .tag_
expone las etiquetas pos_
, y la propiedad pos_
expone las etiquetas basadas en las etiquetas de POS universales de Google (aunque spaCy amplía la lista).
Los documentos de spaCy parecen recomendar que los usuarios que solo quieran usar sus resultados en lugar de entrenar a sus propios modelos, deberían ignorar el atributo tag_
y usar solo el pos_
, indicando que los atributos tag_
...
están diseñados principalmente para ser buenas características para los modelos posteriores, particularmente el analizador sintáctico. Son dependientes del lenguaje y del banco de arena.
Es decir, si spaCy lanza un modelo mejorado entrenado en un nuevo treebank , el atributo tag_
puede tener valores diferentes a los que tenía antes. Esto claramente hace que no sea útil para los usuarios que desean una API consistente en todas las actualizaciones de versión. Sin embargo, dado que las etiquetas actuales son una variante de Penn Treebank, es probable que se intersecten principalmente con el conjunto descrito en cualquier documentación de etiquetas POS de Penn Treebank, como esta: http://web.mit.edu/6.863/www/PennTreebankTags.html
Las etiquetas pos_
más útiles son
Una etiqueta de grano grueso y menos detallada que representa la clase de palabra del token
basado en el conjunto de etiquetas POS de Google Universal. Para inglés, se puede encontrar una lista de las etiquetas en el conjunto de etiquetas de POS universales aquí, completa con enlaces a sus definiciones: http://universaldependencies.org/en/pos/index.html
La lista es la siguiente:
-
ADJ
: adjetivo -
ADP
: adposition -
ADV
: adverbio -
AUX
: verbo auxiliar -
CONJ
: conjuncion coordinadora -
DET
: determinante -
INTJ
: interjección -
NOUN
: sustantivo -
NUM
: numeral -
PART
: partícula -
PRON
: pronombre -
PROPN
: nombre propio -
PUNCT
: puntuacion -
SCONJ
: conjunción subordinante -
SYM
: simbolo - Verbo: verbo
-
X
: otro
Sin embargo, podemos ver en el módulo de partes de voz de spaCy que extiende este esquema con tres constantes POS adicionales, EOL
, NO_TAG
y SPACE
, que no forman parte del conjunto de etiquetas POS universales. De estos:
- De buscar el código fuente , no creo que
EOL
se use en absoluto, aunque no estoy seguro NO_TAG
es un código de error. Si intenta analizar una oración con un modelo que no tiene instalado, a todos losToken
se les asigna este POS. Por ejemplo, no tengo instalado el modelo alemán de spaCy, y veo esto en mi local si intento usarlo:>>> 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
se utiliza para cualquier espacio aparte de los espacios ASCII normales individuales (que no obtienen su propio token):>>> 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)
Fichas de dependencia
Como se señala en los documentos, el esquema de etiqueta de dependencia se basa en el proyecto ClearNLP; Los significados de las etiquetas (a partir de la versión 3.2.0 de ClearNLP, lanzada en 2015, que sigue siendo la última versión y parece ser lo que utiliza spaCy) se pueden encontrar en https://github.com/clir/clearnlp-guidelines/blob/master/md/specifications/dependency_labels.md . Ese documento enumera estos tokens:
-
ACL
: modificador de Clausal del sustantivo -
ACOMP
: complemento de adjetivo -
ADVCL
: modificador de la cláusula adverbial -
ADVMOD
: modificador adverbial -
AGENT
: Agente -
AMOD
: modificador de adjetivo -
APPOS
: modificadorAPPOS
-
ATTR
: Atributo -
AUX
: Auxiliar -
AUXPASS
: Auxiliar (pasivo) -
CASE
: marcador de caso -
CC
: conjunción coordinadora -
CCOMP
: complemento de Clausal -
COMPOUND
: modificador compuesto -
CONJ
: Conjunción -
CSUBJ
: AsuntoCSUBJ
-
CSUBJPASS
: AsuntoCSUBJPASS
(pasivo) -
DATIVE
: Dativo -
DEP
: Dependiente sin clasificar -
DET
: determinante -
DOBJ
: Objeto directo -
EXPL
: Expletivo -
INTJ
: Interjección -
MARK
: Marcador -
META
: Meta modificador -
NEG
: modificador de negación -
NOUNMOD
: Modificador de nominal -
NPMOD
:NPMOD
frase como modificador adverbial -
NSUBJ
: sujeto nominal -
NSUBJPASS
:NSUBJPASS
nominal (pasivo) -
NUMMOD
: modificador de número -
OPRD
: predicado de objeto -
PARATAXIS
: Parataxis -
PCOMP
: Complemento de preposición -
POBJ
: Objeto de preposición. -
POSS
: modificador de posesión -
PRECONJ
: conjunción pre-correlativa -
PREDET
: Pre-determinante -
PREP
: modificador preposicional -
PRT
: Partícula -
PUNCT
: Puntuación -
QUANTMOD
: modificador de cuantificador -
RELCL
: modificador de la cláusula relativa -
ROOT
: Raíz -
XCOMP
:XCOMP
abierta
La documentación de ClearNLP vinculada también contiene descripciones breves de lo que significa cada uno de los términos anteriores.
Además de la documentación anterior, si desea ver algunos ejemplos de estas dependencias en oraciones reales, le puede interesar el trabajo de 2012 de Jinho D. Choi: su Optimización de componentes de procesamiento de lenguaje natural para su robustez y escalabilidad o sus Pautas para la Conversión de Dependencia del Componente de Estilo CLARO a la Dependencia (que parece ser solo una subsección del documento anterior). Ambos listan todas las etiquetas de dependencia CLEAR que existieron en 2012 junto con definiciones y oraciones de ejemplo. (Desafortunadamente, el conjunto de etiquetas de dependencia CLEAR ha cambiado un poco desde 2012, por lo que algunas de las etiquetas modernas no están listadas o ejemplificadas en el trabajo de Choi, pero sigue siendo un recurso útil a pesar de estar un poco desactualizado).
spaCy etiqueta cada uno de los Token
en un Document
con una parte del habla (en dos formatos diferentes, uno almacenado en las propiedades pos
y pos_
del Token
y el otro almacenado en las propiedades tag
y tag_
) y una dependencia sintáctica de su .head
token (almacenado en las propiedades dep
y dep_
).
Algunas de estas etiquetas se explican por sí mismas, incluso para alguien como yo sin conocimientos lingüísticos:
>>> 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''
Otros ... no son:
>>> document[1].tag_
''VBD''
>>> document[2].pos_
''DET''
>>> document[3].dep_
''dobj''
Peor aún, los documentos oficiales no contienen ni siquiera una lista de las etiquetas posibles para la mayoría de estas propiedades, ni el significado de ninguna de ellas. A veces mencionan el estándar de tokenización que usan, pero estas afirmaciones no son actualmente del todo precisas y además de eso, los estándares son difíciles de rastrear.
¿Cuáles son los valores posibles de las tag_
, pos_
y dep_
, y qué significan?
En la actualidad, el análisis y etiquetado de dependencias en SpaCy parece implementarse solo en el nivel de palabra, y no en la frase (aparte de la frase nominal) o en el nivel de cláusula. Esto significa que SpaCy puede usarse para identificar cosas como sustantivos (NN, NNS), adjetivos (JJ, JJR, JJS) y verbos (VB, VBD, VBG, etc.), pero no frases de adjetivos (ADJP), frases adverbiales ( ADVP), o preguntas (SBARQ, SQ).
Para ilustrar, cuando usa SpaCy para analizar la frase "¿Hacia dónde va el autobús?", Obtenemos el siguiente árbol.
Por el contrario, si utiliza el analizador de Stanford, obtendrá un árbol de sintaxis mucho más estructurado.
La documentación oficial ahora proporciona muchos más detalles para todas esas anotaciones en https://spacy.io/api/annotation (y la lista de otros atributos para tokens se puede encontrar en https://spacy.io/api/token ).
Como muestra la documentación, sus partes de voz (POS) y las etiquetas de dependencia tienen variaciones tanto universales como específicas para diferentes idiomas y la función explain()
es un atajo muy útil para obtener una mejor descripción del significado de una etiqueta sin la documentación. p.ej
spacy.explain("VBD")
que da "verbo, tiempo pasado".
Solo un consejo rápido sobre cómo obtener el significado detallado de las formas cortas. Puedes usar el método de explain
como sigue:
spacy.explain(''pobj'')
lo que le dará salida como:
''object of preposition''