Análisis de palabras¶
Un análisis es un objeto Analysis que devuelven los métodos analyze y analyze_many del analizador: el lema, la categoría gramatical y los rasgos de Universal Dependencies, la probabilidad, las palabras del token y la fuente del análisis. Los análisis son inmutables; se pueden comparar (la probabilidad no participa en la comparación, así que un análisis es igual a su forma de forms()), poner en conjuntos y serializar con pickle. Las formas de una palabra las dan los métodos forms e inflect - véase Flexión.
from esmorph import Analyzer
morph = Analyzer()
analysis = morph.analyze("cantaban")[0]
analysis.word, analysis.lemma, analysis.pos, analysis.feats, analysis.words, analysis.source
('cantaban',
'cantar',
'VERB',
{'Mood': 'Ind', 'Number': 'Plur', 'Person': '3', 'Tense': 'Imp', 'VerbForm': 'Fin'},
('cantaban',),
'dictionary')
Atributos¶
| Atributo | Tipo | Descripción |
|---|---|---|
word |
str |
La forma de palabra tal como la escribe el diccionario, con sus tildes; un verbo con clíticos tal como está escrito, en minúsculas; un token de las reglas tal como está escrito, sin caracteres invisibles, con las marcas combinantes unidas a sus letras y con - en lugar de los guiones U+2010 y U+2011 |
lemma |
str |
El lema |
pos |
str |
Categoría gramatical de UD: NOUN, VERB, ADJ, DET, ADP, etc. |
feats |
dict[str, str] |
Rasgos de UD: {"Gender": "Fem", "Number": "Plur"}; un diccionario nuevo cada vez, cambiarlo no cambia el análisis |
prob |
float |
Parte del análisis entre los análisis de la palabra; la suma de todos es 1 |
words |
tuple[str, ...] |
Palabras del token: un verbo y sus clíticos, las palabras de una contracción (del, al, la antigua desta) o la propia palabra; el análisis describe la primera |
source |
str |
De dónde viene el análisis: "dictionary" - la forma está en el diccionario, "clitics" - un verbo del diccionario con clíticos, "rule" - un análisis por regla, "guess" - un análisis estimado de una palabra desconocida |
Categorías y rasgos¶
Las categorías gramaticales, los rasgos y los lemas siguen las directrices de Universal Dependencies y, donde estas callan, las convenciones del mayor treebank del español, UD Spanish AnCora, así que el resultado se puede comparar con spaCy, Stanza y otras herramientas de UD:
- los determinantes, los pronombres, las preposiciones y las conjunciones tienen los lemas y los rasgos de AnCora:
laes el artículoel(Definite=Def,PronType=Art) o el pronombreél,seesélconReflex=Yes,suesDETconPoss=Yes,muyes una forma demucho, y lo mismo sus grafías antiguas y orales, como variantes:ustées una forma detú; un pronombre demostrativo con tilde (éste) es una variante del que no la lleva; ser,estar,haber,poder,deber,soler,quererysabertienen análisisAUXyVERB;hayes ante todo el verbohaber;- un participio es un verbo con el infinitivo como lema (
VerbForm=Part,Tense=Past) y un adjetivo con el masculino singular como lema (VerbForm=PartsinTense); - los verbos no llevan
-seen el lema:quejarseesquejarcon el clíticose; - el condicional y el imperativo no tienen
Tense; un nombre propio no tiene rasgos, y su lema lleva mayúscula:madridyMadridsonMadrid,PSOEsigue siendoPSOE; - un adjetivo en
-ísimoes su propio lema conDegree=Abs.
Si la categoría de una palabra depende del contexto, la palabra tiene ambos análisis: que es PRON y SCONJ, la es DET y PRON, un participio es VERB y ADJ. Rasgos: género, número, persona, tiempo, modo, forma verbal, grado, negación (Polarity=Neg de no), definitud (Definite), el tipo de pronombre o de determinante (PronType), la posesión (Poss), la reflexividad (Reflex), el caso de los pronombres personales (Case) y si van tras una preposición (PrepCase), la cortesía (Polite=Form de usted), el tipo de numeral (NumType) y cómo se escribe (NumForm), y la clase de un signo de puntuación (PunctType, PunctSide).
Orden de los análisis¶
Los análisis van del más probable al menos probable. prob es la parte de un análisis entre los análisis de la palabra, según la frecuencia con que lo tienen los treebanks UD Spanish AnCora y GSD; para una palabra que no han visto, las partes son iguales y el orden se estima por la terminación de la palabra y los rasgos más comunes, y una palabra va antes que su grafía antigua con otras tildes: á es ante todo a, tambien es también.
[(a.lemma, a.pos, round(a.prob, 2)) for a in morph.analyze("casa")][:2]
[('casa', 'NOUN', 0.99), ('casar', 'VERB', 0.01)]
Palabras con clíticos¶
Un verbo con pronombres enclíticos se analiza como su verbo: el análisis describe el infinitivo, el gerundio o el imperativo, y words da las palabras del token, como las tiene Universal Dependencies. En la escritura antigua y literaria una forma personal también lleva enclíticos, si la tilde del token la marca: díjole es dijo + le. del y al también tienen sus dos palabras, como las contracciones de de con un pronombre o un demostrativo en la escritura antigua: desta es de + esta. Una palabra del diccionario no se divide: comete es una forma de cometer, aunque unas pocas suelen ser verbos con clíticos: verse es ante todo ver + se.
[(a.lemma, a.pos, a.words, a.source) for a in morph.analyze("dámelo")]
[('dar', 'VERB', ('da', 'me', 'lo'), 'clitics')]
Ortografía¶
Las mayúsculas no importan para buscar una palabra en el diccionario, aunque un token con mayúscula también puede ser un nombre. Una palabra escrita como en el diccionario da los análisis de esa grafía: publico no es público. Una palabra que no está tal como se escribe puede ser un verbo con clíticos (verte es ver + te, no verté); si no lo es, se busca sin sus tildes y con la diéresis perdida, y word muestra la grafía del diccionario; para un verbo con clíticos word es el token tal como se escribe, en minúsculas.
[morph.analyze(word)[0].word for word in ["CAMIÓN", "camion", "pinguino"]]
['camión', 'camión', 'pingüino']
Tokens fuera del diccionario¶
Un token que el diccionario no tiene recibe los análisis de unas reglas, con source igual a "rule" y word tal como está escrito:
- un signo de puntuación es
PUNCTcon elPunctTypede sus signos si son de una misma clase, yPunctSidepara los paréntesis, los corchetes, las llaves y los signos de interrogación y de exclamación; un símbolo como%,€o²esSYM; - un número en cifras es
NUMconNumForm=Digit|NumType=Card, también un año, también con signo, fracción, potencia o espacios entre los millares (-5,37½,10²,10 000); el lema quita los puntos entre los millares (10.000es10000) y una unidad tras el número (500cces500); - un número ordinal en cifras es
ADJconNumForm=Digit|NumType=Ord, su género y su número, y el masculino singular como lema:2.ªes2.º; - un número romano es
NUMconNumForm=Roman, con menos frecuencia un nombre; en minúsculas es solo un numeral:xii; - un token con una letra mayúscula es un nombre,
PROPN, con él mismo como lema:Josep,CiU,W.,TV-3; - un enlace, un correo, una etiqueta o una mención en minúsculas es
SYM:www.aeat.es,#hola; - una abreviatura con punto en minúsculas que el diccionario no tiene es un sustantivo con ella misma como lema (
fig.), y lo mismo una letra minúscula (b).
Una abreviatura con punto en minúsculas que el diccionario tiene sin el punto recibe los sustantivos y los símbolos de esa palabra, con source igual a "dictionary": kg. es kg. Una palabra del diccionario de otra categoría con un punto no recibe análisis: come. es un verbo con el punto de una oración.
Una palabra con mayúscula que el diccionario conoce también puede ser un nombre, con su parte. Una inicial (D.) y una palabra sin tildes que el diccionario solo tiene con ellas (Angel, Perez) suelen ser nombres, así que su nombre va primero, mientras que otra palabra con mayúscula es un nombre con menos frecuencia (Estados, Comisión), así que su nombre suele ir después de los análisis del diccionario. De las palabras en mayúsculas, una palabra de hasta cuatro letras suele ser una sigla (ETA, PP), así que su nombre suele ir primero, mientras que una palabra más larga y una palabra funcional - una preposición, un determinante, un pronombre, una conjunción, un auxiliar - suelen ser palabras de un titular (CAMIONES, EL), así que su nombre suele ir después de los análisis del diccionario. Un número romano que el diccionario conoce como palabra, como VI, XI o X, es ante todo un numeral. Un token con mayúscula que se divide en un verbo con clíticos también puede ser un nombre: un imperativo sin tilde suele serlo (Mandela es ante todo PROPN), mientras que un infinitivo, un gerundio, un imperativo con tilde y una forma personal suelen ser verbos (Hacerlo, Déjame, Levantóse). Una palabra en minúsculas rara vez es un nombre: miró es ante todo mirar, Miró es un nombre. Un análisis de una regla no tiene otras formas: forms() da el propio análisis. is_known solo indica las palabras del diccionario.
[(a.lemma, a.pos, a.feats, a.source) for a in morph.analyze("10.000")]
[(a.lemma, a.pos, round(a.prob, 2)) for a in morph.analyze("ETA")]
[('10000', 'NUM', {'NumForm': 'Digit', 'NumType': 'Card'}, 'rule')]
[('ETA', 'PROPN', 0.82), ('eta', 'NOUN', 0.18)]
Palabras desconocidas¶
Una palabra en minúsculas que ni el diccionario ni las reglas conocen recibe análisis estimados, con source igual a "guess":
- una palabra con guion se analiza por su última parte de una clase abierta o un numeral:
palestino-israelíeses una forma depalestino-israelí; - una palabra con un prefijo conocido se analiza por la palabra del diccionario sin él, de cuatro letras al menos tras un prefijo de tres:
supergalloses una forma desupergallo,sobreandandesobreandar; - un verbo con clíticos se analiza por su gerundio estimado, o por su infinitivo estimado ante
seo un clítico de tercera persona:autogenerarseesautogenerar+se; - cualquier otra palabra se analiza por las palabras del diccionario con la misma terminación de hasta cinco letras: sus categorías, rasgos y flexión, según cuántas palabras los tienen y con qué frecuencia AnCora train tiene sus rasgos; una palabra en
-ísimoes un adjetivo deDegree=Abs:esbeltísimaes una forma deesbeltísimo.
Una palabra estimada tiene sus formas, también estimadas: forms() e inflect() funcionan como con una palabra del diccionario. is_known sigue siendo falso para ella.
[(a.lemma, a.pos, round(a.prob, 2)) for a in morph.analyze("zumbeábamos")]
morph.analyze("zumbeábamos")[0].inflect(Tense="Pres", Person="1", Number="Sing")
[('zumbear', 'VERB', 0.9), ('zumbeábar', 'VERB', 0.09), ('zumbeábar', 'VERB', 0.01)]
'zumbeo'