Saltar a contenido

Sonetos en español

SpanishSonnets(data_dir=DEFAULT_DATASET_DIR)

Una colección de sonetos en español del Diachronic Spanish Sonnet Corpus (DISCO 5.0): 4259 sonetos de 1167 autores de España, Hispanoamérica y Filipinas, del siglo XV a principios del XX, 60 209 versos. Cada verso lleva su patrón métrico y la etiqueta de su rima, así que la colección sirve para estudiar la métrica y la rima y para contrastar una escansión con la anotación del corpus.

Los sonetos se reparten en cuatro periodos: 15th-17th (1088 sonetos), 18th (321), 19th (2845, una antología de España e Hispanoamérica) y 20th (5, del poeta filipino Cecilio Apóstol); 295 sonetos son de mujeres, y los autores nacieron en 22 países, la mayoría en España (2388 sonetos) y Cuba (719).

Solo se guardan los sonetos de dominio público, 4259 de 4523: los de los autores que murieron antes de 1946, los de los autores de los siglos XV-XVIII cuya muerte se desconoce y los de los autores de la antología del siglo XIX nacidos antes de 1866 o sin fechas; la mayoría de los poetas filipinos se quedan fuera. Un autor de la antología sin fechas también se queda fuera cuando las fechas de VIAF que DISCO asoció con confianza alta dan una muerte en 1946 o después o un nacimiento en 1866 o después sin muerte; VIAF solo deja fuera a un autor y nunca sustituye las fechas de la fuente. Los metadatos de DISCO se corrigen con la línea biográfica de la fuente: los años de vida donde DISCO tomó de ella un año posterior por el de la muerte o no vio un nacimiento o una muerte dados solos (Echegaray murió en 1916, no en 1904), el país de nacimiento donde la línea lo nombra (Gertrudis Gómez de Avellaneda nació en Cuba, no en Haití). Los poetas filipinos llevan el nombre antes del apellido, como los demás; los interlocutores de los diálogos ([Car], [POETA]) y las llamadas de las notas se quitan de los versos, ya que no están en sus patrones métricos.

El archivo (1 MB, un fichero JSON Lines) se guarda en el repositorio de la biblioteca y se descarga una vez en el directorio de datos; lo construye scripts/build_spanish_sonnets.py a partir de DISCO en un commit fijo.

Licencia y atribución

DISCO se publica con la licencia Creative Commons Reconocimiento 4.0 Internacional, y este conjunto de datos también; el archivo lleva un README.txt con la fuente y los cambios. Cite la fuente así: Ruiz Fabo P., Bermúdez Sabel H., Martínez Cantón C., Calvo Tello J. Diachronic Spanish Sonnet Corpus (DISCO), version 5.0. Madrid: UNED, 2017-2023; y el artículo: Ruiz Fabo P., Bermúdez Sabel H., Martínez Cantón C., González-Blanco E. The Diachronic Spanish Sonnet Corpus: TEI and linked open data encoding, data distribution, and metrical findings. Digital Scholarship in the Humanities 36 (Supplement 1), 2021, i68-i80, doi:10.1093/llc/fqaa035.

Excepciones:

  • SourceTypeError - un data_dir que no es ni una cadena ni un Path.
from ests.datasets import SpanishSonnets

ss = SpanishSonnets()
ss.download()
ss.info["license"], ss.authors.most_common(2)
('CC BY 4.0', [('Rubén Darío', 140), ('José Santos Chocano', 130)])

Parámetros

Parámetro Tipo Por defecto Descripción
data_dir str / Path DEFAULT_DATASET_DIR Ruta al directorio del conjunto de datos; por defecto texts en DEFAULT_DATA_DIR, el directorio de datos se describe en Instalación

Atributos

Atributo Tipo Descripción
periods tuple[str] Tupla de periodos: 15th-17th, 18th, 19th, 20th
authors Counter Número de sonetos por autor, leído del fichero
name str Nombre del conjunto de datos, spanish_sonnets
meta dict[str, str] Información de referencia: la fuente, la descripción, los autores, la licencia y la cita
info dict[str, str] El nombre y la información de referencia en un diccionario
data_dir Path Ruta absoluta al directorio del conjunto de datos
filepath str Ruta al fichero del conjunto de datos, None antes de la descarga

El conjunto de datos se recorre por sus registros como get_records() sin filtros: for record in ss pasa por los sonetos de uno en uno; una línea del fichero que no se puede leer lanza DataFileError.

Métodos

download(force=False) descarga el archivo, verifica su suma de comprobación SHA-256 y extrae el fichero. Un archivo dañado se descarga de nuevo, un fichero que falta se extrae otra vez; una llamada repetida no descarga nada.

