XV Congreso Internacional sobre Innovación y Desarrollo Tecnológico, 2 al 4 de octubre de 2019, Cuernavaca Morelos, México. Búsqueda de Cadenas en Textos Usando Árboles de Decisión S. González1,a, J. Ruiz1,b 1 Centro Nacional de Investigación y Desarrollo Tecnológico, Depto. de Ciencias Computacionales a [email protected], b [email protected] Resumen— Se presenta un algoritmo para detectar de forma simultánea múltiples cadenas en textos largos, el cual utiliza árboles de decisión. Se compara su eficiencia con la de otros algoritmos de búsqueda de cadenas, para los casos de letras que representan información genética y para texto en general. Los experimentos demuestran que los árboles de decisión no son prácticos para detectar o buscar cadenas largas, pero presentan una interesante alternativa en textos cortos (menos de 8 letras), si no se tiene en cuenta el costo de la generación de los árboles de decisión. Los nucleótidos en el ADN sufren algunos cambios o mutaciones, entre ellos están los reemplazos, inserciones y supresiones, lo cual crea variantes a una secuencia de nucleótidos, por lo que en bioinformática es útil la búsqueda simultánea de varias cadenas. Por otro lado, los árboles de decisión permiten clasificar objetos, y existen algoritmos para generarlos automáticamente usando colecciones de objetos, como el ID3 [15]. Palabras clave. Búsqueda de cadenas, Árboles de Decisión, ID3, Bioinformática, Comodines. En este documento se explora utilizar árboles de decisión para clasificar segmentos de texto en la clase que contienen a una colección de cadenas, y la clase que no las contienen, lo que resulta en un algoritmo para detectar o buscar múltiples cadenas simultáneamente en el texto, con la expectativa de que realice una menor cantidad de accesos al texto que otros algoritmos. Una posible ventaja de usar árboles de decisión es que se pueden paralelizar, ya que cada segmento se puede procesar en paralelo, además de que aprenden de forma natural las peculiaridades de las cadenas usadas en su generación o entrenamiento. El algoritmo resultante se compara con otros tres algoritmos populares en la literatura con respecto al número de accesos que realizan en el texto. 1. Introducción En este trabajo se denomina “cadena” a la secuencia de caracteres o letras que se busca, y “texto” a la secuencia de caracteres o letras en la que se realiza la búsqueda. La búsqueda de cadenas en textos es una operación básica, y cuando se realiza en textos largos la eficiencia cobra especial importancia. Las últimas mejoras en estos algoritmos son en usar búsquedas predictivas [1] y en aprovechar los procesadores gráficos o GPU de las computadoras [2]. En algunos casos, la lectura de elementos de textos puede ser costosa, por ejemplo, cuando los textos están almacenados en medios relativamente lentos o cuando las letras representan a vectores de características y su identificación es costosa, razón por la cual en este trabajo se utiliza como medida de costo la cantidad de accesos a las letras del texto. 2. Algoritmo de detección de cadenas usando árboles de decisión Un árbol de decisión clasifica un objeto representado con un conjunto de atributos. En este caso el objeto es un segmento de texto, es decir, una porción del texto completo, y sus atributos son las letras. El tamaño del segmento es cuando menos el tamaño de la cadena más grande a buscar, sin un valor máximo, pero mientras más grande sea el segmento más grande es el árbol de decisión. Además, los segmentos se intersecan para garantizar que una copia completa de la cadena se encuentre en un segmento. Los segmentos y su solapamiento se representan en la Fig. 1. La búsqueda puede ser de una cadena, como el algoritmo Boyer-Moore [3] y el Knuth–Morris–Pratt [4], que usan tablas de desplazamiento para saltar porciones del texto en la búsqueda. También puede ser de varias cadenas de forma simultánea, como el algoritmo de Aho-Corasick [5], que usa autómatas finitos deterministas (AFD), los que mezclan las ideas de los AFD y las tablas de desplazamiento [6][7][8]; los algoritmos que realizan búsquedas aproximadas [9][10]; los algoritmos que preprocesan [11] y los que indexan [12][13] al texto para acelerar múltiples búsquedas posteriores, entre otros. Segmento1 La bioinformática [14] también utiliza algoritmos de búsqueda de cadenas, ya que los nucleótidos del ácido desoxirribonucleico (ADN), Adenina, Timina, Guanina y Citosina, se representan con las letras A, T, G y C respectivamente, y el ADN se puede representar con un texto largo formado por esas letras. Segmento2 Solapamiento = 𝑚 − 1 Fig. 1. División de un texto en segmentos, donde “m” es el tamaño de la cadena más larga 1 XV Congreso Internacional sobre Innovación y Desarrollo Tecnológico, 2 al 4 de octubre de 2019, Cuernavaca Morelos, México. Cuando el texto no se pueda dividir en un número entero de segmentos, se pueden elegir varias estrategias: insertar una letra de relleno hasta completar el segmento, solapar en más de “𝑚 − 1” letras al último segmento con el penúltimo, entrenar árboles de decisión para diferentes tamaños de segmento, o utilizar otro algoritmo para el último segmento. La opción elegida es solapar al último segmento en más de “𝑚 − 1” letras. La cadena se busca en cada segmento de forma consecutiva, es decir, primero en el segmento inicial, después en el siguiente, y así sucesivamente. reemplazos para el ejemplo anterior. La letra cursiva indica los casos que se descartan por estar ya incluidos previamente (sin tomar en cuenta su clase). TABLA I. EJEMPLO DE REEMPLAZO DE OBJETOS CON COMODINES A OBJETOS SIMPLES AA*|1 *AA|1 ***|0 A. Entrenamiento del árbol de decisión El árbol de decisión se entrena con el algoritmo ID3, y el conjunto de datos se obtiene poniendo las cadenas que se buscan en todas las posiciones posibles dentro del segmento y rellenando las letras restantes con todas las combinaciones posibles. AAA|1 AA_|1 AAA|1 _AA|1 AAA|0 _AA|0 AA_|0 _A_|0 A_A|0 _ _A|0 A_ _|0 _ _ _|0 Después de reemplazar los comodines y descartar los repetidos, el conjunto de entrenamiento para el ejemplo anterior queda: {AAA|1 , AA_|1 , _AA|1 , A_A|0 , A_ _|0 , _A_|0 , _ _A|0 , _ _ _|0}. Un aspecto importante en el algoritmo es la generación del alfabeto reducido, el cual consta de todas las letras diferentes usadas en las cadenas a buscar, y en caso de que no sean todas las letras diferentes posibles en el texto (el alfabeto completo), una letra “diferente”, representada con un “_”, se agrega al alfabeto reducido. El proceso se repite para cada cadena que se busca de forma simultánea. Si se desea además diferenciar las cadenas encontradas, a cada una de ellas se le puede poner una clase distinta, pero hay que tener en cuenta que: si hay más de una cadena en el segmento, la clase encontrada será sólo la clase correspondiente a una de ellas, y se ignorarán las demás. Por ejemplo, si la cadena a buscar es “AA”, y el alfabeto completo es {A,G,T,C}, entonces el alfabeto reducido es {A,_}, donde el símbolo “_” representa a cualquiera opción que no sea “A”, es decir, “G”, “T” y “C”, y el conjunto de entrenamiento y el árbol de decisión sólo utilizan el alfabeto reducido. 3. Metodología Se generaron aleatoriamente textos de 1000 letras para buscar en ellos, y cadenas de tamaños 4, 6 y 8 letras para buscarlas en el texto. Se puso una de las cadenas generadas al final del texto para que siempre fuera encontrada. El proceso anterior se realizó con dos alfabetos, uno de 4 letras y otro de 27. Un paso intermedio para generar las cadenas de entrenamiento es usar comodines, donde un comodín representa a todas las letras posibles, y se representa con un “*”. Debido a que los árboles de decisión necesitan operar con segmentos de texto de tamaño fijo, se dividió el texto en segmentos de tamaños relativos de 1 hasta 3 veces el tamaño de la cadena a buscar. Se entrenaron los árboles de decisión y se realizaron las búsquedas. Se eligió el tamaño relativo del segmento que produce una menor cantidad promedio de accesos y un segmento más pequeño, ya que mientras más grande el segmento más costoso el entrenamiento del árbol de decisión. Este tamaño relativo es que se utiliza en las siguientes comparaciones. Por ejemplo, si para el alfabeto anterior la cadena a buscar es “AA” y el tamaño del segmento es 3, entonces el conjunto de entrenamiento queda: AA*|1 *AA|1 * * *|0 Donde el símbolo “|” separa a la plantilla (lado izquierdo) de su clase (lado derecho). Además, el alfabeto reducido queda {A,_}. Se comparó la cantidad de accesos promedio del algoritmo desarrollado con los siguientes algoritmos de búsqueda de cadena: Para traducir estas plantillas a casos de entrenamiento, se reemplazan los comodines por todos los valores que puedan tomar, incluyendo “_”. Al realizar el reemplazo, se descartan aquellos casos que ya estén incluidos en las plantillas previas, ya que se trata de una lista ordenada. La Tabla I indica los • 2 Boyer-Moore [3], que busca una sola cadena en un texto y realiza desplazamientos para acelerar la búsqueda. El XV Congreso Internacional sobre Innovación y Desarrollo Tecnológico, 2 al 4 de octubre de 2019, Cuernavaca Morelos, México. ∑ 𝑎 /𝑝 ̅̅̅ 𝑇𝑘 = 𝑖 𝑖 código del algoritmo [16] se modificó para incrementar un contador en cada acceso a una letra del texto. Aho-Corasick [5], que usa AFD y busca múltiples cadenas simultáneamente. El AFD se puede realizar a mano o con un compilador [17]. Wu-Manber [7], que busca múltiples cadenas simultáneamente, realiza desplazamientos para acelerar la búsqueda, y utiliza funciones hash con las letras. El código del algoritmo [18] se modificó para incrementar un contador cada que se usa una letra del texto en las funciones hash, cada que se comparan los códigos hash, y cada que se comparan las letras restantes una vez que se encuentran códigos hash coincidentes. • • Donde “𝑎𝑖 ” es la cantidad de accesos de la i-ésima búsqueda, “𝑝𝑖 ” es la posición de la cadena en esa búsqueda, ̅̅̅𝑘 ” es el costo “𝑛” es la cantidad de búsquedas (100), y “𝑇 promedio para la longitud relativa de segmento “𝑙”. 𝑘= 𝑙 (2) 𝑚 Donde “𝑙” es la longitud del segmento, “𝑚” es longitud de la cadena, y “𝑘” es la longitud relativa del segmento. De la misma manera, la Fig. 3 grafica el costo ponderado promedio (1) con respecto a la longitud relativa del segmento (2), para el caso de búsquedas simultáneas de tres cadenas de la misma longitud (4, 6 y 8 letras) y un alfabeto de 4 letras. Como el algoritmo Boyer-Moore sólo busca una cadena a la vez, las pruebas se dividieron en dos lotes: en uno se generó una cadena aleatoria para buscar en el texto, y en el otro se realizaron 2 mutaciones a la cadena aleatoria generándose así 3 cadenas para buscar de forma simultánea. En el primer lote se incluye al algoritmo Boyer-Moore en la comparación, en el segundo se descarta. 4 letras 6 letras 8 letras 2 1.5 Se realizaron 100 pruebas para cada combinación, y se promediaron los resultados. 1 4. Resultados 0.5 La Fig. 2 muestra cómo se comporta la cantidad de accesos con respecto a la longitud del segmento, para un alfabeto de 4 letras y la búsqueda de una cadena. Se obtuvo generando 100 textos aleatorios con sus respectivas 100 cadenas a buscar, contando cuantos accesos a las letras del texto se realizaron, y dividiendo ese valor entre la posición de la cadena en el texto (eje vertical), eso para cada longitud de segmento (eje horizontal), desde la misma longitud de la cadena hasta casi tres veces ese valor, dividido entre la longitud de la cadena. Las longitudes de cadena usadas son de 4, 6 y 8 letras, y cada caso genera un trazo en la Fig. 2. Sus ejes vertical y horizontal se ilustran con las ecuaciones 1 y 2 respectivamente. 4 letras 6 letras 0 0 8 letras 0.5 0 2 3 2 3 4 Con el alfabeto de 27 letras, la cantidad de datos para entrenar los árboles de decisión empezaron a crecer demasiado, más de lo que variables de 64 bits pueden almacenar, por lo que no se realizaron las pruebas para todos los casos. Las pruebas realizadas se muestran en la Fig. 4, en donde se grafican al mismo tiempo todas las longitudes de cadena y cantidad de cadenas simultáneas (una y tres). 1 1 1 Fig. 3. Promedio de comparaciones ponderadas con respecto a la longitud relativa del segmento, para alfabeto de 4 letras y tres cadenas simultáneas. 1.5 0 (1) 𝑛 4 Fig. 2. Promedio de comparaciones ponderadas con respecto a la longitud relativa del segmento, para alfabeto de 4 letras y una cadena. 3 XV Congreso Internacional sobre Innovación y Desarrollo Tecnológico, 2 al 4 de octubre de 2019, Cuernavaca Morelos, México. 4 letras 1 cadena 6 letras, 1 cadena 8 letras, 1 cadena 4 letras 3 cadenas 6 letras, 3 cadenas 8 letras, 3 cadenas TABLA II. PROMEDIOS PONDERADOS DE LA CANTIDAD DE ACCESOS PARA LA BÚSQUEDA DE UNA CADENA CON ALFABETOS DE CUATRO LETRAS 𝑚 4 6 8 1.5 1 0.5 AD 0.64 0.46 0.36 AC 1 1 1 WM 1.7 0.82 0.55 BM 0.59 0.41 0.36 La Tabla III compara los algoritmos para el caso de un alfabeto de 4 letras y la búsqueda de tres cadenas simultáneas. 0 0 0.5 1 1.5 2 2.5 3 TABLA III. PROMEDIOS PONDERADOS DE LA CANTIDAD DE ACCESOS PARA LA BÚSQUEDA DE TRES CADENAS SIMULTÁNEAS CON ALFABETOS DE CUATRO LETRAS Fig. 4. Promedio de comparaciones ponderadas con respecto a la longitud relativa del segmento, para un alfabeto de 27 letras. 𝑚 4 6 8 Para comprender las limitantes, se observa que: para direcciones de memoria de 64 bits, la cantidad de objetos de entrenamiento no puede alcanzar 264 , y por lo tanto la longitud máxima del segmento está dada por la ecuación 3, y para direcciones de memoria de 64 bits y un alfabeto de 4 letras el máximo posible es de 32 letras. 𝑙𝑚𝑎𝑥 ≤ 𝑠 𝑙𝑜𝑔2 (‖Σ‖) AC 1 1 1 WM 2.2 0.89 0.59 De la misma manera, las tablas IV y V muestran la búsqueda de una y de tres cadenas simultáneas para un alfabeto de 27 letras. (3) TABLA IV. PROMEDIOS PONDERADOS DE LA CANTIDAD DE ACCESOS PARA LA BÚSQUEDA DE UNA CADENA CON ALFABETOS DE 27 LETRAS Donde “𝑙𝑚𝑎𝑥 ” es la longitud máxima del segmento, “𝑠” es la cantidad de bits en las direcciones de memoria, y “‖Σ‖” es la cantidad de letras en el alfabeto reducido. 𝑚 4 6 8 Otro aspecto a tener en cuenta es el tamaño del árbol de decisión, que tiene una altura de la longitud del segmento “l” y un máximo de “‖Σ‖” hijos por cada nodo, i.e., crece proporcionalmente como indica la ecuación 4. ‖𝑛𝑜𝑑𝑜𝑠‖ ≈ 𝑙 ‖Σ‖ AD 0.92 0.53 0.41 AD 0.37 0.25 0.2 AC 1 1 1 WM 1.51 0.76 0.51 BM 0.29 0.20 0.16 TABLA V. PROMEDIOS PONDERADOS DE LA CANTIDAD DE ACCESOS PARA LA BÚSQUEDA DE TRES CADENAS SIMULTÁNEAS CON ALFABETOS DE 27 LETRAS (4) 𝑚 4 6 8 Donde “‖𝑛𝑜𝑑𝑜𝑠‖” es la cantidad de nodos del árbol de decisión, “𝑙” es la longitud del segmento, y “‖Σ‖” es la cantidad de letras en el alfabeto reducido. En las figuras anteriores se observa que para tamaños ligeramente inferiores a dos veces el tamaño de la cadena a buscar (2𝑚) se obtiene una buena eficiencia, y la mejora para segmentos mayores a “2𝑚” es muy poca, por lo que para comparar el algoritmo propuesto con otros de la literatura se toma el tamaño de segmento de “2𝑚 − 2”. AD 0.45 0.31 0.21 AC 1 1 1 WM 1.5 0.76 0.51 En las tablas II a V se observa que el algoritmo AhoCorasick siempre realiza un acceso a cada letra hasta encontrar la cadena que se busca, esto por la forma de operar de los AFD, que leen todos los caracteres de forma secuencial y van cambiando de estado interno hasta llegar a un estado de aceptación o rechazo. La Tabla II compara los algoritmos para el caso de un alfabeto de 4 letras y la búsqueda de una sola cadena a la vez. Los algoritmos comparados son el que usa el árbol de decisión (AD), Aho-Corasick (AC), Wu-Manber (WM) y Boyer-Moore (BM). Es importante anotar que: aunque la cantidad de accesos del algoritmo Wu-Manber es relativamente alta, el algoritmo usa las letras internamente para sus funciones hash, lo cual, si el acceso a las letras del texto es eficiente, por ejemplo, si se usa una memoria caché, mantiene al algoritmo veloz, y es más eficiente conforme las cadenas se van haciendo más largas. 4 XV Congreso Internacional sobre Innovación y Desarrollo Tecnológico, 2 al 4 de octubre de 2019, Cuernavaca Morelos, México. [9] Navarro, G. (1998). Approximate text searching (Doctoral dissertation, PhD thesis, Dept. of Computer Science, Univ. of Chile). [10] Fulwider, S., & Mukherjee, A. (2010). Multiple pattern matching. In The Second International Conferences on Pervasive Patterns and Applications, PATTERNS (pp. 78-83). [11] Kim, S., & Kim, Y. (1999, August). A fast multiple string-pattern matching algorithm. In Proceedings of 17th AoM/IAoM Conference on Computer Science (pp. 44-49). [12] Navarro, G., Baeza-Yates, R. A., Sutinen, E., & Tarhio, J. (2001). Indexing methods for approximate string matching. IEEE Data Eng. Bull., 24(4), 19-27. [13] Boytsov, L. (2011). Indexing methods for approximate dictionary searching: Comparative analysis. Journal of Experimental Algorithmics (JEA), 16, 1-1. [14] Bajic, V. B., et al. (2003). «From informatics to bioinformatics». Proceedings of the first Asia–Pacific bioinformatics conference on bioinformatics, Adelaide. [15] Quinlan, J. (1986). Induction of decision trees. Machine Learning 1. 81– 106. [16] https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_stringsearch_algorithm. Consultado en 2019. [17] https://github.com/westes/flex/. Consultado en 2019. [18] http://blog.raymond.burkholder.net/index.php?/archives/362-C++Implementation-of-Wu-Manbers-Multi-Pattern-Search-Algorithm.html. Consultado en 2019. [19] Kent, W. J. (2002). BLAT—the BLAST-like alignment tool. Genome research, 12(4), 656-664. [20] Sievers, F., & Higgins, D. G. (2014). Clustal Omega, accurate alignment of very large numbers of sequences. In Multiple sequence alignment methods (pp. 105-116). Humana Press, Totowa, NJ. 5. Conclusiones En este trabajo se desarrolló un algoritmo basado en árboles de decisión para detectar cadenas en textos largos, el cual tiene la propiedad de que utiliza el aprendizaje automático para optimizar la búsqueda de cadenas, en vez de utilizar un algoritmo de propósito específico. Tiene la particularidad de que analiza cada segmento de forma independiente, lo cual podría favorecer una paralelización en un trabajo futuro. Se comparó el algoritmo propuesto con otros tres de la literatura, mostrando resultados competitivos para cadenas cortas (menos de 8 letras) y alfabetos pequeños, esto porque en las pruebas el algoritmo con árboles de decisión obtuvo resultados más competitivos con un alfabeto de 4 letras que con un alfabeto de 27, y alcanzó tamaños prohibitivos en la cantidad de casos de entrenamiento con cadenas largas. La cantidad de casos de entrenamiento crece exponencialmente con respecto a la cantidad de letras del segmento. El uso de los árboles de decisión presenta las desventajas del tamaño del árbol y del costo de su generación o entrenamiento, sin los cuales sería una opción competitiva en la búsqueda de cadenas cortas, pues como se observa en los experimentos, la cantidad de accesos resulta competitiva a partir de segmentos una letra más grandes que la cadena a buscar. 7. Biografías Sergio Alejandro González Segura. Ingeniero en Sistemas Computacionales (1997), Instituto Tecnológico de Mérida. Maestro en Ciencias en Ciencias de la Computación (2011), Centro Nacional de Investigación y Desarrollo Tecnológico en 2011. Estudiante de Doctorado en Ciencias Computacionales desde 2016. José Ruiz Ascencio. Físico (1971), Facultad de Ciencias, Universidad Nacional Autónoma de México. Master of Science in Electrical Engineering (1973) de Stanford Leland Jr. University, California, E.U.A. Doctor en Ciencias(1989) de University of Sussex, Sussex, Inglaterra, G.B. Como trabajo futuro se pretende aumentar la longitud máxima de cadenas admisibles con el algoritmo propuesto, y compararlo con algoritmos usados para búsqueda de cadenas en bioinformática, como Blast [19] para cadenas individuales, y Clustal [20] para cadenas múltiples. 6. Referencias [1] Gurung, D., Chakraborty, U. K., & Sharma, P. (2016). Intelligent Predictive String Search Algorithm. Procedia Computer Science, 79, 161-169. [2] Ramos-Frías, R., & Vargas-Lombardo, M. (2017). A Review of String Matching Algorithms and Recent Implementations using GPU. [3] Boyer, R. S., & Moore, J. S. (1977). A fast string searching algorithm. Communications of the ACM, 20(10), 762-772. [4] Knuth, Donald; Morris, James H.; Pratt, Vaughan (1977). "Fast pattern matching in strings". SIAM Journal on Computing. 6 (2): 323–350. CiteSeerX 10.1.1.93.8147. doi:10.1137/0206024. [5] Aho, A. and Corasick, M. (1975) “Efficient string matching: an aid to bibliographic search,” Commun. ACM, vol. 18, no. 6, pp. 333–340. [6] Commentz-Walter, Beate (1979). A String Matching Algorithm Fast on the Average. International Colloquium on Automata, Languages and Programming. LNCS. 71. Graz, Austria: Springer. pp. 118–132. doi:10.1007/3-540-09510-1_10. ISBN 3-540-09510-1. [7] Wu, S., & Manber, U. (1994). A fast algorithm for multi-pattern searching. Tech. R. TR-94-17, Dept. of Comp. Science, Univ of Arizona. [8] Crochemore, M., Czumaj, A., Gasieniec, L., Lecroq, T., Plandowski, W., & Rytter, W. (1999). Fast practical multi-pattern matching. Information Processing Letters, 71(3-4), 107-113. 5