Files
fn_registry/python/functions/datascience/compute_text_readability.md
T
egutierrez 105e56cf05 feat(eda): capítulo text_distr (TEXTO/NLP) — primer capítulo de datos no tabulares
Añade el capítulo `text_distr` al motor AutomaticEDA: perfila columnas de texto
libre largo (reseñas, descripciones, comentarios) que la distribución categórica
no resume bien. Sigue el patrón de cat_distr/num_distr (build_text_distr(profile,
ctx) -> Chapter | None) y se registra en CHAPTER_ORDER tras cat_distr.

Activación en dos fases: gate barato desde el perfil (columna no numérica con
len_mean >= 50 chars) + confirmación con muestra cruda (mediana de palabras >= 20).
Un dataset sin texto largo (p.ej. titanic) devuelve None sin tocar el informe.

Bloques por columna (Group con page_break): resumen (longitudes, vocabulario con
TTR y % hapax, idioma dominante, % duplicados, legibilidad), histograma de
longitudes, top términos (tabla + barras), bigramas/trigramas, idiomas detectados
y nube de palabras opcional. Términos ttr/hapax enganchados al glosario clicable.

Lógica delegada a 7 funciones nuevas del registry (datascience, tag eda),
estilo dict-no-throw:
- extract_text_sample (impura, push-down SQL DuckDB/Postgres)
- compute_text_length_stats, compute_vocabulary_stats, compute_top_ngrams (puras, stdlib)
- detect_corpus_language (langdetect opcional), compute_text_readability (textstat
  opcional), compute_text_duplicates (hash + datasketch opcional)

Versión barata sin modelos pesados: las piezas que dependen de una librería
opcional (langdetect, textstat, wordcloud, datasketch) degradan a omitidas sin
lanzar. Añade langdetect y textstat (ligeras) al pyproject + uv.lock.

Verificado: golden sobre dataset de reviews multi-idioma (capítulo presente en
PDF+PPTX+MD con métricas reales), titanic sin capítulo (None), degradación sin
libs, suite automatic_eda + pipeline verde (128 passed), fn index OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 20:38:17 +02:00

4.7 KiB
Raw Blame History

id, name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, example, tested, tests, test_file_path, file_path, params, output
id name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports example tested tests test_file_path file_path params output
compute_text_readability_py_datascience compute_text_readability function py datascience 1.0.0 pure def compute_text_readability(texts, sample_max=500) -> dict Calcula la legibilidad Flesch Reading Ease de un corpus de texto usando textstat con import perezoso y degradación. Filtra None/no-str/vacíos, muestrea hasta sample_max documentos (los primeros) y agrega los scores Flesch en {mean, p50, min, max}. Si textstat no está instalada devuelve available=False sin lanzar. Estilo dict-no-throw del grupo eda — nunca lanza.
eda
datascience
text
nlp
readability
flesch
textstat
pure
python
false
math
textstat
from datascience.compute_text_readability import compute_text_readability out = compute_text_readability(["The cat sat on the mat. It was warm and sunny."]) # {"available": True, "n_scored": 1, "flesch": {"mean": 109.0, "p50": 109.0, "min": 108.96..., "max": 108.96...}} true
test_prosa_ingles
test_vacio
test_degradacion
python/functions/datascience/compute_text_readability_test.py python/functions/datascience/compute_text_readability.py
name desc
texts Lista de str (documentos del corpus). Los elementos None, no-str o vacíos tras strip() se descartan silenciosamente. El orden se respeta: el muestreo toma los primeros documentos válidos.
name desc
sample_max Número máximo de documentos válidos a puntuar (los primeros). Default 500. Acota el coste en corpus grandes. Valores no convertibles a int caen a 500; negativos se tratan como 0.
Dict con exactamente 3 claves siempre presentes: available (bool: True si textstat se pudo importar), n_scored (int: nº de documentos efectivamente puntuados), flesch (dict con mean, p50, min, max). mean y p50 redondeados a 1 decimal; p50 por nearest-rank sobre los scores ordenados; min/max son los scores extremos sin redondear. Todos los valores de flesch son None cuando n_scored es 0. La función nunca lanza: cualquier excepción global (incluida ImportError de textstat) degrada a available=False, n_scored=0 y flesch todo None.

Ejemplo

from datascience.compute_text_readability import compute_text_readability

textos = [
    "The cat sat on the mat. It was a warm and sunny day in the park.",
    "Reading is a wonderful habit. Books open doors to new worlds and ideas.",
    "He ran quickly to the store to buy some fresh bread and a bottle of milk.",
]

compute_text_readability(textos)
# {
#   "available": True,
#   "n_scored": 3,
#   "flesch": {"mean": 91.4, "p50": 95.4, "min": 70.08..., "max": 108.83...}
# }

# Corpus vacío (textstat presente): available True pero nada que puntuar.
compute_text_readability([])
# {"available": True, "n_scored": 0,
#  "flesch": {"mean": None, "p50": None, "min": None, "max": None}}

Cuando usarla

Úsala en un EDA de texto cuando necesites una métrica única y comparable de lo fácil que es de leer un corpus de documentos (descripciones, reviews, artículos, tickets). Devuelve el resumen Flesch Reading Ease agregado (mean/p50/min/max) listo para un report o un bloque del notebook, sin tener que iterar textstat a mano. Pásale la lista de textos crudos y, si el corpus es grande, limita el coste con sample_max. El estilo dict-no-throw permite incrustarla en pipelines del grupo eda sin envolver en try/except.

Gotchas

  • textstat es una dependencia opcional. Si no está instalada (o falla al importar) la función NO lanza: devuelve available=False, n_scored=0 y flesch todo None. Comprueba available antes de interpretar los números.
  • Flesch Reading Ease está pensado para prosa en inglés. Aplicado a otros idiomas o a texto no-prosa (código, listas, tablas, cadenas muy cortas) los scores no son interpretables, aunque se calculen sin error.
  • Escala Flesch: valores altos = más fácil de leer (≈90100 muy fácil), valores bajos = más difícil (puede ser negativo en texto muy denso). No se recortan a ningún rango: se reportan tal cual los devuelve textstat.
  • available=True con n_scored=0 significa que textstat está presente pero el corpus no aportó documentos puntuables (vacío, solo None/no-str, o todos los docs fallaron al puntuar). Es distinto de available=False.
  • Muestreo = los primeros sample_max, no aleatorio. Si el orden del corpus está sesgado, el resumen reflejará ese sesgo.
  • mean y p50 redondean a 1 decimal; min/max se devuelven sin redondear (los scores extremos reales).