2011-02-09 4 views
12

Actualmente estoy trabajando con el uso de SecondString para la coincidencia de cadenas difusas, donde tengo un diccionario grande para comparar (con cada entrada en el diccionario tiene un identificador no único asociado)) Actualmente estoy usando un hashmap para almacenar este diccionario.Mejorar el rendimiento de la coincidencia de cadenas difusas en un diccionario

Cuando quiero hacer una coincidencia de cadenas difusas, primero compruebo si la cadena está en el hashMap y luego repito todas las demás teclas potenciales, calculando la similitud de cadena y almacenando los k, v pair/s con la mayor similitud. Dependiendo de qué diccionario estoy usando esto puede llevar mucho tiempo (12330 - 1800035 entradas). ¿Hay alguna forma de acelerar esto o hacerlo más rápido? Actualmente estoy escribiendo una función/tabla de memorización como una forma de acelerar esto, pero ¿alguien más puede pensar en una mejor manera de mejorar la velocidad de esto? Tal vez una estructura diferente o algo más que me estoy perdiendo.

Muchas gracias de antemano,

Nathan

+2

Al ser una cuestión técnica , esto pertenece a [StackOverflow] (http://stackoverflow.com/). –

Respuesta

11

lo que busca es un BKTree (BKTree) combinado con el algoritmo de Levenshtein Distancia. El rendimiento de búsqueda en un BKtree depende de qué tan "difusa" sea su búsqueda. Donde difusa se define como el número de distancia (ediciones) entre la palabra de búsqueda y las coincidencias.

Aquí es un buen blog sobre el tema: http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees

Algunas notas sobre el rendimiento: http://www.kafsemo.org/2010/08/03_bk-tree-performance-notes.html

Notas sobre el algoritmo http://en.wikipedia.org/wiki/Levenshtein_distance.

Además, aquí hay un BK-Tree escrito en Java. Debe darle una idea de la interfaz: http://code.google.com/p/java-bk-tree/

2

O también se puede usar un HashMap Fuzzy Java (una extensión de HashMap de Java que permite la búsqueda aproximada): http://sourceforge.net/projects/fuzzyhashmap/ Creo que es exactamente lo que necesita. Aquí tienes una descripción completa de la estructura de datos: http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=5565628

+0

Una cosa a tener en cuenta sobre esto: no devolverá nada si la clave de búsqueda tiene menos de 5 caracteres. Puede modificar la fuente, pero hay un comentario que dice que tuvo una precisión pobre durante la prueba de teclas de menos de 5 letras. –

+0

Además, mientras que BK-tree devolverá una lista de coincidencias cercanas, FuzzyHashMap solo devuelve una coincidencia difusa. De nuevo, esto podría arreglarse bastante fácilmente, creo. –

Cuestiones relacionadas