stringtranslate.com

Transformación de Burrows-Wheeler

La transformada de Burrows-Wheeler ( BWT , también llamada compresión por ordenamiento de bloques ) reorganiza una cadena de caracteres en secuencias de caracteres similares. Esto es útil para la compresión, ya que tiende a ser fácil comprimir una cadena que tiene secuencias de caracteres repetidos mediante técnicas como la transformada de movimiento al frente y la codificación por longitud de secuencia . Más importante aún, la transformación es reversible , sin necesidad de almacenar ningún dato adicional excepto la posición del primer carácter original. La BWT es, por tanto, un método "gratuito" para mejorar la eficiencia de los algoritmos de compresión de texto, que solo cuesta algunos cálculos adicionales. La transformada de Burrows-Wheeler es un algoritmo utilizado para preparar datos para su uso con técnicas de compresión de datos como bzip2 . Fue inventado por Michael Burrows y David Wheeler en 1994 mientras Burrows trabajaba en el Centro de Investigación de Sistemas DEC en Palo Alto , California. Se basa en una transformación inédita descubierta por Wheeler en 1983. El algoritmo se puede implementar de manera eficiente utilizando una matriz de sufijos, alcanzando así una complejidad temporal lineal. [1]

Descripción

Cuando BWT transforma una cadena de caracteres , la transformación permuta el orden de los caracteres. Si la cadena original tenía varias subcadenas que se repetían con frecuencia, la cadena transformada tendrá varios lugares en los que un mismo carácter se repite varias veces seguidas.

Por ejemplo:

La salida es más fácil de comprimir porque tiene muchos caracteres repetidos. En este ejemplo, la cadena transformada contiene seis secuencias de caracteres idénticos: XX, SS, PP, .., IIy III, que juntas forman 13 de los 44 caracteres.

Ejemplo

La transformación se realiza ordenando todos los desplazamientos circulares de un texto en orden lexicográfico y extrayendo la última columna y el índice de la cadena original en el conjunto de permutaciones ordenadas de S.

Dada una cadena de entrada (paso 1 en la tabla siguiente), rótela N veces (paso 2), donde es la longitud de la cadena considerando también el carácter rojo que representa el inicio de la cadena y el carácter rojo que representa el puntero ' EOF '; estas rotaciones, o desplazamientos circulares, se ordenan luego lexicográficamente (paso 3). La salida de la fase de codificación es la última columna después del paso 3 y el índice (basado en 0) de la fila que contiene la cadena original , en este caso .S = ^BANANA$N = 8S^$L = BNN^AA$AISI = 6

No es necesario utilizar ambos $, ^pero se debe utilizar al menos uno, de lo contrario no podemos invertir la transformación, ya que todas las permutaciones circulares de una cadena tienen la misma transformación de Burrows-Wheeler.

El siguiente pseudocódigo ofrece una forma sencilla (aunque ineficiente) de calcular la BWT y su inversa. Supone que la cadena de entrada scontiene un carácter especial 'EOF', que es el último carácter y no aparece en ningún otro lugar del texto.

función BWT ( cadena s) Crea una tabla, donde las filas son todas las rotaciones posibles de s ordenar filas alfabéticamente regresar (ultima columna de la tabla)
función inversaBWT ( cadena s) crear tabla vacía repetir longitud(es) veces // la primera inserción crea la primera columna Insertar s como una columna de la tabla antes de la primera columna de la tabla Ordenar las filas de la tabla alfabéticamente regresar (fila que termina con el carácter 'EOF')

Explicación

Para entender por qué esto crea datos más fáciles de comprimir, considere transformar un texto largo en inglés que contenga frecuentemente la palabra "the". Ordenar las rotaciones de este texto agrupará las rotaciones que comiencen con "he", y el último carácter de esa rotación (que también es el carácter antes de "he") generalmente será "t", por lo que el resultado de la transformación contendrá una cantidad de caracteres "t" junto con las excepciones quizás menos comunes (como si contiene "ache") mezcladas. Por lo tanto, se puede ver que el éxito de esta transformación depende de que un valor tenga una alta probabilidad de aparecer antes de una secuencia, por lo que en general necesita muestras bastante largas (al menos unos pocos kilobytes) de datos apropiados (como texto).

Lo notable del BWT no es que genere una salida más fácil de codificar (una clasificación normal haría eso), sino que lo hace de manera reversible , permitiendo que el documento original se vuelva a generar a partir de los datos de la última columna.

La operación inversa se puede entender de esta manera. Tome la tabla final en el algoritmo BWT y borre todas las columnas excepto la última. Con solo esta información, puede reconstruir fácilmente la primera columna. La última columna le indica todos los caracteres del texto, por lo que simplemente ordene estos caracteres alfabéticamente para obtener la primera columna. Luego, la última y la primera columnas (de cada fila) juntas le brindan todos los pares de caracteres sucesivos en el documento, donde los pares se toman cíclicamente de modo que el último y el primer carácter forman un par. Al ordenar la lista de pares, se obtienen la primera y la segunda columna. Continuando de esta manera, puede reconstruir la lista completa. Luego, la fila con el carácter "fin de archivo" al final es el texto original. La inversión del ejemplo anterior se realiza de la siguiente manera:

Mejoramiento

Una serie de optimizaciones pueden hacer que estos algoritmos se ejecuten de manera más eficiente sin cambiar la salida. No es necesario representar la tabla ni en el codificador ni en el decodificador. En el codificador, cada fila de la tabla se puede representar mediante un único puntero a las cadenas, y la ordenación se puede realizar utilizando los índices. En el decodificador, tampoco es necesario almacenar la tabla y, de hecho, no se necesita ninguna ordenación. En un tiempo proporcional al tamaño del alfabeto y la longitud de la cadena, la cadena decodificada se puede generar un carácter a la vez de derecha a izquierda. Un "carácter" en el algoritmo puede ser un byte, un bit o cualquier otro tamaño conveniente.

También se puede observar que, matemáticamente, la cadena codificada se puede calcular como una simple modificación de la matriz de sufijos , y las matrices de sufijos se pueden calcular con tiempo lineal y memoria. La BWT se puede definir con respecto a la matriz de sufijos SA del texto T como (indexación basada en 1):

[3]

No es necesario tener un carácter 'EOF' real. En su lugar, se puede utilizar un puntero que recuerde dónde estaría el 'EOF' en una cadena si existiera. En este enfoque, la salida de la BWT debe incluir tanto la cadena transformada como el valor final del puntero. La transformación inversa luego la reduce al tamaño original: se le da una cadena y un puntero, y devuelve solo una cadena.

Se puede encontrar una descripción completa de los algoritmos en el artículo de Burrows y Wheeler, o en varias fuentes en línea. [1] Los algoritmos varían un poco según si se utiliza EOF y en qué dirección se realizó la clasificación. De hecho, la formulación original no utilizaba un marcador EOF. [4]

Variante biyectiva

Dado que cualquier rotación de la cadena de entrada dará como resultado la misma cadena transformada, la BWT no se puede invertir sin agregar un marcador EOF al final de la entrada o hacer algo equivalente, lo que permite distinguir la cadena de entrada de todas sus rotaciones. Aumentar el tamaño del alfabeto (agregando el carácter EOF) hace que los pasos de compresión posteriores sean complicados.

Existe una versión biyectiva de la transformación, mediante la cual la cadena transformada identifica de forma única a la original, y las dos tienen la misma longitud y contienen exactamente los mismos caracteres, sólo que en un orden diferente. [5] [6]

La transformación biyectiva se calcula factorizando la entrada en una secuencia no creciente de palabras Lyndon ; dicha factorización existe y es única según el teorema de Chen–Fox–Lyndon [7] y puede encontrarse en tiempo lineal y espacio constante. [8] El algoritmo ordena las rotaciones de todas las palabras; como en la transformación de Burrows–Wheeler, esto produce una secuencia ordenada de n cadenas. La cadena transformada se obtiene entonces eligiendo el carácter final de cada cadena en esta lista ordenada. La única salvedad importante aquí es que las cadenas de diferentes longitudes no se ordenan de la forma habitual; las dos cadenas se repiten para siempre y las repeticiones infinitas se ordenan. Por ejemplo, "ORO" precede a "OR" porque "OROORO..." precede a "OROROR...".

