Cristalab

                 ¿Quieres registrarte?

Buscador de palabras por similitud en Flash

29 de Marzo del 2007
17,145 visitas

Supongamos que tenemos un buscador en Flash para una página de turismo en Argentina.

En esta página probablemente contemos con muchas provincias, por ejemplo "Buenos Aires". Si el usuario ingresa cualquiera de estas búsquedas, va a obtener los resultados esperados (a menos que sea case intensive):



Pero si pone una letra de menos (que no sea la última), el buscador va a tener problemas.



Pero, esto tiene solución. Vamos a emplear una función que nos diga cuántas letras hay que cambiar, quitar o agregar para convertir una cadena en otra (lo que se denomina "distancia levenshtein entre dos cadenas"). En php esta función se llama levenshtein (como es lógico) y forma parte de las funciones nativas del lenguaje.

Lamentablemente en Flash no tenemos nada parecido. Entonces, tenemos que crear la función "a mano".

Un ejemplo sería éste que nos dice cúales son las capitales de las provincias (si desconocen los nombres de las provincias argentinas prueben con "Buen Aires", "Formoza", "entren rio", etc.)



La función podría ser ésta:

Código :

levenshtein = function (cadena1:String, cadena2:String) {
   cadena1.toLowerCase ();
   cadena2.toLowerCase ();
   //
   var arrayCadena1 = new Array ();
   var arrayCadena2 = new Array ();
   //
   var largoMax = Math.max (cadena1.length, cadena2.length);
   var cadenaMax = (cadena1.length == largoMax) ? "Cadena1" : "Cadena2";
   var cadenaMin = (cadenaMax == "Cadena1") ? "Cadena2" : "Cadena1";
   //
   arrayCadena1 = (cadena1.length == largoMax) ? cadena1.split ("") : cadena2.split ("");
   arrayCadena2 = (cadena1.length == largoMax) ? cadena2.split ("") : cadena1.split ("");
   var valor = 0;
   for (var a in arrayCadena1) {
      if (arrayCadena1[a] != arrayCadena2[a]) {
         valor++;
      }
   }
   return valor;
};

Esta función funciona como podría esperarse. Donde el valor devuelto es la distancia de la que habíamos hablado antes.

Pero tenemos un problema con búsquedas de múltiples palabras. Volvamos al ejemplo de las provincias argentinas.

Obviamente, esta función podría ser agregada a un buscador. Entonces, tenemos 2 provincias, Jujuy y Buenos Aires.

Si buscamos Buenos Ayres y el buscador nos devuelve la palabra que más se acerca a nuestra entrada, obviamente recibiremos Buenos Aires como salida. Pero si buscamos Junos Aires, recibiremos Jujuy. Aunque esa búsqueda tiene solo 2 letras en común con Jujuy y 9 con Buenos Aires (10 si contamos el espacio)

Pero si lo analizan se van a dar cuenta que al faltar una letra (la B está reemplazada por una J, pero la e simplemente no está), nuestra función comienza a comparar caracteres equivocados. Recordemos que busca los caracteres del mismo índice y no hace una búsqueda caracter a caracter (que demoraría mucho más).

Entonces, para propósitos prácticos armé una segunda función que emplea a la primera, pero que agrega un poco más de funcionalidad:

Código :

levenshtein2 = function (cadena1:String, cadena2:String) {
   //
   var miValor = 0;
   var arrayPalabras1 = new Array ();
   var arrayPalabras2 = new Array ();
   var largoMax = Math.max (arrayPalabras1.length, arrayPalabras2.length) + 1;
   //
   arrayPalabras1 = cadena1.split (" ");
   arrayPalabras2 = cadena2.split (" ");
   //
   // Si los arrays tienen distinto número de elementos, agregamos los que hacían falta
   for (i = 0; i <= largoMax; i++) {
      if (arrayPalabras1[i] == undefined) {
         arrayPalabras1[i] = "";
      }
      if (arrayPalabras2[i] == undefined) {
         arrayPalabras2[i] = "";
      }
   }
   //
   for (i = 0; i <= largoMax; i++) {
      miValor += levenshtein (arrayPalabras1[i], arrayPalabras2[i]);
   }
   return miValor;
};

Recordemos que para usar levenshtein2 tenemos que definir la función levenshtein primero (o juntarlas en una sola función, lo que complicaría más entender su funcionamiento, algo especialmente tonto en un tutorial)

Espero les sea útil, últimamente vi en el foro varios pedidos de buscadores y creo que la búsqueda por similitud es algo a tener en cuenta.


Artículos Relacionados


Etiquetas actionscript

Comentarios | Enviar un comentario
Gracias, muy buen aporte
Por: bicho_O
espectacular, casualmente tengo un sitio de turismo sobre la ciudad de Buenos Aires.pero, ¿cómo hago un buscador en Flash?
Por: claudio_blog
Podrías probar con éste. Pero para usar éstas funciones, te recomendaría tomar el texto en el que querés buscar y convertirlo a un Array (los datos del ejemplo que puse los armé de esa manera). Luego usas un for..in para recorrer el Array comparando la búsqueda con la palabra ingresada y tomás como correcta la palabra/s que menor distancia levenshtein presente/n.

En caso de que el usuario ingrese más de una palabra, repetís la operación anterior separadamente para cada una de ellas.
Por: HernanRivas
Uta esta genial esto lo podrias poner para descargar el ejemplo completo porfavor te lo agredeceria enormemente te dejo mi correo de todas formas si es que puedes enviarmelo por mail : odiaz@artificio.cl


Te lo REagradesco mucho chaooo Excelente aporte !!!! Idolo ! jajaja
Por: Oscar_blog
buen aporte gracias
como hago si quiero que las palabras que busque esten en un archivo externo
Por: adonys74_blog
Bueno, como esta función es casi idéntica a la de php podrías usar php. En todo caso, modificás un poco el código de levenshtein2 para que funcione en ese lenguaje (no debería ser muy difícil dado que son bastante similares).
Por: HernanRivas
deberian poner el archivo del tutorial
Por: alvaro_blog
29 %
Por:
Oye gracias, voy a mirarlo con calma y te cuento como me fue
Por: juliovanegas
como hago un cambio en la busqueda o como lo puedo insertar en un proyecto EXE para la busqueda de palabras
Por: rafa_blog
Seguís los pasos del post.
Por: HernanRivas
Bueno esto me sirve para poder hacer el diccionario que quiero hacer, pero necesitaria los archivos del tutorial porque la verdad no se como hacerle esta un poco dificil intente hacerlo guiandome por el post pero soy muy novice en actionscript asi que buehh si alguien tiene los archivos del tutorial me los envia porfavor tengo solo horas para entregar este trabajo es para mañana llevo como 3 semanas intentndo hacerlo pero la verdad no e conseguido nada y bueno lo que sucede tambien es que tengo poco tiempo y son muchas materias bueno le agradeceria a la persona que me responda porfas o si ya hicieron un diccionario en flash me lo facilite, bueno un millon de gracias de ante mano saludos.
Por: simplepanas
hola, podrias poner el archivo fla para descargar de este ejemplo, gracias.
Por: luis_blog
deberian de tener informacion azteca, inca y maya
Por: cnfbverhcfidnvowe-blog
necesito un programa donde ingrese algunas letras y etse me busque las palabras posibles .... por ejemplo escribo

5 letras a g h a i.. y el burcador escriba las posibles palabras



grcias
Por: albono-blog
pero colega....una pregunta...como generas la base de datos con las palabras?, donde pongo todas las palabras que quiero que busque...no entiendo eso
talvez es una duda que muchos tienen.

saludos
Por: Pablosky
deben poner mas publicidad
Por: laura-blog
necesito palabras que comiencen por ante,por letio pero yaaaaaaaaaaa
Por: laura-blog
Necesito hacer un buscador ya sea en flash o html donde este el campo del buscador y el cliente pueda colocar un codio como este 1001 y cuando le de buscar le salgo la informacion de dicho codigo la numeracion empieza desde el 1001 hasta 9999 si me pueden ayudar muchisimas gracias
Por: Pablo-blog
vuelvase serio con esto payasos
Por: carlos andres-blog
no entiendo tu pagina
Por: yot-blog
esta pagina esta del asco
Por: buuuuuuuu-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.