Sinónimos y vocabularios: búsquedas avanzadas con Elasticsearch

En este tutorial sobre el motor de búsquedas Elasticsearch vamos a ver cómo implementar diferentes políticas que nos permitirán crear buscadores que vayan más allá de la simple correspondencia léxica.

Índice de contenidos

1. Introducción

Cuando nos enfrentamos a un problema de búsquedas relacionado con el lenguaje natural estamos lidiando con un problema de interpretación de las entradas que se reciben a la hora de realizar la búsqueda. Este proceso de interpretación puede enfocarse desde múltiples puntos de vista:

  • Normalización de términos.
  • Reducir los términos a su lexema.
  • Sinónimos.

En el presente tutorial vamos a realizar una serie de aproximaciones sucesivas sobre esta problemática con Elasticsearch para ver cómo podemos ir mejorando un sistema de búsquedas de manera iterativa e incremental.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: portátil MacBook Pro Retina 15′ (2.7 Ghz Intel Core I7, 16GB DDR3)
  • Sistema operativo: Mac OS Sierra 10.12.5
  • Elasticsearch 5.4

3. Aproximaciones

3.1. Punto de partida

Disponemos de un índice en Elasticsearch que almacena informes con un texto relativo a la intervención que realizó un veterinario y, sobre esos documentos, queremos realizar búsquedas por términos relacionados, por ejemplo perros.

Como podemos comprobar, al realizar una búsqueda por “perro” no obtenemos ningún resultado, puesto que la coincidencia exacta de valores no se da en ningún caso, tampoco obtenemos ningún valor relacionado.

3.2. Aproximación basada en sinónimos

La primera aproximación que podemos realizar sobre el problema consiste en definir un conjunto de sinónimos que haga que el buscador nos devuelva correspondencias entre términos como sinónimos.

Para el mismo conjunto de datos podemos replantear la búsqueda que realizabamos en el punto anterior.

Gracias a al filtro que hemos establecido el resultado será el esperado y aparecerán aquellas coincidencias con los sinónimos definidos. Sin embargo, aparece un comportamiento que puede resultar no adecuado dependiendo de la precisión que se requiera. Por ejemplo:

Este comportamiento se produce debido a la forma en la que Elasticsearch procesa la información. A muy alto nivel, podemos decir que Elasticsearch, a través de los analizadores, se encarga de generar tokens por separado para cada término que encuentra de acuerdo a un conjunto de reglas.

En este ejemplo concreto, establecemos un analizador basado, por un lado, en un generador de tokens standard y por el otro lado un filtro (que también procesará tokens) ad-hoc basado en sinónimos.

Así, sobre nuestro ejemplo podemos ver que, al establecer el texto “border collie” nuestro analizador va a generar dos conjuntos de tokens “border” y “collie” y, con posterioridad, aplicará los conjuntos de sinónimos dejando los conjuntos como “perro, chucho, border, bull, dogo, labrador, pinscher” y “collie, terrier, alemán, miniatura”. Y son estos conjuntos de tokens los que se tendrán en cuenta a la hora de realizar la búsqueda posterior, pudiendo generar valores correctos (“border collie” o “bull terrier”) y valores incorrectos (“labrador alemán”, “chucho terrier”).

3.3. Aproximación basada en sinónimos mejorada

Una posible mejora sobre la solución basada en sinónimos pasa por considerar algunos términos compuestos como un único token, de esta manera eliminamos la posibilidad del cruce de términos indebido que veíamos en el punto anterior.

Esto puede conseguirse simplemente estableciendo un generador de tokens distinto a nivel de nuestro filtro de sinónimos, en concreto el tipo keyword. Sin embargo, estableciendo este tipo de tokenizador perdemos la potencia de la que disponíamos a través de los sinónimos.

Es en este punto donde entra el filtro keep, que nos permitirá mantener ciertos términos dentro de las búsquedas retomando esa potencia perdida por el tokenizador.

Todo esto lo estableceremos como un subcampo dentro del campo descripción para que, a la hora de realizar búsquedas, podamos aumentar la prioridad de ciertas correspondencias frente a otras.

O de manera manual, mediante la sintaxis de Solr:

3.4. Aproximación basada en taxonomías y vocabularios controlados

Si queremos realizar una aproximación más cercana al lenguaje natural necesitamos centrar nuestros esfuerzos en las taxonomías y los vocabularios controlados.

Las taxonomías son clasificaciones jerárquicas de cosas, por ejemplo la categoría taxonómica: taxones o grupos en que se clasifican los seres vivos: Dominio > Reino > Filo > Clase > Orden > Familia > Género > Especie

Un vocabulario controlado es una extensión de una taxonomía que tiene en cuenta sinónimos. Ejemplos de vocabularios controlados son: Tesauros, encabezamientos de materias u ontologías.

En concreto, un tesauro es un instrumento de control terminológico que traduce a un lenguaje sistémico o documental el lenguaje natural empleado en los documentos y por los usuarios. Consiste en un vocabulario controlado y dinámico de términos relacionados semántica y jerárquicamente, que se aplica a un campo específico del conocimiento.

Algunos ejemplos de tesauros pueden ser:

Los términos que conforman el tesauro se interrelacionan entre ellos bajo tres modalidades de relación:

  • Relaciones jerárquicas: establecen subdivisiones que generalmente reflejan estructuras de TODO/Parte. Hiperónimos e hipónimos.
    • Los hiperónimo: aquel término que puede ser utilizado para referirse a la realidad nombrada por un término más específico.
    • Los hipónimos: palabra que posee todos los rasgos semánticos, o semas, de otra más general —su hiperónimo— pero que en su definición añade otras características semánticas que la diferencias de ésta.
  • Relaciones de equivalencia: controlan la sinonimia, homonimia, antonimia y polisemia entre los términos.
  • Relaciones asociativas: mejoran las estrategias de recuperación y ayudan a reducir la poli-jerarquía entre los términos.

4. Conclusiones

Como hemos visto, con Elastisearch podemos implementar múltiples políticas de análisis enfocadas en las búsquedas permitiéndonos así responder a un amplio abanico de necesidades.

Sinónimos, vocabularios o taxonomías son distintos enfoques para resolver un mismo problema, afrontar la tarea (nada trivial) de intentar comprender qué información es la que realmente el consumidor quiere recibir en base a un “lenguaje natural”.

Queda en nuestra mano, como profesionales del software, razonar cuál de las soluciones es la que mejor se adapta a las necesidades a cubrir siempre optando por la más sencilla.

5. Referencias