Saltar a contenido

Estadísticas de complejidad léxica

ests.lexical_stats.LexicalStats

Descripción

Un módulo para calcular las estadísticas de complejidad léxica de un texto a la manera de TAALES - cuán raras son las palabras del texto en la lengua: la frecuencia media, el rango y la dispersión de los lemas según el diccionario de frecuencias de Google Books Ngram, las proporciones de palabras de las bandas de frecuencia top-1000, 2000, 5000 y 10000 según la lista integrada de los lemas más frecuentes, la sorpresa (surprisal) y la perplejidad según el modelo de unigramas del diccionario, la densidad léxica. A diferencia de las métricas de diversidad léxica, que comparan las palabras del texto entre sí, aquí las palabras se comparan con las frecuencias de la lengua.

Una palabra se busca por lemma_key, la clave con la que se construye el diccionario: el lema de simplemma de la palabra en minúsculas, y para un nombre propio la forma en minúsculas cuando el diccionario la tiene, así que París se encuentra como parís y no como el verbo parir. Un nombre propio cuya forma no tiene fila propia vuelve a su lema, como lo contó el diccionario: una forma que no va con mayúscula en el 90 % de sus apariciones fue a su lema, así que Estados de Estados Unidos se encuentra en estado y Nueva de Nueva York en nuevo (el atributo keys). Si una palabra es un nombre propio, y si es una palabra con contenido, sale de la anotación, así que la fuente tiene que estar anotada: una cadena se analiza con es_core_news_sm o con el pipeline pasado en nlp, y un Doc debe llevar las categorías gramaticales (un morphologizer, o un tagger con un attribute_ruler); una fuente sin ellas levanta SourceError. Los lemas del modelo no se usan. Un verbo con mayúscula al principio de una oración que el etiquetador llama PROPN tampoco tiene fila propia y se encuentra por su lema (Miró en mirar). Una palabra con contenido se define como en CohesionStats: una de CONTENT_UD_POS (sustantivos, nombres propios, adjetivos, verbos, adverbios) y no demostrativa. Los números (2020, 5,5, 3.º) no son palabras: el diccionario y la lista no los tienen, y parecerían las palabras más raras del texto.

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

Recursos:

Recurso Estadísticas Disponibilidad
FreqDict - 83 785 lemas de Google Books Ngram (1980-2019) con ipm, rango y dispersión coverage, mean_ipm*, mean_log_ipm*, mean_range, mean_dispersion, surprisal, perplexity se descarga una vez con FreqDict().download(); sin el diccionario, leer estas estadísticas y get_stats levanta DatasetNotFoundError
La lista integrada de los 10 000 lemas más frecuentes del mismo diccionario (ests/resources/google_books_top10000.txt, CC BY 3.0) p_top1000, p_top2000, p_top5000, p_top10000, p_beyond_top10000, band_coverage siempre

Parámetros

Parámetro Tipo Valor por defecto Descripción
source str/Doc - Fuente de datos (una cadena o un objeto Doc)
freq_dict FreqDict None Diccionario de frecuencias; si no se indica, se usa FreqDict() del directorio por defecto
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
lemmas tuple[str] Tupla de los lemas de las palabras por lemma_key, la forma en minúsculas para un nombre propio; las bandas se cuentan por ellos
keys tuple[str] Tupla de las claves de las palabras en el diccionario: el lema de un nombre propio cuya forma no está en él
ranks tuple[int/None] Tupla de los rangos de los lemas según la lista integrada, None fuera del top 10000
entries tuple[Entry/None] Tupla de las entradas del diccionario para cada palabra, None para una palabra fuera de él
n_words int Número de palabras
n_content_words int Número de palabras con contenido
n_found int Número de palabras encontradas en el diccionario
coverage float Proporción de palabras encontradas en el diccionario
mean_ipm float Frecuencia media de las palabras encontradas
mean_ipm_content float Frecuencia media de las palabras con contenido encontradas
mean_log_ipm float Media del logaritmo decimal de la frecuencia de las palabras encontradas
mean_log_ipm_content float Lo mismo sobre las palabras con contenido
mean_range float Rango medio de las palabras encontradas - años de 40
mean_dispersion float Dispersión D media de las palabras encontradas
surprisal float Sorpresa media de las palabras según el modelo de unigramas del diccionario, en bits
perplexity float Perplejidad de unigramas
p_top1000 float Proporción de palabras con un lema del top 1000
p_top2000 float Proporción de palabras con un lema del top 2000
p_top5000 float Proporción de palabras con un lema del top 5000
p_top10000 float Proporción de palabras con un lema del top 10000
p_beyond_top10000 float Proporción de palabras con un lema fuera del top 10000
lexical_density float Proporción de palabras con contenido

