El arte de escribir bien: las repeticiones

Hace unas semanas publiqué una entrada que trataba el tema del ritmo en la escritura. Básicamente me centré en una de las características más sencillas que pueden analizarse de manera automática, que es la longitud de las frases en una obra. A pesar de tratarse de un estudio poco detallado (sólo eché un vistazo a unos pocos libros de un par de géneros), sí que encontré ciertos patrones que relacionaban la longitud media de las oraciones de una obra con la complejidad de la misma: los textos más «académicos» (por ejemplo las biografías) suelen tener oraciones más largas, mientras que las novelas o las obras con muchos diálogos suelen tener frases más cortas.

Como me lo pasé bastante bien haciendo los análisis, lo siguiente que se me ocurrió fue pegar un vistazo a otro de los puntos que más dolores de cabeza suele darme al escribir: las repeticiones. Muchas veces me sorprendo revisando un párrafo hablando sobre cualquier tema y encuentro la misma palabra tres o cuatro veces en el lapso de unas pocas frases. Si bien la repetición es un recurso literario extremadamente útil (veremos algún ejemplo más adelante), creo que en el día a día nos la encontramos de forma muy común por descuidos de la persona que escribe. Muy frecuentemente me tengo que forzar a terminar de leer artículos en prensa o en un blog que me parecen muy interesantes pero que me provocan un cierto sangrado ocular, y siempre intento evitar producir textos que adolezcan ese tipo de fallos.

El caso es que, técnicamente, este análisis de las repeticiones es mucho más sencillo de realizar que el de la extensión de las oraciones, ya que no hay ninguna ambigüedad sobre cómo identificar las palabras: simplemente almacenas todo el documento en una cadena de texto y luego la vas cortando cada vez que te encuentras un espacio. Una vez tienes una lista con todas las palabras, puede usarse un bucle que va contando cuántas veces ha aparecido cada una. Después de este cálculo, obtenemos una lista de todas las palabras y su número de ocurrencias.

Esto está muy bien, pero si queremos estudiar si un texto suena repetitivo no nos sirve simplemente con saber cuantas veces aparece una palabra, necesitamos saber su frecuencia. Dicho de otra manera, de poco me sirve que saber que un término aparece 100 veces en un libro si este tiene una extensión de 1500 folios y las repeticiones ocurren cada 15 páginas, ya que la distancia entre repeticiones es tan grande que estas no van a generar ningún problema al lector. Obviamente, si esas 100 repeticiones ocurren en un lapso de 5 páginas, la persona va a terminar hasta las narices de encontrarse con la misma palabra una y otra vez y posiblemente sea incapaz de acabar la lectura.

Afortunadamente, buscar las posiciones de cada repetición también es bastante sencillo. Ya tenemos una lista con todas las palabras del texto ordenadas por orden de aparición (es lo primero que hemos construido) y otra con las palabras y su número de repeticiones. Sólo necesitamos buscar cada una de las palabras que aparecen más de una vez en el texto y almacenar sus posiciones. De nuevo, es posible usar un bucle que recorre la lista de palabras repetidas y guarda sus ubicaciones. Una vez tenemos hecha esta localización, las distancias se calculan simplemente restando las posiciones consecutivas de cada repetición (por ejemplo, para una palabra que aparece tres veces en un texto en los lugares 20, 60 y 94, las distancias de repetición serán: 60 – 20 = 40 y 94 – 60 = 34 palabras).

Aunque esto sea simplemente un detalle técnico, y debe haber otras maneras más eficientes de lograr el mismo resultado final, para mí la forma más sencilla de hacer todo esto ha sido trabajar con Numpy, convirtiendo esas listas de palabras en vectores en los que cada elemento contiene una palabra y luego utilizar numpy.where() para obtener las posiciones de las repeticiones. Además, nada más empezar a ver los resultados me di cuenta de un pequeño detalle que dificultaba mucho la visualización del análisis, y es que nuestro lenguaje está lleno de pequeñas palabras que, si bien son totalmente necesarias, aparecen constantemente y no suelen generar ningún problema: los artículos, los adverbios, las interjecciones, los pronombres y las conjunciones (no se si me dejo alguna categoría, pero ya me entendéis). Si bien una manera bien sencilla de resolverlo es hacer una lista con todas estas palabras y eliminarlas de nuestro análisis, la verdad es que me daba mucha pereza programar algo así, y terminé optando por hacer una pequeña criba en base a la longitud de cada palabra. Esto tiene cierto sentido ya que la gran mayoría de las palabras pertenecientes a estas categorías son muy cortas. En mi caso, un umbral de tres letras ha sido suficiente como para eliminar prácticamente todo este «ruido» del análisis. Aún con todas estas consideraciones, e incluso añadiendo un par de bloques para guardar las listas de repeticiones en un fichero csv y generar una gráfica de repeticiones, el código completo no llega a las 100 líneas en Python:

# -*- coding: utf-8 -*-
"""
checks for repetition of words

@author: fer
"""
#%% Import tools
import numpy as np
import re
import matplotlib.pyplot as plt
import csv
#%% Load data
book_title = 'mini_uvas' #pick book title
#'cp1252' or 'utf-8' as encodings
file = open('./data/' + book_title + '.txt', encoding = 'utf-8') #open file
text = file.read() #extract string with full text

#%% Define useful functions
def vector_distances(array):
    '''
    vector_distances calculates the difference between consecutive
    elements of an array

    Parameters
    ----------
    array : input array

    Returns
    -------
    vec_distances : difference between consecutive array elements

    '''
    vec_size = array.shape[0] #calculate vector size
    vec_distances = np.zeros((vec_size - 1,)) #preallocate
    for idx in range(vec_size - 1):
        vec_distances[idx] = array[idx+1] - array[idx]
    
    return vec_distances

#%% Extract words, remove short words, calculate repetitions
#extract words from the string storing the text under study
words = np.array(re.findall(r'\w+',text.lower()))

#removing short words (define threshold with number of letters)
# use 0 if you do not want to remove anything
threshold = 3
words_after_threshold = [] #initialize word list

for idx in range(len(words)):
    if len(words[idx]) > threshold:
        words_after_threshold.append(words[idx]) #add to list if longer than threshold
words_after_threshold = np.array(words_after_threshold) #convert to array


#count ocurrences in the full text
ocurrences = dict() #initialize ocurrence list
for word in words_after_threshold:
    if word in ocurrences:
        ocurrences[word] = ocurrences[word] + 1
    else:
        ocurrences[word] = 1
    
#sort ocurrences by repetition value, remove words with only 1 appearance
rep_words = sorted(ocurrences.items(), key = lambda item: item[1])
while rep_words[0][1] == 1:
    del(rep_words[0])
    
#save ocurrence list as text file        
# with open(book_title + '_reps.txt', 'w', newline = '', encoding = "utf8") as f:
#     w = csv.writer(f)
#     w.writerows(rep_words)

#%% Measure distance between repeated words

distances = dict() #preallocate
for idx in range(len(rep_words)):
    word_pos = np.where(words == rep_words[idx][0])[0]
    distances[rep_words[idx][0]] = vector_distances(word_pos)
        
#%% Plot distance graph
k = 0
fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize = (8,4.5))
for word in distances:
    for idx in range(distances[word].shape[0]):
        ax.plot([k], [distances[word][idx]],
                marker = 'o', color = 'r', markersize = 2 )
    k += 1

ax.set_xticks(np.arange(0,len(rep_words)))
ax.set_xticklabels(distances.keys(), rotation = 70)
ax.set_xlabel('Palabra')
ax.set_ylabel('Distancia entre repeticiones (# de palabras)')
ax.set_title(book_title)
plt.show()

Como decía un poco más arriba, si bien aquí el procesado del texto es mucho más sencillo que en el caso de la longitud de las oraciones, la visualización de los resultados no es tan clara, principalmente por la cantidad enorme de palabras distintas con las que estamos trabajando. De momento he optado por dos formas de analizar los resultados. Primero, exportar la lista de palabras repetidas en un fichero que puede abrirse en Excel y en el que podemos sumergirnos viendo cuantas repeticiones hay, ordenar por orden alfabético, por número de repeticiones, hacer búsquedas, etc. Esto resulta bastante útil porque es una manera muy interactiva de bucear en la información extraída. La segunda manera es más visual, y consiste en generar una gráfica en la que represento cada palabra y sus distancias de repetición. Por ejemplo, para el primer capítulo de Las uvas de la ira (almacenado, en mi caso, en el archivo mini_uvas.txt), tenemos:

