[pyar] Las búsquedas son un quilombo... el regreso

Martin Cerdeira martincerdeira en gmail.com
Vie Dic 16 09:10:58 ART 2011


2011/12/15 Facundo Batista <facundobatista en gmail.com>

> Eones atrás (o algunos meses, pero vieron como es el tiempo), hubo un
> thread sobre la mejor forma de procesar una cadena para luego buscar
> sobre ella.
>
> Yo, tenía armado algo que hacía todo a mano, y funcionaba bastaaaaaante
> bien:
>
>  http://www.taniquetil.com.ar/plog/post/1/397
>
> Pero alguien en ese thread sugirió algo muy copado, que era:
>
> >>> from unicodedata import normalize
> >>> def normalizar(unicode_string):
> ...   return normalize('NFKD', unicode_string).encode('ASCII',
> 'ignore').lower()
> ...
> >>> normalizar(u"Moño camión")
> 'mono camion'
>
> La idea es que cuando se arma el índice, se "normaliza" todas las
> cadenas, y luego cuando la persona busca, se normaliza lo que la
> persona entró... entonces, si buscan por "camión" o por "camion", en
> ambos casos encuentran la cadena antedicha.
>
> Ok, ahora llevemos esto al próximo nivel.
>
> Uno de los features de la versión 0.4 de Encuentro [0] (que todavía no
> está liberada, pero estamos a punto...) es que permite "filtrar"
> haciendo búsquedas. Algo que queda muy lindo es resaltar en lo
> encontrado la parte que coincide con lo buscado. Entonces, si tenemos
> una cadena que dice "Titulo blah blah", y uno filtra por "lo b", esos
> cuatros caracteres, en el título, aparecen resaltados.
>
> Para hacer eso, basicamente hago algo como lo siguiente
>
> >>> texto_original = u"Moño camión"
> >>> texto_normalizado = normalizar(texto_original)
> >>> texto_normalizado
> 'mono camion'
> >>> busqueda = "cam"
> >>> pos = texto_normalizado.find(busqueda)
> >>> pos    # si esto fuera -1, no muestro este campo, porque no matchea
> 5
> >>> texto_original[pos:pos+len(busqueda)]  # esto es lo que quedaria
> resaltado
> u'cam'
>
> Obviamente, ahí muestro eso resaltado, y el resto del título en
> normal. El efecto es muy lindo.
>
> Pero.
>
> Resulta que me encontré con un string como el siguiente:
>
> >>> texto_original = u'Escuela N\xba 16 \u201cEsteban Echeverr\xeda\u201d
> del R\xedo La Barquita'
> >>> print texto_original
> Escuela Nº 16 “Esteban Echeverría” del Río La Barquita
>
> Miren qué pasa:
>
> >>> texto_normalizado = normalizar(texto_original)
> >>> texto_normalizado
> 'escuela no 16 esteban echeverria del rio la barquita'
> >>> busqueda = "ban"
> >>> pos = texto_normalizado.find(busqueda)
> >>> pos
> 18
> >>> texto_original[pos:pos+len(busqueda)]
> u'eba'
>
> Esto sucede porque...
>
> >>> normalize('NFKD', u"\u201c").encode('ASCII', 'ignore').lower()
> ''
>
> ...haciendo que en lo normalizado ese caracter no exista, desfasando todo.
>
> Ideas de algo que funcione y sea elegante?
>
> Todavía no armé algo que funcione, pero me pareció interesante
> contarles, ya que este podría ser un problema común...
>
> Slds.
>
>
> [0] http://encuentro.taniquetil.com.ar/
>
> --
> .    Facundo
>
> Blog: http://www.taniquetil.com.ar/plog/
> PyAr: http://www.python.org/ar/
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>


Pregunto, en el programa real, la búsqueda no se hace con un query a una
base de datos?
O estás usando alguna técnica, onda Ajax, que refresque lo que hay en la
pantalla?

-------------------------------------
Martín Cerdeira - Software Developer
At the end of the day, ship the fucking thing! It’s great to rewrite your
code and make it cleaner and by the third time it’ll actually be pretty.
But that’s not the point—you’re not here to write code; you’re here to ship
products. - Jamie Zawinski
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20111216/49af2e01/attachment.html>


More information about the pyar mailing list