Las medias según el diccionario se calculan solo sobre las palabras encontradas, nan sin ellas; léalas junto a coverage. La frecuencia media en ipm la dominan las palabras funcionales (el - 98 000 ipm, de - 71 000), así que para comparar textos conviene más la frecuencia logarítmica o la media sobre las palabras con contenido. El rango es el número de años, de 40, en que el lema aparece en los libros, no el número de partes de un corpus de 100.

Nota

Cada estadística se puede calcular aparte llamando a su función. Las estadísticas y las funciones que las calculan se describen en la sección correspondiente.

Métodos

band_coverage

Devuelve las proporciones de palabras con un lema del top N para cada límite N. Un límite fuera de 1 y 10000 - el tamaño de la lista - levanta ParameterError.

Parámetro Tipo Valor por defecto Descripción
bands list[int] (1000, 2000, 5000, 10000) Límites de las bandas - los tamaños de las listas top
unique bool False Contar los lemas distintos en lugar de las palabras

Ejemplo

from ests import LexicalStats

ls = LexicalStats("El gato estaba en la ventana y miraba a los pájaros")
ls.band_coverage(unique=True)
# {1000: 0.6666666666666666, 2000: 0.7777777777777778, 5000: 1.0, 10000: 1.0}
ls.band_coverage(bands=(100, 500))
# {100: 0.6363636363636364, 500: 0.7272727272727273}

get_stats

Devuelve un diccionario con las estadísticas de complejidad léxica calculadas.

Ejemplo

Código:

# Importar las bibliotecas
from ests import LexicalStats
from ests.datasets import FreqDict

# Descargar el diccionario (una vez)
FreqDict().download()

# Calcular las estadísticas
ls = LexicalStats("El gato estaba en la ventana y miraba a los pájaros")
ls.get_stats()

Resultado:

{'coverage': 1.0,
 'mean_ipm': 34283.74818181818,
 'mean_ipm_content': 956.3320000000001,
 'mean_log_ipm': 3.559971676175293,
 'mean_log_ipm_content': 2.1916598821626314,
 'mean_range': 40.0,
 'mean_dispersion': 97.63636363636364,
 'surprisal': 8.105598641234213,
 'perplexity': 275.4408334528846,
 'p_top1000': 0.7272727272727273,
 'p_top2000': 0.8181818181818182,
 'p_top5000': 1.0,
 'p_top10000': 1.0,
 'p_beyond_top10000': 0.0,
 'lexical_density': 0.45454545454545453}

Las palabras raras suben la sorpresa y bajan la cobertura y las bandas:

Ejemplo

ls = LexicalStats("El felinólogo examinaba al minino con parsimonia")
ls.coverage, ls.p_top1000, ls.p_beyond_top10000, ls.surprisal
# (0.8571428571428571, 0.42857142857142855, 0.4285714285714286, 13.70650419215419)

Muestra una tabla con las estadísticas de complejidad léxica calculadas.

Ejemplo

Código:

# Crear el objeto de las estadísticas
ls = LexicalStats("El gato estaba en la ventana y miraba a los pájaros")

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

Resultado:

                        Statistic                         |  Value
--------------------------------------------------------------------
Share of words found in the frequency dictionary          |   1.00
Mean frequency (ipm)                                      | 34283.75
Mean frequency of content words (ipm)                     |  956.33
Mean log frequency (lg ipm)                               |   3.56
Mean log frequency of content words                       |   2.19
Mean range (years out of 40)                              |  40.00
Mean dispersion (D)                                       |  97.64
Mean surprisal (bits)                                     |   8.11
Unigram perplexity                                        |  275.44
Share of words in the top 1000                            |   0.73
Share of words in the top 2000                            |   0.82
Share of words in the top 5000                            |   1.00
Share of words in the top 10000                           |   1.00
Share of words beyond the top 10000                       |   0.00
Lexical density                                           |   0.45