Por ejemplo, el texto " ^ BANANA $ " se transforma en "ANNBAA ^ $ " mediante estos pasos (el carácter $ rojo indica el puntero EOF ) en la cadena original. El carácter EOF no es necesario en la transformación biyectiva, por lo que se omite durante la transformación y se vuelve a agregar a su lugar correspondiente en el archivo.

La cadena se divide en palabras de Lyndon, de modo que las palabras de la secuencia se ordenan de manera decreciente utilizando el método de comparación anterior. (Tenga en cuenta que estamos ordenando " ^ " como caracteres sucesivos). " ^ BANANA" se convierte en ( ^ ) (B) (AN) (AN) (A).

Hasta el último paso, el proceso es idéntico al proceso inverso de Burrows-Wheeler, pero aquí no necesariamente dará rotaciones de una sola secuencia; en cambio, da rotaciones de palabras de Lyndon (que comenzarán a repetirse a medida que continúa el proceso). Aquí, podemos ver (repeticiones de) cuatro palabras de Lyndon distintas: (A), (AN) (dos veces), (B) y ( ^ ). (NANA... no representa una palabra distinta, ya que es un ciclo de ANAN...) En este punto, estas palabras se ordenan en orden inverso: ( ^ ), (B), (AN), (AN), (A). Luego, se concatenan para obtener

^ PLATAFORMA

La transformación de Burrows-Wheeler puede considerarse un caso especial de esta transformación biyectiva: en lugar de la tradicional introducción de una nueva letra ajena a nuestro alfabeto para indicar el final de la cadena, podemos introducir una nueva letra que precede a todas las letras existentes y que se coloca al principio de la cadena. La cadena completa es ahora una palabra Lyndon y, por lo tanto, al ejecutarla a través del proceso biyectivo se obtendrá un resultado transformado que, al invertirse, devuelve la palabra Lyndon, sin necesidad de volver a ensamblarla al final.

De manera similar, el texto transformado solo diferirá del resultado de BWT en un carácter por cada palabra de Lyndon; por ejemplo, si la entrada se descompone en seis palabras de Lyndon, la salida solo diferirá en seis caracteres. Por ejemplo, al aplicar la transformación biyectiva se obtiene:

La transformación biyectiva incluye ocho series de caracteres idénticos. Estas series son, en orden: XX, II, XX, PP, .., EE, .., y IIII.

En total se utilizan 18 caracteres en estas ejecuciones.

Transformación dinámica de Burrows-Wheeler

Cuando se edita un texto, su transformada de Burrows-Wheeler cambiará. Salson et al. [9] proponen un algoritmo que deduce la transformada de Burrows-Wheeler de un texto editado a partir de la del texto original, realizando un número limitado de reordenamientos locales en la transformada de Burrows-Wheeler original, lo que puede ser más rápido que construir directamente la transformada de Burrows-Wheeler del texto editado.

Ejemplo de implementación

Esta implementación de Python sacrifica velocidad por simplicidad: el programa es corto, pero requiere más tiempo del que sería deseable en una implementación práctica. Básicamente, hace lo mismo que la sección de pseudocódigo.

Utilizando los códigos de control STX/ETX para marcar el inicio y el final del texto, y utilizando s[i:] + s[:i]para construir la irotación th de s, la transformada hacia adelante toma el último carácter de cada una de las filas ordenadas:

desde  curses.ascii  importar  STX ,  ETXdef  bwt ( s :  str ,  start = chr ( STX ),  end = chr ( ETX ))  ->  str : r """  Aplicar la transformada de Burrows–Wheeler a la cadena de entrada.  >>> bwt('BANANA')  '\x03ANNB\x02AA'  >>> bwt('BANANA', start='^', end='$')  'ANNB^AA$'  >>> bwt('BANANA', start='%', end='$')  'A$NNB%AA'  """  assert  (  start  not  in  s  and  end  not  in  s  ),  "La cadena de entrada no puede contener caracteres STX y ETX"  s  =  f " { start }{ s }{ end } "  # Agregar marcador de inicio y fin de texto # Tabla de rotaciones de cadenas  table  =  sorted ( f " { s [ i :] }{ s [: i ] } "  for  i ,  c  in  enumerate ( s ))  last_column  =  [ row [ - 1 :]  for  row  in  table ]  # Últimos caracteres de cada fila  return  "" . join ( last_column )  # Convertir lista de caracteres en cadena

La transformación inversa inserta repetidamente rla columna izquierda de la tabla y ordena la tabla. Una vez que se crea toda la tabla, devuelve la fila que termina con ETX, menos STX y ETX.

def  inverse_bwt ( r :  str ,  start = chr ( STX ),  end = chr ( ETX ))  ->  str : r """  Aplicar la transformada inversa de Burrows–Wheeler.  >>> inverse_bwt('\x03ANNB\x02AA')  'BANANA'  >>> inverse_bwt('ANNB^AA$', start='^', end='$')  'BANANA'  >>> inverse_bwt('A$NNB%AA', start='%', end='$')  'BANANA'  """  str_len  =  len ( r )  table  =  [ "" ]  *  str_len  # Crea una tabla vacía  para  _  en  el rango ( str_len ):  table  =  sorted ( rc  +  tc  for  rc ,  tc  in  zip ( r ,  table ))  # Agrega una columna de r # Iterar y verificar si el último carácter termina con ETX o no  s  =  next (( fila  por  fila  en  la tabla  si  fila . endswith ( fin )),  "" ) # Recupera datos de la matriz y elimina los marcadores de inicio y fin  return  s . rstrip ( end ) . strip ( start )

Siguiendo las notas de implementación de Manzini, es equivalente a utilizar un sufijo de carácter nulo simple en su lugar. La clasificación debe realizarse en orden colexicográfico (cadena leída de derecha a izquierda), es decir, en Python. [4] (Los códigos de control anteriores en realidad no cumplen con que EOF sea el último carácter; los dos códigos son en realidad el primero . La rotación se mantiene de todos modos).sorted(..., key=lambda s: s[::-1])

Aplicaciones de BWT

Como algoritmo de compresión sin pérdidas , la transformada de Burrows-Wheeler ofrece la importante cualidad de que su codificación es reversible y, por lo tanto, los datos originales pueden recuperarse de la compresión resultante. La cualidad sin pérdidas del algoritmo de Burrows ha permitido que se utilicen diferentes algoritmos con diferentes propósitos. Por nombrar algunos, la transformada de Burrows-Wheeler se utiliza en algoritmos de alineación de secuencias , compresión de imágenes , compresión de datos , etc. A continuación, se incluye una recopilación de algunos usos dados a la transformada de Burrows-Wheeler.

BWT para alineación de secuencias

La llegada de las técnicas de secuenciación de nueva generación (NGS) a finales de la década de 2000 ha dado lugar a otra aplicación de la transformación de Burrows-Wheeler. En la NGS, el ADN se fragmenta en pequeños trozos, de los que se secuencian las primeras bases , lo que produce varios millones de "lecturas", cada una de entre 30 y 500 pares de bases ("caracteres del ADN") de longitud. En muchos experimentos, por ejemplo, en ChIP-Seq , la tarea consiste ahora en alinear estas lecturas con un genoma de referencia , es decir, con la secuencia conocida, casi completa, del organismo en cuestión (que puede tener hasta varios miles de millones de pares de bases de longitud). Se publicaron varios programas de alineamiento, especializados para esta tarea, que inicialmente se basaban en el hash (por ejemplo, Eland, SOAP, [10] o Maq [11] ). En un esfuerzo por reducir el requisito de memoria para la alineación de secuencias, se desarrollaron varios programas de alineación ( Bowtie , [12] BWA, [13] y SOAP2 [14] ) que utilizan la transformada de Burrows-Wheeler.

BWT para compresión de imágenes