La primera imagen contiene todas las palabras repetidas en el capítulo, mientras que la segunda es un pequeño zoom a la parte final de la gráfica. Podemos ver un par de detalles. Las palabras que aparecen más a la izquierda tienen un número de repeticiones muy bajo (de hecho prácticamente la primera mitad del gráfico está constituido por palabras con un solo punto, es decir, con una sola repetición). Además, los puntos en la zona inferior de la gráfica indican palabras potencialmente problemáticas (importante ese «potencialmente», como veremos un poco más adelante), ya que la distancia entre repeticiones es muy pequeña. Por otra parte, cuanto más a la derecha nos desplazamos, las palabras comienzan a tener más y más puntos, y estos tienden a agruparse (por pura lógica, dada una longitud fija del texto, las palabras que se repiten más tienen que estar más cerca, en promedio, que las que no se repiten tanto). Por ejemplo, en la segunda imagen podemos encontrar «supieron», con tres puntos a alturas 5, 10 y 30. Es decir, la palabra «supieron» aparece cuatro veces en el capítulo, con separaciones 5, 10 y 30 palabras. Es posible abrir el texto en Word (o cualquier otro editor de texto) y hacer Ctrl+F para encontrar el pasaje:

Pasado un rato, los rostros atentos de los hombres perdieron la expresión de perplejidad y se tornaron duros y airados, dispuestos a resistir. Entonces las mujeres supieron que estaban seguras y que sus hombres no se derrumbarían. Luego preguntaron: ¿Qué vamos a hacer? Y los hombres replicaron: No sé. Pero estaban en buen camino. Las mujeres supieron que la situación tenía arreglo, y los niños lo supieron también. Unos y otros supieron en lo más hondo que no había desgracia que no se pudiera soportar si los hombres estaban enteros. Las mujeres entraron en las casas para comenzar a trabajar y los niños empezaron a jugar, aunque cautelosos. A medida que el día avanzaba, el sol fue perdiendo su color rojo. Resplandeció sobre la tierra cubierta de polvo. Los hombres, sentados a la puerta de sus casas, juguetearon con palitos y piedras pequeñas; permanecieron inmóviles sentados, pensando y calculando.

Las uvas de la ira – John Steinbeck

Ahora, si bien el código nos ha permitido encontrar este párrafo donde podríamos pensar que hay un uso excesivo de la palabra «supieron», ¿es realmente molesta esta repetición? Yo sinceramente creo que no, que John Steinbeck elige repetir no sólo la palabra, sino la estructura al completo en cuatro ocasiones: «[…] las mujeres supieron que estaban seguras […]», «Las mujeres supieron que la situación […]», «[…] los niños lo supieron también.» y «Unos y otros supieron en lo más hondo […]». Esta especie de anáfora, además de darle ritmo al texto, sirve para ayudar al lector a visualizar la situación de los personajes y refuerza su mensaje: los hombres decidieron luchar, pero no estaban solos, ya que su determinación era compartida también por las mujeres y los niños. Esta idea de la unidad familiar (o de una comunidad) frente a la adversidad es un tema que se trata en profundidad a lo largo de todo el libro, y Steinbeck (que era un genio) es capaz de plantar esa semilla de una manera bella y sutil desde el primer momento.

Y hablando de introducir ideas, ¿qué ocurre con las palabras más repetidas? En este primer capítulo, las cinco palabras más utilizadas son «polvo», «viento», «tierra», «maíz» y «aire». A poco que el lector sepa un poco sobre la historia de los EE.UU. o la obra de Steinbeck, le resultará difícil no relacionarlas entre sí. Las uvas de la ira está ambientada en la crisis posterior al crack del 29, y sigue la historia de una familia de campesinos que pierde todas sus tierras (debido a las tormentas de polvo que devastaron la ecología del país) y se ve forzada a emigrar California. Es posible, por tanto, encontrar la temática o las ideas principales de un texto analizando las repeticiones de las palabras que lo componen.

Ahora podrás estar pensando: «vale, Steinbeck era Jesucristo y debería leerme todos sus libros, pero, ¿no ibas a contarme usos negativos de la repetición?». Así que voy a dar dos ejemplos, uno en el que tengo dudas sobre si la repetición es intencionada o no, y otro perteneciente a uno de mis libros favoritos siempre que llega el momento de meter mierda.

Como la vida no me da para más, voy a reutilizar un libro que analicé en mi entrada anterior: La única verdad. Veamos la gráfica del primer capítulo del libro:

Si bien la estructura es igual a la del ejemplo anterior, un detalle que me llamó la atención fue la serie de puntos dentro del cuadrado negro. En la segunda imagen es posible ver que las palabras «importante», «historia» y «humanidad» se repiten con la misma frecuencia. Las repeticiones en cuestión ocurren en el siguiente párrafo:

Lo cierto era que el aprendizaje automático —o Machine Learning, como dicen los anglosajones— se había convertido por derecho propio en la revolución más importante de la historia de la humanidad. Lo que empezó siendo un compendio de algoritmos y técnicas imposibles por culpa de las limitaciones de la computación pasó, en un cuarto de siglo, a convertirse en toda una realidad. A partir del año 2010 comenzaron a perderse de vista los límites computacionales y arrancó con fuerza lo que se consideró la revolución más importante de la historia de la humanidad.

La única verdad – Ray García

No estoy 100% seguro (y de hecho la ventaja de usar este libro es que Ray podrá resolvernos la duda), pero en este caso a mi me resulta una repetición un poco rara. Si bien la construcción «la revolución más importante de la historia de la humanidad» es muy potente y me cuadra perfectamente como una frase para abrir o cerrar un párrafo, que aparezca dos veces tan seguidas me parece que le quita mucho empaque. Ray introduce el concepto de Machine Learning al lector, afirmando que fue un avance totalmente revolucionario. Luego pasa a dar un poco de contexto sobre la técnica, para terminar diciendo de nuevo que fue una revolución. ¿Es realmente efectiva esta repetición para reforzar la idea de que el Machine Learning fue una revolución, o es una redundancia que debilita el párrafo? Dejo la pregunta abierta al lector.

Por ir terminando (la entrada ya se me ha ido de las manos en cuanto a longitud, para variar), hablemos de uno de los peores libros que he tenido la osadía de leer: Ready Player One. Esta copia millenial del también infame El código Da Vinci es un esperpento lleno de clichés, toneladas de referencias metidas con calzador y personajes unidimensionales, y peca de una estructura machacona y muy poco inspirada. Una de las palabras más usadas a lo largo del libro es «avatar», que se repite un total de 326 veces. No resulta muy difícil encontrar pasajes en las que hay hasta 14 repeticiones en un lapso de menos de dos páginas:

[…] Mi avatar se materializó frente a mi taquilla, en la segunda planta del instituto, el lugar exacto en el que me encontraba cuando salí la noche anterior.

Miré a un lado y a otro del pasillo. Mi entorno virtual parecía casi real (pero no por completo). El entorno, en el interior de Oasis, se presentaba detalladamente, en tres dimensiones. Si no te detenías a examinarlo con más atención, olvidabas fácilmente que cuanto veías estaba generado por ordenador. Y eso con mi consola Oasis, la que entregaban en la escuela, que era una mierda. Había oído que si accedías a la simulación con un equipo de inmersión de última generación, resultaba prácticamente imposible diferenciar Oasis del mundo real.

Toqué la puerta de la taquilla, que se abrió emitiendo un tenue sonido metálico. La tenía muy poco decorada por dentro: una foto de la princesa Leia posando con una pistola de rayos y otra de los Monty Python con sus disfraces de Los caballeros de la mesa cuadrada. Y la portada de la revista Time en la que aparecía James Halliday. Me incorporé un poco y rocé los libros de texto del estante superior, que se desvanecieron para reaparecer en el inventario de artículos de mi avatar.

Además de aquellos libros de texto, mi avatar contaba apenas con unas pocas pertenencias: una linterna, una espada corta de hierro, un escudo pequeño de bronce y una armadura hecha de tiras de cuero. Ninguno de los artículos tenía poderes mágicos y todos eran de mala calidad, pero eran los únicos que había podido permitirme. En Oasis, los productos costaban lo mismo que las cosas del mundo real (en ocasiones incluso más), además de que no podías usar vales de comida para pagar por ellos. En Oasis, la divisa era el «crédito», que en aquellos tiempos de incertidumbre se había convertido en una de las más estables del mundo, más cotizada que el dólar, la libra, el euro o el yen.

Había un espejo pequeño fijado a la puerta de la taquilla y, en el momento de cerrarla, vi fugazmente el rostro de mi yo virtual. Había diseñado la cara y el cuerpo de mi avatar para que se parecieran más o menos a mí. Su nariz, eso sí, era ligeramente más pequeña y era más alto que yo. Y más delgado. Y más musculado. Y sin acné juvenil. Pero dejando de lado esos detalles sin importancia, resultábamos bastante parecidos. El estricto código de indumentaria de la escuela exigía que todos los avatares adoptaran apariencia humana, que fueran del mismo sexo y edad que el estudiante real a quien encarnaban. Allí no estaban permitidos los unicornios demoníacos hermafroditas bicéfalos. Al menos no dentro de las instalaciones.

Podías bautizar a tu avatar con el nombre que quisieras, siempre que no hubiera otro igual. Es decir, debías escoger un nombre que nadie hubiera escogido antes que tú. El nombre de tu avatar debía figurar también en tu dirección de correo electrónico y en tu identificación para chatear, por lo que lo mejor era que fuera un nombre bonito y fácil de recordar. Se sabía que había famosos que pagaban fortunas por comprar el nombre de avatar que querían ponerse cuando algún ciberokupa lo había reservado antes que ellos.

La primera vez que creé mi cuenta en Oasis, llamé a mi avatar Wade Magno. Nombre que cambiaba unos meses después, generalmente por otro tan ridículo como el anterior. Pero desde hacía cinco años mantenía el mismo. El día que empezó La Cacería, el día que decidí convertirme en gunter, rebauticé a mi avatar con el nombre de Parzival, por el caballero de la leyenda artúrica que había encontrado el Santo Grial. Otras formas más comunes de transcribir el nombre —Perceval y Percival— ya estaban ocupadas por otros usuarios. Yo, de todos modos, prefería Parzival. Me parecía que sonaba mejor.

La gente casi nunca usaba su nombre verdadero online porque el anonimato era una de las grandes ventajas de Oasis. Dentro de la simulación nadie sabía quién eras en realidad, a menos que tú quisieras que se supiera. Gran parte de la popularidad y de la cultura de Oasis giraba en torno a ese hecho. Tu nombre verdadero, tus huellas dactilares y patrones de retina quedaban almacenados en tu cuenta en Oasis, pero Gregarious Simulation Systems mantenía esa información encriptada y confidencial. Ni siquiera los empleados de GSS tenían acceso a la verdadera identidad de un avatar. Cuando Halliday todavía dirigía la empresa, GSS había logrado que prevaleciera el derecho a no desvelar la identidad de los usuarios de Oasis tras un fallo histórico del Tribunal Supremo.

Cuando me apunté al Sistema Escolar Público de Oasis me pidieron que les facilitara mi nombre verdadero, dirección de correo electrónico y número de la Seguridad Social. La información quedó almacenada en mi perfil de estudiante, pero solo el director de mi centro podía acceder a ella. Ni los profesores ni mis compañeros de colegio sabían quién era yo, y yo no sabía quiénes eran ellos.

A los alumnos no se les permitía usar sus nombres de avatar mientras estaban en la escuela. De ese modo se evitaba que los profesores tuvieran que decir cosas ridículas del tipo: «Presta más atención Chulo-Brillantina», o «Pajilla69, ponte de pie y léenos tu comentario sobre el libro». Así pues, los alumnos debían usar sus nombres verdaderos seguidos de un número, para distinguirse de otros con quienes compartieran nombre. Cuando yo me matriculé ya había otros dos alumnos en mi escuela que se llamaban Wade, por lo que a mí me asignaron como identificación «Wade3». Ese nombre flotaba sobre la cabeza de mi avatar cada vez que me encontraba en el recinto escolar.

Sonó el timbre y en un ángulo de mi visor apareció un destello de advertencia que me informaba de que quedaban cuarenta minutos para el inicio del primer segmento de clases. Me volví y avancé por el pasillo, usando una serie de gestos sutiles con la mano para controlar los movimientos y las acciones de mi avatar. Si por lo que fuera tuviera las manos ocupadas, este también respondía a las instrucciones de voz. […]

Ready Player One – Ernest Cline

Lo que más me fastidia en este caso es que, simplemente borrando la palabra unas pocas veces, sin tener que reescribir nada, el texto funcionaría mucho mejor. Uno de los consejos más útiles que he recibido nunca a la hora de revisar un escrito es que cualquier frase que pueda ser eliminada sin comprometer la comprensión del lector o sin disminuir la información que el autor proporciona, es una frase que nunca debería haber estado en el texto. Normalmente, al escribir un borrador, tendemos a andar en círculos alrededor de ciertas ideas o hechos, lo cual suele generar frases que dicen exactamente lo mismo pero de otra manera o excesivas repeticiones de algún término. Ante la duda, mi recomendación siempre es la misma: va fuera.

Y eso es todo por hoy. Creo que con esta entrada doy por concluido mi ciclo de «aprenda Python leyendo a Steinbeck«, al menos hasta nuevo aviso…


Posted

in

,

by

This work is licensed under CC BY-NC 4.0

Comentarios

3 respuestas a «El arte de escribir bien: las repeticiones»

  1. […] El arte de escribir bien: las repeticiones — F. Soldevila […]

  2. […] El arte de escribir bien: las repeticiones — F. Soldevila […]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *