Saltar a contenido

Gráficos de corpus

Gráficos para las medidas de corpus: la dispersión léxica - dónde aparece una palabra en un texto -, un diagrama de las palabras clave que encuentra keyness y una red de las colocaciones que encuentra collocations. Las funciones de matplotlib reciben los ejes ax y devuelven Axes: sin ax se crea una figura nueva, con ellos el gráfico va a una rejilla propia; la red de colocaciones la construye graphviz y devuelve un Graph, como el árbol de palabras devuelve un Digraph.

Las funciones son las del núcleo anyTS. Las etiquetas por defecto de los gráficos de matplotlib son las inglesas de VISUALIZER_LABELS en anyts.constants; labels sustituye cualquiera de ellas.

Dispersión léxica

dispersion_plot(words, targets, ax=None, labels=None)

Una fila por cada palabra de targets y una marca en la posición de cada una de sus apariciones en el texto. Las palabras se comparan tal cual: las mayúsculas y minúsculas y la lematización corresponden a la extracción de las palabras.

Parámetro Tipo Por defecto Descripción
words list[str] - Palabras del texto en orden
targets list[str] - Palabras cuyas apariciones se muestran
ax Axes None Ejes para el gráfico
labels dict[str, str] None Etiquetas sobre las de por defecto: title, xlabel

Unas palabras o unos objetivos que no son una lista de cadenas lanzan SourceTypeError, la falta de palabras o de objetivos SourceError; unas etiquetas que merge_labels rechaza y un ax que no es un Axes de matplotlib lanzan ParameterError.

Las palabras las extrae WordsExtractor: en minúsculas con lowercase=True, los lemas con use_lexemes=True.

Diagrama de palabras clave

keyness_plot(positive, negative=(), top_n=20, labels=None, field='score', log=False, ax=None)

Barras horizontales divergentes: las palabras de positive a la derecha, las de negative (el resultado de keyness con positive=False) a la izquierda, top_n por lado. La longitud de una barra es el valor absoluto del campo field (score, g2, log_ratio), así que el lado lo fija la lista, no el signo de la medida; las palabras con un valor indefinido o infinito se omiten. Para la razón de momios (de 0 a infinito, uno - momios iguales) log=True representa el valor absoluto de \(\log_2\) del valor, simétrico en torno a uno.

Parámetro Tipo Por defecto Descripción
positive list[Keyword] - Palabras clave positivas
negative list[Keyword] () Palabras clave negativas
top_n int 20 Número de palabras por lado
labels dict[str, str] / tuple[str, str] None Etiquetas sobre las de por defecto: title, xlabel y xlabel_log (cadenas de formato con field), target y reference (la leyenda); un par de cadenas fija solo la leyenda
field str 'score' Campo de Keyword cuyos valores se representan
log bool False Representar \(\log_2\) del valor, para la razón de momios
ax Axes None Ejes para el gráfico

Unas palabras clave que no son una lista lanzan SourceTypeError, y la falta de palabras clave con un valor finito SourceError. Un field desconocido, un top_n que no es un entero de al menos uno, unas etiquetas que merge_labels rechaza o una leyenda que no es un par, y un ax que no es un Axes de matplotlib lanzan ParameterError.

Red de colocaciones

collocation_network(collocations, top_n=None)

Un grafo no dirigido con la disposición neato: los nodos son las palabras, con el tamaño de la letra según la frecuencia, y las aristas son los pares, con el grosor y la etiqueta según la medida. Un par de una palabra consigo misma (una palabra repetida dentro de la ventana) sería un bucle y se deja fuera antes de top_n. Para dibujarlo hacen falta los ejecutables de Graphviz; Jupyter muestra el grafo, y graph.render("network") guarda un archivo png.

Parámetro Tipo Por defecto Descripción
collocations list[Collocation] - Colocaciones
top_n int None Número de pares desde el principio de la lista; None - todos

Unas colocaciones que no son una lista lanzan SourceTypeError, la falta de un par de dos palabras distintas SourceError, y un top_n que no es un entero de al menos uno ParameterError.

Los gráficos de Marianela de Galdós y de seis novelas del corpus de literatura - Marianela, Misericordia y Torquemada en la hoguera frente a Niebla, Abel Sánchez y La tía Tula de Unamuno:

from spacy.lang.es.stop_words import STOP_WORDS

from ests import WordsExtractor
from ests.corpus import collocations, keyness
from ests.datasets import SpanishLiterature
from ests.visualizers import collocation_network, dispersion_plot, keyness_plot

sl = SpanishLiterature()
sl.download()
titles = (
    "Marianela",
    "Misericordia",
    "Torquemada en la hoguera",
    "Niebla",
    "Abel Sánchez",
    "La tía Tula",
)
novels = {
    record["title"]: record["text"]
    for author in ("galdos", "unamuno")
    for record in sl.get_records(author=author)
    if record["title"] in titles
}

# Dónde aparecen los personajes y los motivos de Marianela
words = WordsExtractor(lowercase=True).extract(novels["Marianela"])
dispersion_plot(words, ["nela", "pablo", "florentina", "golfín", "ciego", "luz"])

# Palabras clave de Galdós frente a Unamuno, lemas sin palabras vacías
we = WordsExtractor(use_lexemes=True, lowercase=True, filter_nums=True, stopwords=STOP_WORDS)
galdos = [lemma for title in titles[:3] for lemma in we.extract(novels[title])]
unamuno = [lemma for title in titles[3:] for lemma in we.extract(novels[title])]
keyness_plot(
    keyness(galdos, unamuno, min_freq=5, top_n=10),
    keyness(galdos, unamuno, positive=False, min_freq=5, top_n=10),
    labels=("Galdós", "Unamuno"),
)

# Red de colocaciones de Marianela
graph = collocation_network(
    collocations(we.extract(novels["Marianela"]), window=3, min_freq=5, top_n=25)
)
graph.render("network", format="png")

ests

ests

ests

Nela recorre toda la novela, Florentina entra en su segunda mitad, y el doctor Golfín la abre y la cierra; la ceguera de Pablo (ciego) pertenece sobre todo a la primera mitad. Además de los nombres de los personajes, las palabras clave muestran la ortografía antigua de las ediciones (á, fué) y palabras de los temas de Unamuno: acaso, hijo. La red de colocaciones reúne los nombres y los lugares de Marianela en torno a d., el don abreviado: Teodoro Golfín, Aldeacorba de Suso, las minas de Socartes.