• Publicidad

Sugerencia de módulos para buscar texto

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Sugerencia de módulos para buscar texto

Notapor danimera » 2013-11-29 09:30 @437

Primero quiero buscar o si existe algún script o módulo que me ayude en estas tres tareitas

1) Módulo o script de buscador. Mi página tiene un buscador donde las personas escribirán lo que quieren buscar, pero yo quiero que a un módulo le pueda pasar un contenido y una cadena de búsqueda y el me realice el trabajo de devolverme alguna coincidencia o algo de la búsqueda.

2) Módulo que dé similitud de una palabra con otra. Ejemplo: si tengo las palabras abadía y abad, que el modulo me diga que tiene algún porcentaje de similitud, o por ejemplo: matrimonio y matrmonio; aunque falte una letra el módulo me diga algo.

3) Módulo que me autodetecte la codificación de una cadena de texto y así mismo me lo convierta en la codificación que yo necesito ¡je,je,je!

No es mucho.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Sugerencia de módulos para buscar texto

Notapor explorer » 2013-12-02 21:54 @954

1) Si son pocos documentos, puedes hacer que el propio Perl abra los documentos y busque por su interior, con un simple grep(), por ejemplo. Si son unos pocos más, hay que pensar en alguna base de datos que nos permita guardar los documentos y una búsqueda dentro de ellos (fulltext). Mira, por ejemplo, Search::Fulltext. Si son muchos, pues entonces entramos en el terreno de la indexación de los documentos, para hacer las búsquedas más rápidas.

2) Tienes varias opciones: String::Approx, Text::Soundex, Algorithm::Diff, Text::Metaphone, ...

3) Eso que pides es muy complicado. De hecho, dada una ristra de bytes, no es posible decir, con total seguridad, a qué codificación pertenece. Encode::Guess es lo que más se acerca a lo que quieres, pero no está garantizado en absoluto el éxito de la operación. En el propio manual se indica que, para aumentar la probabilidad de acierto, hay que pasarle el nombre de las codificaciones que "sospechamos" en que puede estar el texto.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sugerencia de módulos para buscar texto

Notapor danimera » 2013-12-03 08:42 @404

Yo tengo una bd en CSV y hay un campo de descripción y título. No puedo usar fulltext porque no es MySQL ni otra base de datos, pero yo tendré contenido en texto y ahí quiero que se realice esa búsqueda, por ejemplo, la persona busca: "fiesta de disfraces" o "2x1" y tengo un contenido que dice: "esta noche gran fiesta de muchos disfraces, ven a disfrutar, también hay 2x1 en margaritas".

El resultado debería mostrar ese contenido, pero no son html estáticos y no es una DB como MySQL. Son CSV, es decir, puro texto.


Del resto, está genial.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Sugerencia de módulos para buscar texto

Notapor explorer » 2013-12-03 10:23 @474

Bueno, aún siendo archivos CSV, son archivos de texto, así que se puede buscar en ellos con un grep() (si el número de documentos no es excesivo, claro).

Lo que hay que hacer es partir la entrada del usuario, en palabras (\w+) y luego recorrer cada documento, asignándole una nota según contenga más o menos palabras de las que ha ingresado el usuario.

Algo así:
  • obtener la lista de palabras que introduce el usuario
  • por cada documento a mirar
  • contar uno por cada palabra que el documento contenga: $contador++ while /lista|palabras/g;
  • repetir para todos los documentos
  • sacar el listado de documentos ordenados de mayor a menor nota.
Naturalmente, esto es muy simplista, porque
  • habría que desechar antes las palabras que introduce el usuario y que no aportan valor a la búsqueda (por ejemplo, las preposiciones)
  • no encuentra palabras similares (si pone abad, encuentra abadía, pero si pone disfraz, no encuentra disfraces)
Para lo primero, es fácil: un grep() que desestime las palabras más comunes.
Para lo segundo, se podría ampliar la búsqueda usando alguno de los módulos indicados antes, para buscar similitudes. Pero habría que hacerlo palabra por palabra. Mejor entonces leer el documento, sacar las palabras diferentes, desechar las no interesantes, y buscar en el resto coincidencias con lo que se busca.

Humm... creo que vas a tardar menos si buscas algún módulo así en CPAN.

Casi todos los motores de búsqueda de tamaño medio-grande usan un sistema de indexación previa de los contenidos, para que luego la búsqueda se haga lo más rápido posible.

Tienes un montón de soluciones que abarcan muchos niveles: Lucy, Catmandu, ElasticSearch, WebService::Solr... estos son para grandes volúmenes de información. Search::Fulltext sí que te puede servir para lo que quieres, para un volumen de tamaño medio. AnyData o DBD::CSV para poco volumen.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sugerencia de módulos para buscar texto

Notapor danimera » 2013-12-04 11:36 @525

explorer, no sé si agradecerte por la información o arrepentirme de preguntarte :s Ya no sé qué hacer, (^^ DIGO QUE ya no sé qué hacer, por que Perl tiene muchas alternativas)
Ya solucioné lo de la codificación, y el módulo de similitud de palabras está bien.

Pero déjame que te ilustro con mi situación:

Escenario 1
Tengo un base de datos en CSV que uso con DBD::CSV.
Tengo un buscador en el sitio, donde las personas pondrán una frase a buscar y evidentemente con SQL debería buscar los datos, pero recordar que no cuento con campo Fulltext, así que mis búsquedas son mediocres, AQUÍ NO HAY PROBLEMA CON USAR una tecnica de buscar palabra por palabra, (ES LO QUE TENGO AHORA).

Escenario 2
Yo voy pasando al módulo que hace la búsqueda cada registro que tengo y que el módulo me diga qué registro contiene las coincidencias (ES LO QUE ME GUSTARÍA HACER).

Escenario 3
Indexar todo mi contenido de mi base de datos CSV, realmente no es mucha información, serían por ahora menos de 20 000 registros
(ES LO QUE ME QUIERO SABER SI ME RECOMIENDAS HACER Y CON CUÁL MÓDULO HACERLO).
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Sugerencia de módulos para buscar texto

Notapor explorer » 2013-12-04 15:34 @690

Bueno, 20 000 registros no es mucho, así que el escenario 3 podría ser también el 2.

La clave es leer el CSV, leer los campos que te interesan, y aplicar la expresión regular en todos los registros, y quedarte con los que cumplen la coincidencia. Ordenarlos luego según el nivel de coincidencia, y sacarlos en ese orden.

Si todos los campos son de texto entonces sí que podemos decir que estamos haciendo una búsqueda fulltext si le aplicamos una expresión regular (o cualquier otra función de búsqueda, como index(), rindex)

Entonces haces pruebas de tiempos, y si te vale, bien. Si te va lento, pues entonces una solución sería pasar todos los archivos CSV a base de datos, y ahí sí que pones los campos que quieres en los que se puede hacer una búsqueda fulltext (explicación y ejemplo para MySQL).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sugerencia de módulos para buscar texto

Notapor danimera » 2013-12-04 16:14 @718

En la segunda opción si yo pudiera tener algo con un módulo, que yo hiciera algo como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $rst = $modulo->buscar($texto_usuario,$texto_campo_db);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y digamos que el si $rst me devuelve que la búsqueda tiene un resultado, entonces ese registro lo muestro, ahora pues el múdulo Search::Fulltext con ese entonces haré el desarrollo, para ahorrarme trabajo en la búsqueda.

Usando precisamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $results = $fts->search('beer AND happy');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias, explorer.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados