Saltar a contenido

Estadísticas básicas

ests.basic_stats.BasicStats

Descripción

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

El módulo permite usar objetos SentsExtractor y WordsExtractor ya configurados para la segmentación en oraciones y palabras que precede al cálculo. Las sílabas se cuentan con count_syllables y las letras con str.isalpha, así que las cifras, los guiones y los signos dentro de una palabra no son letras, mientras que los indicadores ordinales º y ª sí lo son (3.º es una palabra de una letra).

Una oración de pura puntuación (¿?, una línea de puntos entre dos párrafos) no lleva ninguna palabra y no se cuenta: las fórmulas de legibilidad dividen por el número de oraciones.

Para un objeto Doc las palabras se toman de los tokens (los signos de puntuación y los símbolos como o % se descartan) y las oraciones de la anotación; sin límites de oración (spacy.blank, un pipeline sin parser ni senter) las oraciones se extraen del texto con SentsExtractor. Un extractor indicado explícitamente se usa siempre, sobre el texto del Doc, de modo que el filtro de palabras vacías o un tokenizador propio funcionan igual con las dos clases de fuente.

Nota

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

Parámetros

Parámetro Tipo Por defecto Descripción
source str/Doc - Fuente de datos (cadena u objeto Doc)
sents_extractor SentsExtractor None Herramienta de extracción de oraciones; se usa también con un Doc, sobre su texto
words_extractor WordsExtractor None Herramienta de extracción de palabras; se usa también con un Doc, sobre su texto
normalize bool False Calcular las estadísticas normalizadas
complex_syl_factor int 3 Número mínimo de sílabas de una palabra compleja
long_word_letter_factor int 7 Número mínimo de letras de una palabra larga

Nota

Los umbrales por defecto siguen la tradición española de la legibilidad: una palabra compleja tiene tres o más sílabas, como en las adaptaciones españolas de SMOG y de la niebla de Gunning, y una palabra larga siete o más letras, como en LIX y RIX.

Atributos

Atributo Tipo Descripción
c_letters dict[int, int] Distribución de las palabras por número de letras
c_syllables dict[int, int] Distribución de las palabras por número de sílabas
n_sents int Número de oraciones con palabras
n_words int Número de palabras
n_unique_words int Número de palabras únicas
n_long_words int Número de palabras largas
n_complex_words int Número de palabras complejas
n_simple_words int Número de palabras simples
n_monosyllable_words int Número de palabras monosílabas
n_polysyllable_words int Número de palabras polisílabas
n_chars int Número de caracteres
n_letters int Número de letras
n_spaces int Número de espacios
n_syllables int Número de sílabas
n_punctuations int Número de signos de puntuación
c_punctuations dict[str, int] Distribución de los signos de puntuación por tipo
p_unique_words float Número normalizado de palabras únicas
p_long_words float Número normalizado de palabras largas
p_complex_words float Número normalizado de palabras complejas
p_simple_words float Número normalizado de palabras simples
p_monosyllable_words float Número normalizado de palabras monosílabas
p_polysyllable_words float Número normalizado de palabras polisílabas
p_letters float Número normalizado de letras
p_spaces float Número normalizado de espacios
p_punctuations float Número normalizado de signos de puntuación

Aviso

Los atributos de estadísticas normalizadas p_* solo existen cuando el objeto se inicializa con normalize=True.

Métodos

count_words_by_syllables

Devuelve el número de palabras con al menos el número de sílabas indicado.

Parámetros:

Parámetro Tipo Por defecto Descripción
min_syllables int - Número mínimo de sílabas de la palabra

count_words_by_letters

Devuelve el número de palabras con al menos el número de letras indicado.

Parámetros:

Parámetro Tipo Por defecto Descripción
min_letters int - Número mínimo de letras de la palabra

Nota

Estos métodos vuelven a contar las palabras complejas y largas con un umbral distinto del fijado al inicializar, que es lo que necesitan las fórmulas de legibilidad con umbrales propios.

get_stats

Devuelve un diccionario con las estadísticas calculadas del texto.

Ejemplo de cálculo de las estadísticas básicas con normalización:

Ejemplo

Código:

# Importar la biblioteca
from ests import BasicStats

# Preparar los datos
text = "Hay tres clases de mentiras: mentiras, malditas mentiras y estadísticas"

# Calcular las estadísticas
bs = BasicStats(text, normalize=True)
bs.get_stats()

Resultado:

{'c_letters': {1: 1, 2: 1, 3: 1, 4: 1, 6: 1, 8: 4, 12: 1},
 'c_syllables': {1: 4, 2: 1, 3: 4, 5: 1},
 'n_sents': 1,
 'n_words': 10,
 'n_unique_words': 8,
 'n_long_words': 5,
 'n_complex_words': 5,
 'n_simple_words': 5,
 'n_monosyllable_words': 4,
 'n_polysyllable_words': 6,
 'n_chars': 71,
 'n_letters': 60,
 'n_spaces': 9,
 'n_syllables': 23,
 'n_punctuations': 2,
 'c_punctuations': {'comma': 1, 'period': 0, 'question': 0, 'exclamation': 0, 'ellipsis': 0, 'colon': 1, 'semicolon': 0, 'dash': 0, 'hyphen': 0, 'angle_quotes': 0, 'straight_quotes': 0, 'parentheses': 0, 'other': 0},
 'p_unique_words': 0.8,
 'p_long_words': 0.5,
 'p_complex_words': 0.5,
 'p_simple_words': 0.5,
 'p_monosyllable_words': 0.4,
 'p_polysyllable_words': 0.6,
 'p_letters': 0.8450704225352113,
 'p_spaces': 0.1267605633802817,
 'p_punctuations': 0.028169014084507043}

Muestra una tabla con las estadísticas calculadas del texto.

Para ilustrar el método reutilizamos el código del ejemplo anterior:

Ejemplo

Código:

...

# Mostrar la tabla de estadísticas calculadas
bs.print_stats()

Resultado:

     Statistic      |  Value
------------------------------
Sentences           |    1
Words               |    10
Unique words        |    8
Long words          |    5
Complex words       |    5
Simple words        |    5
Monosyllabic words  |    4
Polysyllabic words  |    6
Characters          |    71
Letters             |    60
Spaces              |    9
Syllables           |    23
Punctuation marks   |    2

Aviso

El método no muestra los atributos de estadísticas normalizadas p_*.

Perfil de puntuación

ests.basic_stats.count_punctuations(), ests.basic_stats.punctuation_profile()

count_punctuations(text) cuenta los signos de puntuación por los tipos de PUNCTUATION_TYPES, la misma distribución que guarda el atributo c_punctuations: comas, puntos, signos de interrogación y de exclamación (incluidos los de apertura ¿ y ¡, así que ¿Qué? lleva dos signos de interrogación), puntos suspensivos (el carácter , tres o más puntos, o dos puntos tras ? y !: un solo signo cuyos puntos no cuentan como puntos, ¿Quién?.. es una interrogación y unos puntos suspensivos), dos puntos, puntos y comas, rayas ( y , y también un guion tras espacio o al principio de línea, o ante un espacio, como se escribe la raya en los corpus de texto plano: -Hola -dijo Juan, - Se fueron - dijo), guiones dentro de palabras, ante cifras y al final de línea dentro de una palabra (teórico-práctico, 1990-1995, -5, pala- en un salto de línea), comillas latinas «», comillas rectas, inglesas y simples "“”‘’ de los tres niveles de la ortografía, paréntesis y los demás signos: cualquier otro carácter de PUNCTUATIONS o de las categorías Unicode P y S (‹›, §, , °), el mismo conjunto que is_punctuation descarta de las palabras, de modo que ningún signo se pierde entre las palabras y los tipos. punctuation_profile(text, n_words=None) los convierte en frecuencias por cada 1000 palabras y añade inverted_share, la proporción de signos de apertura entre todos los signos de interrogación y exclamación: 0.5 cuando toda pregunta y exclamación empieza con ¿ o ¡ como exige la ortografía, menos cuando quien escribe los omite, como en textos informales y mensajes.

El perfil es un rasgo editorial y estilométrico. Depende del formato del texto (comillas y rayas tipográficas, signos de apertura) y es fácil de falsear, así que conviene leerlo aparte de los rasgos lingüísticos.

Ejemplo

from ests.basic_stats import count_punctuations, punctuation_profile

text = "El gato — «fiera»... El perro, claro, - amigo; y alguien (el que vive) — ¡no!"
{kind: count for kind, count in count_punctuations(text).items() if count}
# {'comma': 2, 'exclamation': 2, 'ellipsis': 1, 'semicolon': 1, 'dash': 3, 'angle_quotes': 2, 'parentheses': 2}

round(punctuation_profile(text)["dash"], 1), punctuation_profile(text)["inverted_share"]
# (230.8, 0.5)