La transformación de Burrows-Wheeler ha demostrado ser fundamental para las aplicaciones de compresión de imágenes . Por ejemplo, [15] mostró una secuencia de compresión basada en la aplicación de la transformación de Burrows-Wheeler seguida de codificadores de inversión, longitud de ejecución y aritméticos. La secuencia desarrollada en este caso se conoce como transformada de Burrows-Wheeler con un codificador de inversión (BWIC). Se ha demostrado que los resultados mostrados por BWIC superan el rendimiento de compresión de algoritmos conocidos y ampliamente utilizados como Lossless JPEG y JPEG 2000. Se ha demostrado que BWIC supera a aquellos en términos de tamaño de compresión final de imágenes médicas de radiografía en el orden del 5,1% y el 4,1% respectivamente. Las mejoras se logran combinando BWIC y un escaneo previo a BWIC de la imagen en forma de serpiente vertical. Más recientemente, trabajos adicionales como el de [16] han demostrado que la implementación de la Transformada de Burrows-Wheeler junto con la conocida transformada de movimiento al frente (MTF) logra una compresión de imágenes casi sin pérdidas.

BWT para la compresión de bases de datos genómicas

Cox et al. [17] presentaron un esquema de compresión genómica que utiliza BWT como algoritmo aplicado durante la primera etapa de compresión de varios conjuntos de datos genómicos, incluida la información genómica humana. Su trabajo propuso que la compresión BWT podría mejorarse mediante la inclusión de un mecanismo de compresión de segunda etapa llamado codificación similar a la anterior ("SAP"), que aprovecha el hecho de que los sufijos de dos o más letras de prefijo pueden ser iguales. Con el mecanismo de compresión BWT-SAP, Cox et al. demostraron que en la base de datos genómica ERA015743, de 135,5 GB de tamaño, el esquema de compresión BWT-SAP comprime el conjunto de datos ERA015743 en alrededor del 94 %, a 8,2 GB.

BWT para predicción de secuencias

También se ha demostrado que BWT es útil en la predicción de secuencias, que es un área de estudio común en el aprendizaje automático y el procesamiento del lenguaje natural . En particular, Ktistakis et al. [18] propusieron un esquema de predicción de secuencias llamado SuBSeq que explota la compresión sin pérdida de datos de la transformada de Burrows-Wheeler. SuBSeq explota BWT extrayendo el índice FM y luego realizando una serie de operaciones llamadas búsqueda hacia atrás, búsqueda hacia adelante, expansión de vecinos y obtención de consecuencias para buscar predicciones dado un sufijo . Luego, las predicciones se clasifican en función de un peso y se colocan en una matriz de la cual se proporciona el elemento con el peso más alto como la predicción del algoritmo SuBSeq. Se ha demostrado que SuBSeq supera a los algoritmos de última generación para la predicción de secuencias tanto en términos de tiempo de entrenamiento como de precisión.