Parámetro Tipo Por defecto Descripción
force bool False Descargar el conjunto de datos aunque ya esté descargado

Un archivo que no se puede descargar o que no pasa la suma de comprobación dos veces lanza DownloadError, y un archivo que no se puede extraer, DataFileError.

check_data() comprueba que el fichero del conjunto de datos está en su sitio y devuelve True; un conjunto sin descargar lanza DatasetNotFoundError con las órdenes para descargarlo. Los demás métodos y authors lo comprueban por sí mismos.

get_texts(period=None, author=None, country=None, gender=None, min_len=None, max_len=None, limit=None) extrae los textos (sin encabezados) del conjunto de datos: los versos de un soneto, las estrofas separadas por una línea en blanco.

Parámetro Tipo Por defecto Descripción
period str None Periodo: 15th-17th, 18th, 19th o 20th
author str None Autor: una subcadena del nombre, sin distinguir mayúsculas ni tildes
country str None País de nacimiento: una subcadena del nombre en español, sin distinguir mayúsculas ni tildes
gender str None Género del autor: F o M
min_len int None Longitud mínima del texto (en caracteres)
max_len int None Longitud máxima del texto (en caracteres)
limit int None Número de textos

Los filtros se combinan; author="dario" encuentra a Rubén Darío, country="mexico" encuentra México. Un periodo o un género desconocidos, un author o un country que no es una cadena, una cota de longitud que no es un entero de al menos uno, una longitud mínima mayor que la máxima y un limit que no es un entero no negativo lanzan ParameterError.

for text in ss.get_texts(author="avellaneda", gender="F", limit=1):
    print(text.split("\n\n")[0])
No encuentro paz, ni me permiten guerra;
de fuego devorado, sufro el frío;
abrazo un mundo, y quédome vacío;
me lanzo al cielo, y préndeme la tierra.

get_records con los mismos parámetros extrae los registros (con encabezados) del conjunto de datos. Campos del registro: id - el identificador del soneto en DISCO, period - periodo, author - autor, title - título, country - el país de nacimiento del autor en español (vacío si se desconoce), gender - F o M, birth y death - los años de vida (None si se desconocen), text - texto, meter - el patrón métrico de cada verso, rhyme - la etiqueta de la rima de cada verso. En un patrón métrico + es una sílaba tónica y - una átona, así que su longitud es el número de sílabas métricas: 11 para un endecasílabo, 14 para un alejandrino. Las etiquetas iguales marcan los versos que riman entre sí, - un verso que no rima con ningún otro. Los registros van por periodo en el orden de periods, dentro de un periodo por el identificador de DISCO ordenado numéricamente (1035e_269 antes de 1035e_1360), que mantiene juntos los sonetos de un autor en el orden de su fuente.

from collections import Counter

# Los primeros versos de un soneto con su rima y su métrica
record = next(ss.get_records(author="rubén darío"))
lines = record["text"].replace("\n\n", "\n").split("\n")
for line, pattern, label in list(zip(lines, record["meter"], record["rhyme"]))[:4]:
    print(f"{label} {pattern:<14} {line}")

# La proporción de endecasílabos y alejandrinos por periodo
for period in ss.periods:
    lengths = Counter(
        len(pattern) for record in ss.get_records(period=period) for pattern in record["meter"]
    )
    total = sum(lengths.values())
    print(period, f"{lengths[11] / total:.2f}", f"{lengths[14] / total:.2f}")
A -+---+---+-    En medio del abismo de la duda
B +----+-+-+-    lleno de oscuridad, de sombra vana
B +--+---+-+-    hay una estrella que reflejos mana
A -+-+---+-+-    sublime, sí, mas silenciosa, muda.
15th-17th 0.98 0.00
18th 0.99 0.00
19th 0.86 0.09
20th 0.60 0.40

La anotación es automática

Los patrones métricos y las etiquetas de la rima son la anotación automática de DISCO (la escansión de ADSO, de Jumper para los sonetos modernistas y filipinos, la rima de RhymeTagger): una referencia con la que comparar una escansión, no un patrón de oro, ya que un patrón puede perder una sinalefa o un acento que haría un lector. Algunos sonetos no tienen etiquetas de la rima, y las secuencias largas no las tienen después de la letra N: esa etiqueta es una cadena vacía.

Sonetos, secuencias y títulos

4211 registros son sonetos de 14 versos; los demás son sonetos con estrambote, unos pocos incompletos o irregulares («El soneto de trece versos» de Darío) y secuencias de sonetos que DISCO guarda en un solo fichero, de hasta 98 versos. Los sonetos de una secuencia guardados en ficheros separados tienen el título Part of: y el título de la secuencia. Los títulos y la ortografía son los de las fuentes de DISCO, algunos títulos en mayúsculas.