Resaltado del texto¶
ests.visualizers.highlight(), ests.visualizers.HighlightedText, ests.visualizers.Highlight
Descripción¶
El mecanismo del resaltado de un texto por capas, a la manera de los correctores de estilo: cada capa marca los fragmentos de un texto que cuenta una estadística - las oraciones largas, las palabras complejas, la pasiva. La fuente de datos puede ser un texto o un objeto Doc de spaCy. El resultado se muestra en Jupyter como HTML con estilos y una leyenda; el método to_html devuelve el mismo marcado para la documentación y las aplicaciones web, y los fragmentos se guardan en el atributo highlights para una representación propia. Los fragmentos de capas distintas pueden solaparse.
La función highlight devuelve un objeto HighlightedText de esTS, que extiende el HighlightedText del núcleo anyTS con las capas de la biblioteca, su búsqueda y sus parámetros, y el prefijo ests de las clases CSS.
Capas del resaltado:
| Grupo | Capa | Qué marca | Estadística |
|---|---|---|---|
| Legibilidad | long_sents |
Oraciones de long_sent_word_factor palabras o más |
BasicStats |
complex_words |
Palabras de complex_syl_factor sílabas o más |
BasicStats | |
rare_words |
Palabras con un lema fuera del top 10000 incorporado; no se resaltan los números, las palabras con guion o con cifras ni las palabras vacías | LexicalStats | |
| Sintaxis | passive |
Formas verbales pasivas con su auxiliar ser o su se; la nota distingue las dos y marca la pasiva con ser sin agente |
SyntaxStats |
participle_clauses |
Construcciones de participio | SyntaxStats | |
gerund_clauses |
Construcciones de gerundio | SyntaxStats | |
de_chains |
Cadenas de complementos con de con su núcleo |
SyntaxStats | |
split_predicates |
Predicados escindidos del verbo al sustantivo | SyntaxStats | |
| Estilo burocrático | verbal_nouns |
Sustantivos deverbales | StyleStats |
compound_prepositions |
Locuciones prepositivas de COMPOUND_PREPOSITIONS |
StyleStats | |
cliches |
Clichés de OFFICIALESE_CLICHES o del parámetro cliches |
StyleStats | |
| Estilo | stopwords |
Palabras vacías de STOPWORDS o del parámetro stopwords, el agua del texto |
StyleStats |
parentheticals |
Expresiones parentéticas | StyleStats | |
connectors |
Marcadores del discurso, con la clase y el tipo en la nota | CohesionStats | |
| Fónica | alliteration |
Repeticiones de un sonido consonántico en palabras vecinas, poco probables por las frecuencias de los sonidos del español; la nota da el sonido y las letras que lo escriben | PhonStats |
Los grupos se definen en ests.constants.HIGHLIGHT_LAYER_GROUPS, las anotaciones de un Doc que necesita una capa en HIGHLIGHT_LAYER_ANNOTATIONS y los estilos de las capas en HIGHLIGHT_LAYER_STYLES. Las capas del grupo «Sintaxis» necesitan un Doc con análisis y lematizador (los modelos es_core_news_sm, es_core_news_md, es_core_news_lg), como SyntaxStats; verbal_nouns necesita un Doc con las categorías gramaticales y los lemas. Un Doc sin los límites de las oraciones (un pipeline vacío, un pipeline sin analizador) se divide con las reglas de SentsExtractor. Por defecto se activan las capas de HIGHLIGHT_DEFAULT_LAYERS que la fuente permite - oraciones largas, palabras complejas, pasiva, cadenas de de, predicados escindidos, clichés; layers="all" activa todas las permitidas. Las capas se solapan (una locución prepositiva está hecha de palabras vacías), así que elija las que necesite.
Una oración es larga a partir de 30 palabras, el límite de las guías españolas de lenguaje claro (la Comunidad de Madrid y el Gobierno de la Ciudad de Buenos Aires), y una palabra es compleja a partir de cuatro sílabas; complex_syl_factor=3, el límite de BasicStats, muestra las palabras de n_complex_words.
Nota
Una aliteración se busca dentro de una oración como una secuencia de dos palabras vecinas o más con el mismo sonido consonántico en su raíz. Los sonidos son los de la transcripción, así que casa y queso repiten k; la raíz es el comienzo común de las transcripciones de la forma y de su lema (cantaban - k a n t a), lo que deja fuera las terminaciones que se repiten por la concordancia (las casas blancas). La probabilidad de una secuencia con un reparto independiente de los sonidos es el producto sobre sus palabras de la probabilidad de encontrar la consonante entre los sonidos de la raíz, \(1 - (1 - f)^n\), donde \(f\) es la frecuencia del sonido en el corpus de literatura y \(n\) el número de sonidos de la raíz; una secuencia se resalta cuando la probabilidad queda por debajo de alliteration_threshold. La repetición de un sonido raro se nota en dos o tres palabras (deje la abeja), mientras que la s de los suspiros se escapan es demasiado frecuente para contar en dos palabras. Las palabras de menos de tres letras (de, la, el) y las palabras vacías (que, los, con) no cortan ni continúan una secuencia. El índice de aliteración de PhonStats mide cómo se agrupan las repeticiones en todo el texto; el resaltado muestra dónde están.
Parámetros¶
| Parámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
source |
str/Doc | - |
Fuente de datos (una cadena o un objeto Doc) |
layers |
list[str]/str | None |
Capas del resaltado; si no se dan, las capas por defecto que la fuente permite; "all" - todas las permitidas |
Una fuente que no es ni una cadena ni un Doc lanza SourceTypeError, una fuente sin palabras SourceError; unas capas que no son un nombre ni una lista de nombres, una capa desconocida o una que necesita una anotación que le falta a la fuente lanzan ParameterError.
Los parámetros de las capas de esTS:
| Parámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
long_sent_word_factor |
int | 30 |
Número mínimo de palabras de una oración larga |
complex_syl_factor |
int | 4 |
Número mínimo de sílabas de una palabra compleja |
stopwords |
list[str]/set[str] | None |
Lista o conjunto de palabras vacías; si no se da, STOPWORDS y las expresiones parentéticas de una palabra |
cliches |
list[str]/set[str] | None |
Lista o conjunto de clichés; si no se da, OFFICIALESE_CLICHES |
alliteration_threshold |
float | 0.001 |
Probabilidad de una repetición de una consonante con un reparto independiente de los sonidos, por debajo de la cual la repetición es aliteración |
Un umbral que no es un entero de al menos uno o una probabilidad fuera de (0, 1] lanza ParameterError, unas palabras vacías o unos clichés que no son cadenas SourceTypeError.
Atributos¶
| Atributo | Tipo | Descripción |
|---|---|---|
text |
str | Texto de la fuente de datos |
layers |
tuple[str] | Capas activadas, en el orden de dibujo |
highlights |
tuple[Highlight] | Fragmentos resaltados, ordenados por su inicio y luego por su final descendente |
counts |
dict[str, int] | Número de fragmentos de cada capa |
Un fragmento Highlight es un objeto inmutable con los campos start y end (posiciones en el texto), layer (la capa) y note (la explicación de la ventana emergente).
La nota de un fragmento da el número de palabras de la oración, de sílabas de la palabra, la longitud de la cadena o la expresión de la lista.
Métodos¶
to_html¶
Devuelve el marcado HTML del texto resaltado: un div de la clase <prefix>-highlight con la leyenda y sus recuentos y el texto, donde los segmentos resaltados van dentro de un span de las clases <prefix>-hl y <prefix>-hl-<capa>, y las notas van al atributo title; <prefix> es el prefijo de las clases CSS. Los fragmentos solapados de capas distintas dan segmentos con varias clases, en el orden de dibujo. Los saltos de línea (\n, \r\n, \r) se guardan como referencias de caracteres, una por salto, así que el marcado puede insertarse en Markdown.
| Parámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
legend |
bool | True |
Añadir la leyenda con los recuentos de los fragmentos |
css |
bool | True |
Añadir los estilos de las capas |
css¶
El método de clase css() devuelve los estilos que añade to_html: el contenedor, la leyenda y el texto con las clases de css_prefix, las declaraciones de layer_styles de cada capa y un color oscuro del texto en las capas con fondo.
Ejemplo de uso¶
Ejemplo
Código:
import spacy
from ests.visualizers import highlight
nlp = spacy.load("es_core_news_sm")
text = (
"El proyecto, elaborado durante el verano, fue aprobado por el consejo sin debate. "
"El aumento de la eficiencia del uso de los recursos públicos se analizó, siguiendo "
"las normas del reglamento. "
"Los representantes de los ministerios regionales no consiguieron hacer una revisión "
"conjunta de las cuestiones de financiación y de reparto de responsabilidades entre los "
"organismos, puesto que cada uno de ellos defendía su propia interpretación de las "
"disposiciones del acuerdo. "
"En el marco de la reunión se procedió a la votación, y la decisión quedó aplazada "
"hasta la próxima sesión."
)
# Resaltar el texto con las capas por defecto
ht = highlight(nlp(text))
ht.counts
# {'long_sents': 1, 'complex_words': 16, 'passive': 2, 'de_chains': 3,
# 'split_predicates': 2, 'cliches': 1}
ht.highlights[:2]
# (Highlight(start=13, end=22, layer='complex_words', note='complex word, 5 syllables'),
# Highlight(start=42, end=54, layer='passive', note='passive with ser'))
# Todas las capas
highlight(nlp(text), layers="all").counts
# {'long_sents': 1, 'complex_words': 16, 'rare_words': 0, 'passive': 2,
# 'participle_clauses': 2, 'gerund_clauses': 1, 'de_chains': 3, 'split_predicates': 2,
# 'verbal_nouns': 9, 'compound_prepositions': 1, 'cliches': 1, 'stopwords': 48,
# 'parentheticals': 0, 'connectors': 3, 'alliteration': 0}
# Mostrar en Jupyter o guardar el marcado
ht
html = ht.to_html()
Resultado (pase el cursor sobre un fragmento para ver su nota):
Una cadena sin modelo de spaCy permite todas las capas salvo las sintácticas y verbal_nouns: por defecto, oraciones largas, palabras complejas y clichés, y la aliteración a petición.
Ejemplo
from ests.visualizers import highlight
# Antonio Machado, Poesías completas (el corpus de literatura)
text = "El cierzo corre por el campo yerto alborotando en blancos torbellinos la nieve silenciosa."
highlight(text, layers="alliteration").highlights
# (Highlight(start=35, end=78, layer='alliteration', note='alliteration on /b/ (b, v)'),)
Ejemplo
from ests.visualizers import highlight
text = "Se procedió a la revisión del expediente en el marco del plan a la mayor brevedad."
highlight(text, layers=["compound_prepositions", "cliches"]).highlights
# (Highlight(start=3, end=13, layer='cliches', note='cliché: «proceder a»'),
# Highlight(start=41, end=56, layer='compound_prepositions', note='compound preposition: «en el marco de»'),
# Highlight(start=62, end=81, layer='cliches', note='cliché: «a la mayor brevedad»'))