
En informática , la búsqueda aproximada de cadenas (a menudo denominada búsqueda difusa de cadenas ) es la técnica para encontrar cadenas que coincidan aproximadamente con un patrón (en lugar de exactamente). El problema de la búsqueda aproximada de cadenas se divide generalmente en dos subproblemas: encontrar coincidencias aproximadas de subcadenas dentro de una cadena dada y encontrar cadenas de diccionario que coincidan aproximadamente con el patrón.
Descripción general
La proximidad de una coincidencia se mide en términos del número de operaciones primitivas necesarias para convertir la cadena en una coincidencia exacta. Este número se denomina distancia de edición entre la cadena y el patrón. Las operaciones primitivas habituales son: [ 1 ]
- inserción: cot → co a t
- eliminación: co a t → cot
- sustitución: co a t → co s t
Estas tres operaciones pueden generalizarse como formas de sustitución añadiendo un carácter nulo (simbolizado aquí por *) dondequiera que se haya eliminado o insertado un carácter:
- inserción: co * t → co a t
- eliminación: co a t → co * t
- sustitución: co a t → co s t
Algunos comparadores aproximados también tratan la transposición , en la que se intercambian las posiciones de dos letras en la cadena, como una operación primitiva. [ 1 ]
- transposición: co st → co ts
Los distintos algoritmos de coincidencia aproximada imponen diferentes restricciones. Algunos utilizan un único coste global no ponderado, es decir, el número total de operaciones primitivas necesarias para convertir la coincidencia al patrón. Por ejemplo, si el patrón es coil , foil difiere en una sustitución, coils en una inserción, oil en una eliminación y foal en dos sustituciones. Si todas las operaciones cuentan como una sola unidad de coste y el límite se establece en uno, foil , coils y oil contarán como coincidencias, mientras que foal no lo hará.
Otros comparadores especifican el número de operaciones de cada tipo por separado, mientras que otros establecen un coste total pero permiten asignar diferentes ponderaciones a diferentes operaciones. Algunos comparadores permiten asignar límites y ponderaciones por separado a grupos individuales en el patrón.
Formulación de problemas y algoritmos
Una posible definición del problema de coincidencia aproximada de cadenas es la siguiente: Dada una cadena patróny una cadena de texto, encontrar una subcadenaen T , que, de todas las subcadenas de T , tiene la menor distancia de edición al patrón P.
Un enfoque de fuerza bruta sería calcular la distancia de edición a P para todas las subcadenas de T y luego elegir la subcadena con la distancia mínima. Sin embargo, este algoritmo tendría un tiempo de ejecución de O ( n 3 m ).
Una mejor solución, propuesta por Sellers, [ 2 ] se basa en la programación dinámica . Utiliza una formulación alternativa del problema: para cada posición j en el texto T y cada posición i en el patrón P , calcular la distancia de edición mínima entre los primeros i caracteres del patrón,y cualquier subcadenade T que termina en la posición j .
Para cada posición j del texto T y cada posición i del patrón P , recorra todas las subcadenas de T que terminan en la posición j y determine cuál de ellas tiene la distancia de edición mínima a los primeros i caracteres del patrón P. Escriba esta distancia mínima como E ( i , j ). Después de calcular E ( i , j ) para todos los i y j , podemos encontrar fácilmente una solución al problema original: es la subcadena para la cual E ( m , j ) es mínima ( siendo m la longitud del patrón P ).
Calcular E ( m , j ) es muy similar a calcular la distancia de edición entre dos cadenas. De hecho, podemos usar el algoritmo de cálculo de distancia de Levenshtein para E ( m , j ), con la única diferencia de que debemos inicializar la primera fila con ceros y guardar la ruta de cálculo, es decir, si usamos E ( i − 1, j ), E( i , j − 1) o E ( i − 1, j − 1) al calcular E ( i , j ).
En el arreglo que contiene los valores E ( x , y ), luego elegimos el valor mínimo en la última fila, llamémoslo E ( x 2 , y 2 ), y seguimos el camino de cálculo hacia atrás, hasta el número de fila 0. Si el campo al que llegamos fue E (0, y 1 ), entonces T [ y 1 + 1] ... T [ y 2 ] es una subcadena de T con la distancia de edición mínima al patrón P .
El cálculo del array E ( x , y ) requiere un tiempo de O ( mn ) con el algoritmo de programación dinámica, mientras que la fase de trabajo inverso requiere un tiempo de O ( n + m ).
También hay algoritmos cuyo tiempo de ejecución depende de k , un límite de la distancia de edición de interés, y son mejores cuando k es pequeño en relación con la longitud de las cadenas. En 1989, Landau y Vishkin dieron unalgoritmo. Este algoritmo todavía se basa en la matriz de programación dinámica anterior, pero la llena de una manera ingeniosa, a lo largo de las diagonales. [ 3 ] En 2002, utilizando un algoritmo más complejo, Cole y Hariharan lograron una complejidad de. Tenga en cuenta que esto es mejor cuando. [ 4 ]
El problema especializado de la coincidencia de patrones con k desajustes se define al no permitir inserciones ni eliminaciones en la coincidencia del patrón con el texto. Por lo tanto, la distancia de Hamming del patrón al segmento correspondiente del texto debe ser como máximo k . Este problema se ha resuelto con una complejidad de. [ 5 ]
Otra idea reciente es la unión por similitud. Cuando la base de datos de coincidencia maneja una gran cantidad de datos, el tiempo O ( mn ) del algoritmo de programación dinámica no puede funcionar dentro de un tiempo limitado. Por lo tanto, la idea es reducir el número de pares candidatos, en lugar de calcular la similitud de todos los pares de cadenas. Los algoritmos más utilizados se basan en la verificación de filtros, el hashing, el hashing sensible a la localidad (LSH), los tries y otros algoritmos voraces y de aproximación. La mayoría de ellos están diseñados para adaptarse a algún marco (como MapReduce) para realizar cálculos concurrentes.
En línea versus fuera de línea
Tradicionalmente, los algoritmos de búsqueda aproximada de cadenas se clasifican en dos categorías: en línea y fuera de línea. Con los algoritmos en línea, el patrón se puede procesar antes de la búsqueda, pero el texto no. En otras palabras, las técnicas en línea realizan búsquedas sin un índice. Los primeros algoritmos para la búsqueda aproximada en línea fueron propuestos por Wagner y Fischer [ 6 ] y por Sellers [ 2 ] . Ambos algoritmos se basan en programación dinámica , pero resuelven problemas diferentes. El algoritmo de Sellers busca aproximadamente una subcadena en un texto, mientras que el algoritmo de Wagner y Fischer calcula la distancia de Levenshtein , siendo apropiado solo para la búsqueda difusa en diccionarios.
Las técnicas de búsqueda en línea se han perfeccionado repetidamente. Quizás la mejora más famosa sea el algoritmo bitap (también conocido como algoritmo 'shift-or' o 'shift-and'), que resulta muy eficiente para cadenas de patrones relativamente cortas. El algoritmo bitap es la base de la utilidad de búsqueda agrep de Unix . G. Navarro realizó una revisión de los algoritmos de búsqueda en línea. [ 7 ]
Aunque existen técnicas en línea muy rápidas, su rendimiento en grandes conjuntos de datos es deficiente. El preprocesamiento o la indexación de textos aceleran considerablemente la búsqueda. Actualmente, se han presentado diversos algoritmos de indexación. Entre ellos se encuentran los árboles de sufijos , [ 8 ] los árboles métricos [ 9 ] y los métodos de n -gramas . [ 10 ] [ 11 ] Navarro et al. [ 10 ] ofrecen un estudio detallado de las técnicas de indexación que permiten encontrar una subcadena arbitraria en un texto. Boytsov [ 12 ] ofrece un estudio computacional de los métodos de diccionario (es decir, métodos que permiten encontrar todas las palabras del diccionario que coinciden aproximadamente con un patrón de búsqueda).
Aplicaciones
Las aplicaciones comunes de coincidencia aproximada incluyen la corrección ortográfica . [ 8 ] Con la disponibilidad de grandes cantidades de datos de ADN, la coincidencia de secuencias de nucleótidos se ha convertido en una aplicación importante. [ 1 ] La coincidencia aproximada también se utiliza en el filtrado de spam . [ 8 ] La vinculación de registros es una aplicación común donde se comparan registros de dos bases de datos dispares.
La comparación de cadenas no se puede utilizar para la mayoría de los datos binarios, como imágenes y música. Para estos se requieren algoritmos diferentes, como la huella acústica .
Una herramienta común de línea de comandos fzfse usa a menudo para integrar la búsqueda aproximada de cadenas en varias aplicaciones de línea de comandos. [ 13 ]
Véase también
- Búsqueda de conceptos
- distancia de Jaro-Winkler
- distancia de Levenshtein
- Hashing sensible a la localidad
- Metaphone
- Algoritmo de Needleman-Wunsch
- Detección de plagio
- Expresiones regulares para la coincidencia difusa y no difusa
- Algoritmo de Smith-Waterman
- Soundex
- Métrica de cadena
- Algoritmo de búsqueda de cadenas
- Base de datos vectorial para la búsqueda de similitud semántica
Referencias
Citas
- ^ Cormen y Leiserson 2001 .
- 1 2 Vendedores 1980 .
- ↑ Landau y Vishkin 1989 .
- ↑ Cole y Hariharan (2002) .
- ↑ Nicolae y Rajasekaran (2015) .
- ↑ Wagner y Fischer 1974 .
- 1 2 3 Gusfield 1997 .
- ↑ Zobel y Dart 1995 .
- ↑ Boytsov 2011 .
- ↑ "Fzf - Una búsqueda rápida y aproximada de archivos desde la terminal de Linux" . www.tecmint.com . 8 de noviembre de 2018. Consultado el 8 de septiembre de 2022 .
Obras citadas
- Baeza-Yates, R.; Navarro, G. (1998). "Búsqueda rápida y aproximada de cadenas en un diccionario" (PDF) . Actas de SPIRE'98 . IEEE CS Press. pp. 14–22 .
- Boytsov, Leonid (2011). "Métodos de indexación para la búsqueda aproximada en diccionarios: análisis comparativo". Journal of Experimental Algorithmics . 16 (1): 1– 91. doi : 10.1145/1963190.1963191 . S2CID 15635688 .
- Cole, Richard; Hariharan, Ramesh (2002). "Coincidencia aproximada de cadenas: un algoritmo más simple y rápido". SIAM Journal on Computing . 31 (6): 1761– 1782.
- Cormen, Tomás ; Leiserson, Rivest (2001). Introducción a los algoritmos (2ª ed.). Prensa del MIT. págs. 364–7 . ISBN 978-0-262-03293-3.
- Gusfield, Dan (1997). Algoritmos sobre cadenas, árboles y secuencias: informática y biología computacional . Cambridge, Reino Unido: Cambridge University Press. ISBN 978-0-521-58519-4.
- Landau, Gad M.; Vishkin, Uzi (1989). "Coincidencia aproximada de cadenas rápida, paralela y serial" . Journal of Algorithms . 10 (2): 157– 169. doi : 10.1016/0196-6774(89)90010-2 .
- Navarro, Gonzalo (2001). "Una visita guiada a la coincidencia aproximada de cadenas". ACM Computing Surveys . 33 (1): 31– 88. CiteSeerX 10.1.1.96.7225 . doi : 10.1145/375360.375365 . S2CID 207551224 .
- Navarro, Gonzalo; Baeza-Yates, Ricardo; Sutinen, Erkki; Tarhio, Jorma (2001). "Métodos de indexación para una coincidencia aproximada de cadenas" (PDF) . Boletín de ingeniería de datos IEEE . 24 (4): 19-27 .
- Nicolae, Marius; Rajasekaran, Sanguthevar (2015). "Sobre la coincidencia de cadenas con discrepancias". Algorithms . 8 (2): 248– 270.
- Sellers, Peter H. (1980). "La teoría y el cálculo de distancias evolutivas: reconocimiento de patrones". Journal of Algorithms . 1 (4): 359– 73. doi : 10.1016/0196-6774(80)90016-4 .
- ^ Skiena, Steve (1998). Manual de diseño de algoritmos (1.ªed.). Springer. ISBN 978-0-387-94860-7.
- Wagner, R.; Fischer, M. (1974). "El problema de corrección de cadena a cadena" . Journal of the ACM . 21 : 168–73 . doi : 10.1145/321796.321811 . S2CID 13381535 .
- Zobel, Justin; Dart, Philip (1995). "Encontrar coincidencias aproximadas en léxicos grandes". Software: Practice and Experience . 25 (3): 331– 345. CiteSeerX 10.1.1.14.3856 . doi : 10.1002/spe.4380250307 . S2CID 6776819 .
Lecturas adicionales
- Baeza-Yates, R.; Navarro, G. (junio de 1996). "Un algoritmo más rápido para la coincidencia aproximada de cadenas". En Dan Hirchsberg; Gene Myers (eds.). Combinatorial Pattern Matching (CPM'96), LNCS 1075. Irvine, CA. pp. 1–23 . CiteSeerX 10.1.1.42.1593 .
- Galil, Zvi; Apostolico, Alberto (1997). Algoritmos de coincidencia de patrones . Oxford [Oxfordshire]: Oxford University Press. ISBN 978-0-19-511367-9.
- Myers, G. (mayo de 1999). "Un algoritmo rápido de vector de bits para la coincidencia aproximada de cadenas basado en programación dinámica" (PDF) . Journal of the ACM . 46 (3): 395– 415. doi : 10.1145/316542.316550 . S2CID 1158099 .
- Ukkonen, E. (1985). "Algoritmos para la coincidencia aproximada de cadenas" . Information and Control . 64 ( 1–3 ): 100–18 . doi : 10.1016/S0019-9958(85)80046-2 .
Enlaces externos
- Proyecto Flamenco
- Proyecto de procesamiento eficiente de consultas de similitud con avances recientes en la coincidencia aproximada de cadenas basada en un umbral de distancia de edición.
- El proyecto StringMetric es una biblioteca Scala de métricas de cadenas y algoritmos fonéticos.
- Natural Project es una biblioteca de procesamiento del lenguaje natural en JavaScript que incluye implementaciones de métricas de cadenas populares.
- Algoritmos de coincidencia de cadenas
- Coincidencia de patrones
- Programación dinámica