Sphinx search con sugerencia de palabras
Wednesday, August 12th, 2009Desde hace un tiempo vengo utilizando Sphinx como herramienta de búsqueda de palabras para el proyecto en el que estoy trabajando, y estos días tuve que implementar la sugerencia de palabras para cuando el usuario escribe un término con errores, al mejor estilo “Did you mean: …” de Google.
La sugerencia de palabras para un buscador es conceptualmente similar a un corrector ortográfico, con la diferencia de que las palabras sugeridas no necesitan estar bien escritas sino que tiene que ser palabras que el usuario vaya a encontrar dentro de los términos conocidos por Sphinx. Esto significa que no me servía chequear las palabras con un diccionario español, lo que necesitaba era un diccionario de palabras indexadas por Sphinx.
Con estas ideas me puse a trabajar en la implementación, que resultó más sencilla de lo esperado:
- Para obtener la lista de palabras se utiliza el mismo indexer de sphinx:
indexer --conf sphinx.con --buildstops palabras.txt 100000
Esto genera el archivo palabras.txt con las “primeras” 100 mil palabras más utilizadas. En mi caso el total llegó sólo a 15 mil.
- Crear un diccionario, para lo cual utilicé Aspell y generé un diccionario master basado en palabras.txt:
aspell --lang=es create master ./dictionary.local < palabras.txt
Lo que queda ahora es ver si las sugerencias funcionan, y como estoy trabajando en Perl lo mejor es recurrir a CPAN, en donde encontré el módulo Text::Aspell y seguí uno de sus ejemplos:
use Text::Aspell;
my $speller = Text::Aspell->new;
die unless $speller;
$speller->set_option('master','./dictionary.local');
my @suggestions = $speller->suggest( $misspelled );
Eso es todo: dada la palabra $misspelled, Aspell me devuelve un array de palabras sugeridas, ordenadas de más certeras a menos. Lo que queda es integrar este código dentro de la aplicación. El código se invoca cuando Sphinx devuelve pocos o ningún resultado y en ese momento, si se obtienen palabras sugeridas, se le ofrece al usuario rehacer su búsqueda con la primera sugerencia.
Y funciona realmente bien, se pueden hacer pruebas en el search de Kedin.es buscando Madona mal escrito: http://kedin.es/search?q=madona.












