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

Daniel Moisset dmoisset en machinalis.com
Jue Dic 15 11:12:00 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.

El desfasaje es por el ".encode('ASCII', 'ignore')"

Mi primera solucion va a ser "sacalo!"y vos me diras "no, es que lo
necesito por X", y ahi vamos a saber mejor tu problema :)

D.



More information about the pyar mailing list