Estructuras de datos eficientes para construir un corrector ortográfico rápido

41

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

trie-500px

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

trie-500px

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

sufijo-500px

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

tst

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

ráfaga

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.

Charles Menguy
fuente
¿Cómo evita una patricia el costo de almacenar los punteros? ¿Es solo un en.wikipedia.org/wiki/Radix_tree ? Si ese es el caso, entonces creo que todavía almacena muchos punteros, pero tendrá un gran ahorro de espacio porque los prefijos comunes solo se almacenan una vez
Joe
norte
1
@linker: ¿Has probado todas las variantes para tu diccionario? Dado un caso de uso fijo, esa es probablemente la forma más rápida de averiguar qué estructura de datos consume cuánto espacio.
Raphael
1
Es solo un diccionario básico, solo una lista conocida de palabras escritas correctamente.
Charles Menguy

Respuestas:

4

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.

MadRunner
fuente
Esto es lo que hace Soundex en.wikipedia.org/wiki/Soundex
rgrig
4

O(Iniciar sesión(norte))O

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.

oao
fuente