Referencias

  1. ^ ab Burrows, Michael ; Wheeler, David J. (10 de mayo de 1994), Un algoritmo de compresión de datos sin pérdida mediante ordenación de bloques, Informe técnico 124, Digital Equipment Corporation, archivado desde el original el 5 de enero de 2003
  2. ^ "adrien-mogenet/scala-bwt". GitHub . Consultado el 19 de abril de 2018 .
  3. ^ Simpson, Jared T.; Durbin, Richard (15 de junio de 2010). "Construcción eficiente de un grafo de cadenas de ensamblaje utilizando el índice FM". Bioinformática . 26 (12): i367–i373. doi :10.1093/bioinformatics/btq217. ISSN  1367-4803. PMC 2881401 . PMID  20529929. 
  4. ^ ab Manzini, Giovanni (18 de agosto de 1999). "La transformada de Burrows-Wheeler: teoría y práctica" (PDF) . Fundamentos matemáticos de la informática 1999: 24.º simposio internacional, MFCS'99 Szklarska Poreba, Polonia, 6-10 de septiembre de 1999. Actas . Springer Science & Business Media. ISBN 9783540664086. Archivado (PDF) del original el 9 de octubre de 2022.
  5. ^ Gil, J.; Scott, DA (2009), Una transformación de ordenamiento de cadenas biyectiva (PDF) , archivado desde el original (PDF) el 2011-10-08 , consultado el 2009-07-09
  6. ^ Kufleitner, Manfred (2009), "Sobre las variantes biyectivas de la transformada de Burrows-Wheeler", en Holub, Jan; Žďárek, Jan (eds.), Conferencia de cuerdas de Praga, págs. 65–69, arXiv : 0908.0239 , Bibcode :2009arXiv0908.0239K.
  7. ^ * Lothaire, M. (1997), Combinatoria de palabras , Enciclopedia de matemáticas y sus aplicaciones, vol. 17, Perrin, D.; Reutenauer, C.; Berstel, J.; Pin, JE; Pirillo, G.; Foata, D.; Sakarovitch, J.; Simon, I.; Schützenberger, MP; Choffrut, C.; Cori, R.; Lyndon, Roger; Rota, Gian-Carlo. Prólogo de Roger Lyndon (2.ª ed.), Cambridge University Press , pág. 67, ISBN 978-0-521-59924-5, Zbl  0874.20040
  8. ^ Duval, Jean-Pierre (1983), "Factorización de palabras sobre un alfabeto ordenado", Journal of Algorithms , 4 (4): 363–381, doi :10.1016/0196-6774(83)90017-2, ISSN  0196-6774, Zbl  0532.68061.
  9. ^ Salson M, Lecroq T, Léonard M, Mouchard L (2009). "Un algoritmo de cuatro etapas para actualizar una transformada de Burrows-Wheeler". Ciencias de la computación teórica . 410 (43): 4350–4359. doi : 10.1016/j.tcs.2009.07.016 .
  10. ^ Li R; et al. (2008). "SOAP: programa de alineamiento de oligonucleótidos cortos". Bioinformática . 24 (5): 713–714. doi : 10.1093/bioinformatics/btn025 . PMID  18227114.
  11. ^ Li H, Ruan J, Durbin R (19 de agosto de 2008). "Mapeo de lecturas de secuenciación de ADN cortas y determinación de variantes mediante puntajes de calidad de mapeo". Genome Research . 18 (11): 1851–1858. doi :10.1101/gr.078212.108. PMC 2577856 . PMID  18714091. 
  12. ^ Langmead B, Trapnell C, Pop M, Salzberg SL (2009). "Alineamiento ultrarrápido y con memoria eficiente de secuencias cortas de ADN con el genoma humano". Genome Biology . 10 (3): R25. doi : 10.1186/gb-2009-10-3-r25 . PMC 2690996 . PMID  19261174. 
  13. ^ Li H, Durbin R (2009). "Alineación rápida y precisa de lecturas cortas con la transformada de Burrows–Wheeler". Bioinformática . 25 (14): 1754–1760. doi :10.1093/bioinformatics/btp324. PMC 2705234 . PMID  19451168. 
  14. ^ Li R; et al. (2009). "SOAP2: una herramienta ultrarrápida mejorada para la alineación de lecturas cortas". Bioinformática . 25 (15): 1966–1967. doi :10.1093/bioinformatics/btp336. PMID  19497933.
  15. ^ Collin P, Arnavut Z, Koc B (2015). "Compresión sin pérdida de imágenes médicas mediante la transformación de Burrows-Wheeler con codificador de inversión". 2015 37.ª Conferencia internacional anual de la IEEE Engineering in Medicine and Biology Society (EMBC) . Vol. 2015. págs. 2956–2959. doi :10.1109/EMBC.2015.7319012. ISBN. 978-1-4244-9271-8. Número de identificación personal  26736912. Número de identificación personal  4460328.
  16. ^ Devadoss CP, Sankaragomathi B (2019). "Compresión de imágenes médicas casi sin pérdida mediante técnicas de compresión fractal híbrida y BWT-MTF en bloque". Computación en clúster . 22 : 12929–12937. doi :10.1007/s10586-018-1801-3. S2CID  33687086.
  17. ^ Cox AJ, Bauer MJ, Jakobi T, Rosone G (2012). "Compresión a gran escala de bases de datos de secuencias genómicas con la transformada de Burrows-Wheeler". Bioinformática . 28 (11). Oxford University Press: 1415–1419. arXiv : 1205.0192 . doi :10.1093/bioinformatics/bts173. PMID  22556365.
  18. ^ Ktistakis R, Fournier-Viger P, Puglisi SJ, Raman R (2019). "Predicción de secuencias sucinta basada en BWT". Aplicaciones de bases de datos y sistemas expertos . Apuntes de clase en informática. Vol. 11707. págs. 91–101. doi :10.1007/978-3-030-27618-8_7. ISBN 978-3-030-27617-1.S2CID201058996  .​

Enlaces externos