Estoy tratando de escribir un corrector ortográfico que debería funcionar con un diccionario bastante grande. Realmente quiero una manera eficiente de indexar los datos de mi diccionario para usarlos usando una distancia Damerau-Levenshtein para determinar qué palabras están más cerca de la palabra mal escrita.
Estoy buscando una estructura de datos que me ofrezca el mejor compromiso entre la complejidad del espacio y la complejidad del tiempo de ejecución.
Según lo que encontré en Internet, tengo algunas pistas sobre qué tipo de estructura de datos usar:
Trie
Este es mi primer pensamiento y parece bastante fácil de implementar y debería proporcionar una búsqueda / inserción rápida. La búsqueda aproximada usando Damerau-Levenshtein debería ser fácil de implementar aquí también. Pero no parece muy eficiente en términos de complejidad de espacio ya que lo más probable es que tenga muchos gastos generales con el almacenamiento de punteros.
Patricia Trie
Esto parece consumir menos espacio que un Trie normal ya que básicamente estás evitando el costo de almacenar los punteros, pero estoy un poco preocupado por la fragmentación de datos en el caso de diccionarios muy grandes como el que tengo.
Árbol de sufijo
No estoy seguro de esto, parece que algunas personas lo encuentran útil en la minería de texto, pero no estoy realmente seguro de lo que daría en términos de rendimiento para un corrector ortográfico.
Árbol de búsqueda ternario
Estos se ven bastante bien y en términos de complejidad deberían estar cerca (¿mejor?) De Patricia Tries, pero no estoy seguro con respecto a la fragmentación si sería mejor o peor que Patricia Tries.
Árbol de explosión
Esto parece un poco híbrido y no estoy seguro de qué ventaja tendría sobre Tries y similares, pero he leído varias veces que es muy eficiente para la minería de textos.
Me gustaría recibir algunos comentarios sobre qué estructura de datos sería mejor usar en este contexto y qué lo hace mejor que los otros. Si me faltan algunas estructuras de datos que serían aún más apropiadas para un corrector ortográfico, también estoy muy interesado.
fuente
Respuestas:
He encontrado el mismo problema, pero tomé un enfoque diferente. Puede construir algún tipo de función "hash", que para palabras similares dará el mismo número o un número cercano.
El problema es que esa función que dará un resultado "bueno" para las palabras con inserción / eliminación, dará "malo" para la transición, y viceversa. Ejemplo: mapear letras a números, letras similares a números adyacentes, y simplemente sumarlas para cada letra en la palabra. Luego cree tablas hash con conjuntos para cada clave y encuentre la intersección de la palabra.
Puede haber algunos resultados que se pueden lograr si observamos el "espacio" de las palabras. X para cambiar la letra, Y para agregar / eliminar, Z para la transición, o algo así.
Sin embargo, estas son solo ideas abstractas, no tengo tiempo suficiente para implementarlas.
fuente
No almacene las cadenas en el árbol métrico. Simplemente almacene un índice y almacene las cadenas en un árbol de Patricia.
No estoy seguro de qué árbol debe usar. Dependerá de sus datos y sus requisitos (¿necesita una inserción rápida?). Actualice su pregunta si encuentra que un árbol es más eficiente que los otros.
También puede buscar herramientas especializadas, como lucene.
fuente