Saltar a contenido

Estadísticas morfológicas

ests.morph_stats.MorphStats

Descripción

Módulo para calcular las estadísticas morfológicas de un texto. La fuente de datos puede ser un texto o un objeto Doc de la biblioteca spaCy.

Las categorías gramaticales y los rasgos morfológicos se dan en los términos de Universal Dependencies, tal como los anotan los modelos españoles de spaCy. Un texto se analiza con es_core_news_sm o con el pipeline indicado en nlp, sin el reconocedor de entidades, que aquí no se lee; un Doc se toma tal cual y debe llevar las categorías gramaticales, que vienen de un morphologizer (o de un tagger con un attribute_ruler), y los lemas, que vienen de un lemmatizer: un Doc de spacy.blank("es") o de un pipeline con el lemmatizer excluido no es una fuente válida y levanta SourceError. Las palabras se toman de los tokens y los signos de puntuación y los símbolos se descartan.

Un texto más largo que el max_length del pipeline - un millón de caracteres por defecto, una novela larga - levanta SourceError en lugar de llegar a spaCy: divídalo en partes o suba max_length en un pipeline propio y páselo en nlp.

Nota

Las estadísticas se calculan al inicializar el objeto MorphStats.

Parámetros

Parámetro Tipo Por defecto Descripción
source str/Doc - Fuente de datos (cadena u objeto Doc)
nlp Language None Pipeline de spaCy que analiza una cadena; sin él se carga el modelo es_core_news_sm

Atributos

Atributo Tipo Descripción
words tuple[str] Tupla de las palabras extraídas
lemmas tuple[str] Tupla de los lemas de las palabras
tags tuple[str] Tupla de las cadenas de rasgos en formato CoNLL-U
pos tuple[str] Tupla de las categorías gramaticales
case tuple[str] Tupla de los valores del caso
definite tuple[str] Tupla de los valores de la definitud
degree tuple[str] Tupla de los valores del grado
gender tuple[str] Tupla de los valores del género
mood tuple[str] Tupla de los valores del modo
num_type tuple[str] Tupla de los valores del tipo de numeral
number tuple[str] Tupla de los valores del número
person tuple[str] Tupla de los valores de la persona
polarity tuple[str] Tupla de los valores de la polaridad
polite tuple[str] Tupla de los valores de la cortesía
poss tuple[str] Tupla de los valores del posesivo
pron_type tuple[str] Tupla de los valores del tipo de pronombre
reflex tuple[str] Tupla de los valores del reflexivo
tense tuple[str] Tupla de los valores del tiempo verbal
verb_form tuple[str] Tupla de los valores de la forma verbal

Cada atributo tiene la longitud de words, y una palabra a la que el modelo no da ningún valor del rasgo lleva None. Los nombres de los atributos son los nombres de las estadísticas que aceptan los métodos; tags y lemmas no son estadísticas.

Nota

Un rasgo con varios valores conserva la forma de CoNLL-U: el interrogativo y relativo qué, quién, cuál, que los modelos no desambiguan, tiene pron_type igual a Int,Rel, y usted tiene case igual a Acc,Nom. print_stats describe un valor así con las descripciones de sus partes: «Interrogative or relative», «Accusative or nominative».

Rasgos

Las estadísticas cuentan los quince rasgos de la tabla siguiente; el valor Unknown de las tablas impresas y None de los atributos significan que el modelo no dio a la palabra ningún valor del rasgo.

Son un subconjunto: los modelos españoles anotan 23 rasgos, y los que quedan fuera son marginales (AdvType, Foreign, NumForm, Number[psor], PrepCase, Typo) o viven en la puntuación (PunctSide, PunctType), que este módulo no trata como palabras. Todo lo que el modelo anota queda en tags, se cuente o no.

Estadística Rasgo Valores
pos Categoría gramatical NOUN, PROPN, ADJ, ADV, VERB, AUX, PRON, DET, NUM, ADP, CCONJ, SCONJ, PART, INTJ, SYM, X
case Caso Nom, Acc, Dat, Com
definite Definitud Def, Ind
degree Grado Cmp, Sup, Abs
gender Género Masc, Fem
mood Modo Ind, Sub, Imp, Cnd
num_type Tipo de numeral Card, Ord, Frac
number Número Sing, Plur
person Persona 1, 2, 3
polarity Polaridad Neg
polite Cortesía Form
poss Posesivo Yes
pron_type Tipo de pronombre Art, Prs, Dem, Ind, Int, Rel, Neg, Tot, Exc
reflex Reflexivo Yes
tense Tiempo verbal Pres, Past, Imp, Fut
verb_form Forma verbal Fin, Inf, Part, Ger

Advertencia

Las estadísticas valen lo que vale la anotación del modelo. es_core_news_sm analiza mal los verbos con pronombres enclíticos: dámelo, decírselo, vámonos, cuéntamelo salen como sustantivos o nombres propios y reciben lemas inventados (dámelir, siéntatir). El imperativo es el que más lo sufre: los modelos llevan el valor Mood=Imp en su juego de etiquetas - 21 de las 433 del morfologizador -, pero en la práctica etiquetan los imperativos de como indicativo, y Habla más despacio, Abre la ventana y Ven aquí reciben todos Mood=Ind. Sobre 24 oraciones imperativas de , vosotros y usted, con enclíticos y sin ellos, es_core_news_sm encontró el imperativo dos veces, es_core_news_md tres y es_core_news_lg cuatro, de modo que p_imperative se queda corto y p_indicative absorbe las órdenes.

Indicar un modelo mayor en nlp no lo cambia. Medidos frente a es_core_news_sm, tanto es_core_news_md (54 MB) como es_core_news_lg (631 MB) coinciden con él en todas las categorías gramaticales de la prosa moderna y corren a la misma velocidad: los vectores que añaden pesan en memoria, no en el etiquetador. Lo que aportan es el vocabulario raro y antiguo: en el comienzo del Quijote leen rocín, salpicón, lentejas y carnero como sustantivos, donde el modelo pequeño ve verbos y adjetivos. Con los enclíticos cambian una mejora por un empeoramiento: Dime pasa a ser verbo mientras Cantándole deja de ser gerundio.

Métodos

get_stats

Devuelve un diccionario con las estadísticas morfológicas calculadas: para cada estadística, cuántas palabras llevan cada uno de sus valores.

Parámetros:

Parámetro Tipo Por defecto Descripción
args tuple[str] - Nombres de las estadísticas seleccionadas, por defecto todas
filter_none bool False Filtrar los valores vacíos

Ejemplo

Código:

# Importar la biblioteca
from ests import MorphStats

# Preparar los datos
text = "Si tuviera tiempo, leería el libro que me recomendaste ayer"

# Calcular las estadísticas
ms = MorphStats(text)
ms.get_stats("pos", "mood", "tense", filter_none=True)

Resultado:

{'pos': {'SCONJ': 1, 'VERB': 3, 'NOUN': 2, 'DET': 1, 'PRON': 2, 'ADV': 1},
'mood': {'Sub': 1, 'Cnd': 1, 'Ind': 1},
'tense': {'Imp': 1, 'Pres': 1}}

get_markers

Devuelve un diccionario con los marcadores del español calculados a partir de los rasgos. Cada marcador es una proporción sobre su propia base, de modo que los marcadores de textos de distinta longitud pueden compararse directamente:

Marcador Descripción
p_indicative Indicativo entre las formas personales
p_subjunctive Subjuntivo entre las formas personales
p_conditional Condicional entre las formas personales
p_imperative Imperativo entre las formas personales
p_infinitive Infinitivo entre las formas verbales
p_gerund Gerundio entre las formas verbales
p_participle Participio entre las formas verbales
p_ser ser entre las cópulas ser y estar
p_mente_adverbs Adverbios en -mente entre los adverbios

