5. Similitud melódica.
5.3. Distancia de edición.
La distancia de edición [45], también llamada distancia de Levenshtein, es un método usado normalmente en el ámbito de comparación de cadenas de caracteres. Generalizando, se define la distancia de edición (normalmente se usa su nombre en inglés, edit distance) entre dos secuencias como el número
mínimo de operaciones que necesitamos para pasar de una secuencia a la otra. Estas operaciones son inserción, omisión y sustitución de un carácter de la secuencia. Esta distancia se aplica cuando queremos conocer cuán similares son dos cadenas de caracteres, como puede ser el caso de correctores ortográficos (Figura 26). 1 Sustitución letra A -> U P L U N E T A 2 Omisión letra N P L U N E T A Secuencia origen: P L A N E T A 3 Omisión letra E P L U E T A 4 Sustitución letra A -> O P L U T O 5 Inserción letra N P L U T O N Secuencia destino: P L U T O N Distancia = 5
Figura 26. Distancia de edición entre dos secuencias de caracteres.
Se puede generalizar esta definición de distancia de edición mediante la introducción de las llamadas funciones de costo. Esto consiste en asignar un peso a cada una de las operaciones antes mencionadas. De esa forma, podremos penalizar ciertas operaciones, asignándoles una función de costo con un valor alto, o suavizar otras mediante la asignación de un valor bajo. En general, para la distancia de edición, los costos que se utilizan son:
• Costo = 0, cuando se trata de una coincidencia de carácter.
• Costo = 1, si se produce una sustitución de un carácter por otro.
Para implementar esta distancia, se usa un algoritmo conocido como
Programación Dinámica [38]. Dadas las dos secuencias de caracteres A = {a1, a2,…, am} y B = {b1, b2,…, bn}, de longitudes m y n respectivamente, se construye una matriz D de tamaño (m+1,n+1) de forma recursiva, donde el elemento dij representa la distancia entre las secuencias {a1, a2,…, ai} y {b1, b2,…, bj}. Tendremos que inicializar la primera fila y la primera columna de esa matriz, de la siguiente forma:
D(i,0) = i 0 ≤ i ≤ m D(0,j)= j 0 ≤ j ≤ n
La ecuación de recurrencia que utilizamos para ir calculando la matriz es de la forma:
dij = mínimo
La distancia entre las secuencias es el elemento dmn de la matriz que hemos generado. Para realizar este algoritmo de programación dinámica, la cantidad de operaciones requeridas es del orden de m x n. En la Figura 27 tenemos un ejemplo de cálculo de la distancia de edición entre dos cadenas de caracteres.
di-1,j + 1 di,j-1 + 1
di-1,j-1 + 0, si ai =bj di-1,j-1 + 1, si ai ≠bj
P L A N E T A 0 1 2 3 4 5 6 7 P 1 0 1 2 3 4 5 6 L 2 1 0 1 2 3 4 5 U 3 2 1 1 2 3 4 5 T 4 3 2 2 2 3 3 4 O 5 4 3 3 3 3 4 4 N 6 5 4 4 4 4 4 D=5
Figura 27. Cálculo de la distancia de edición usando programación dinámica.
En nuestro caso concreto, hay que tener en cuenta una serie de consideraciones, ya que estamos trabajando con secuencias de notas, no con secuencias de caracteres alfanuméricos. Al tratarse de melodías, hay que considerar que cada carácter representa una nota, y cada nota es una combinación de altura y duración. Tendríamos que definir por tanto una distancia de edición que tenga en cuenta esas dos dimensiones.
Además, sería interesante introducir una tolerancia a los errores que se hayan podido cometer en la fase de extracción automática; para remediar esto, vamos a introducir una tolerancia de un semitono. Esto quiere decir que dos intervalos de altura que se diferencien en un semitono serán considerados equivalentes para el cálculo de la distancia de edición. El motivo de elegir un semitono como máximo error permitido es porque los errores más usuales que se cometen durante la transcripción automática se deben a las aproximaciones realizadas durante la fase de ajuste de las alturas a la escala temperada.
También hay que tener en cuenta que en la música occidental, la altura permite mayor discriminación melódica que la duración, ya que existen más
combinaciones naturales de una secuencia de n alturas que de una secuencia de n duraciones [38].
Teniendo en cuenta estas consideraciones, si definimos ai a y bj a como los intervalos exactos de altura de las dos melodías a comparar, y ai d y bj d los intervalos de duración de esas melodías, el algoritmo que vamos a implementar, que también ha sido utilizado en el trabajo [39] para la búsqueda de música en bases de datos por melodía, viene dado por la siguiente recursividad:
dij = mínimo
A continuación vamos a ver qué representa cada uno de los valores presentes en la anterior ecuación recursiva, así como el valor que van a tomar en nuestro análisis:
• El costo de una inserción viene definido por i y va a tomar el valor unidad.
• La letra o representa el costo de una omisión, y también va a valer uno.
• Una sustitución tendrá un costo representado por la letra s, que también tomará el valor igual a uno.
• El costo de una coincidencia de duración y altura se representa por la letra c. En este caso, el costo tiene valor -1.
• Por último, el costo que tiene una sustitución de duración, que viene dado por sd, tomará un valor nulo.
di-1,j + i di,j-1 + o di-1,j-1 + s
di-1,j-1 + c, si aia −bja <2 y aid−bjd <2 di-1,j-1 + sd, si aia−bja <2
Como dijimos anteriormente, vamos a introducir una tolerancia de un semitono en los intervalos de altura. Esta tolerancia puede verse reflejada en la ecuación que define el algoritmo, cuando se introduce la condición aia−bja <2 para considerar una coincidencia de duración y altura o una sustitución de duración.
Siguiendo la metodología ya expuesta, y una vez que hemos definido el algoritmo para calcular la distancia de edición, se puede consultar en el archivo
editdistance.m del Anexo todo el código fuente correspondiente al cálculo de
esta distancia para cada par de melodías. Nuevamente, vamos a obtener una matriz de distancias, que vamos a representar con colores para facilitar su consulta en la Figura 28.
Figura 28. Matriz de distancias obtenida utilizando la distancia de edición como medida de similitud. Máxima diferencia Máxima similitud Deblas Martinetes Martinetes Deblas Martinetes
La matriz de distancias obtenidas con la distancia de edición discrimina bastante bien los martinetes, como puede observarse en la Figura 28, pues presenta valores de similitud altos cuando comparamos las diferentes interpretaciones de este palo. El principal inconveniente de esta medida es el elevado coste computacional que conlleva, que se pudiera convertir en inviable si aumentáramos considerablemente las dimensiones del corpus a analizar o la duración de cada una de las piezas. En ese caso, se podría realizar una aproximación mediante función escalón, como veremos en el apartado 7, con el objetivo de reducir la carga computacional empleada en la ejecución del algoritmo.
Quizás no se trate de una medida demasiado buena para discriminar un estilo de otro, pero sí podremos utilizarla para el análisis específico de un solo cante, pudiendo estudiar su evolución y las influencias ejercidas por algunos cantaores sobre otros. Esto se verá más detenidamente en el apartado de Análisis filogenético.