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

Facundo Batista facundobatista en gmail.com
Jue Dic 15 09:38:56 ART 2011


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/



More information about the pyar mailing list