Los cuatro primeros marcadores comparten la base de las formas personales y suman uno siempre que el modelo no deje ninguna forma personal sin modo: cinco de sus 433 etiquetas llevan VerbForm=Fin y ningún Mood, y cada forma así falta en las cuatro proporciones. Los tres siguientes comparten la base de todas las formas verbales, contadas sobre verbos y auxiliares, de modo que los participios que el modelo anota como adjetivos (la casa pintada) quedan fuera de la base, mientras que los de los tiempos compuestos y la pasiva (he leído, fue escrito) quedan dentro.

La base de p_ser son solo los usos copulativos, leídos de la dependencia del token y de aquello de lo que depende: fue escrito y está cantando son los auxiliares de la pasiva y de la perífrasis progresiva, y también lo es el es de es financiado, que en presente los modelos etiquetan como cópula - ninguno de los tres es una elección entre las dos cópulas, mientras que es alta, está cansada y lo importante es que vengas sí lo son. El análisis sintáctico es lo que los distingue, así que para un Doc que no lo lleva el marcador es nan.

Un marcador cuya base está vacía - un texto sin verbos, sin cópula, sin adverbios - es nan.

Nota

El subjuntivo, la elección entre ser y estar y los adverbios en -mente son los rasgos del español que las fórmulas de legibilidad no ven: el subjuntivo marca la hipótesis y la subordinación, estar un estado frente a la propiedad de ser, y los adverbios en -mente un registro formal y escrito.

Ejemplo

Código:

...

# Calcular los marcadores
ms.get_markers()

Resultado:

{'p_indicative': 0.3333333333333333,
'p_subjunctive': 0.3333333333333333,
'p_conditional': 0.3333333333333333,
'p_imperative': 0.0,
'p_infinitive': 0.0,
'p_gerund': 0.0,
'p_participle': 0.0,
'p_ser': nan,
'p_mente_adverbs': 0.0}

explain_text

Devuelve una tupla de las palabras del texto con los valores de las estadísticas seleccionadas.

Parámetros:

Parámetro Tipo Por defecto Descripción
args tuple[str] - Nombres de las estadísticas seleccionadas, por defecto todas
filter_none bool False Filtrar los valores vacíos

Ejemplo

Código:

...

# Analizar el texto
ms.explain_text("pos", "mood", "tense", filter_none=True)

Resultado:

(('Si', {'pos': 'SCONJ'}),
('tuviera', {'pos': 'VERB', 'mood': 'Sub', 'tense': 'Imp'}),
('tiempo', {'pos': 'NOUN'}),
('leería', {'pos': 'VERB', 'mood': 'Cnd'}),
('el', {'pos': 'DET'}),
('libro', {'pos': 'NOUN'}),
('que', {'pos': 'PRON'}),
('me', {'pos': 'PRON'}),
('recomendaste', {'pos': 'VERB', 'mood': 'Ind', 'tense': 'Pres'}),
('ayer', {'pos': 'ADV'}))

Muestra una tabla de los valores de cada estadística seleccionada, del más frecuente al menos frecuente.

Parámetros:

Parámetro Tipo Por defecto Descripción
args tuple[str] - Nombres de las estadísticas seleccionadas, por defecto todas
filter_none bool False Filtrar los valores vacíos

Ejemplo

Código:

...

# Mostrar la tabla de las estadísticas calculadas
ms.print_stats("pos", "mood")

Resultado:

-------------Part of speech-------------
Verb                          |    3
Noun                          |    2
Pronoun                       |    2
Subordinating conjunction     |    1
Determiner                    |    1
Adverb                        |    1

------------------Mood------------------
Unknown                       |    7
Subjunctive                   |    1
Conditional                   |    1
Indicative                    |    1

Muestra una tabla con los marcadores del español calculados.

Ejemplo

Código:

...

# Mostrar la tabla de los marcadores calculados
ms.print_markers()

Resultado:

                     Marker                    |   Value
-----------------------------------------------------------
Indicative among the finite forms              |   0.33
Subjunctive among the finite forms             |   0.33
Conditional among the finite forms             |   0.33
Imperative among the finite forms              |   0.00
Infinitive among the verb forms                |   0.00
Gerund among the verb forms                    |   0.00
Participle among the verb forms                |   0.00
ser among the copulas ser and estar            |    nan
Adverbs in -mente among the adverbs            |   0.00