Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es la realización de búsquedas textuales. Este problema se puede resolver con muchos enfoques, desde una búsqueda exacta como permiten la mayoría de los lenguajes de programación, hasta la utilización de algoritmos de procesamiento del lenguaje natural.
Tabla de contenidos
El procesamiento del lenguaje natural, conocido también por sus siglas en inglés NPL consiste en desarrollar y aplicar distintas técnicas, metodologías y algoritmos que utilizan como entrada y/o salida texto o voz. La complejidad de este campo, es que agrupa conceptos como:
Además, hay que tener en cuenta que mientras que la escritura por ordenador es siempre igual, en el caso de la voz cada usuario dependiendo de su lugar, sexo, edad, etc presenta características distintas.
ElasticSearch es un proyecto basado en Apache Lucene, que nos permite tener un servidor para realizar búsquedas. El proyecto fue creado por Shay Banon y tiene como principales características la velocidad de búsqueda y la escalabilidad. Este software es ampliamente usado en buscadores, e-commerce y para tratar el lenguaje natural.
La verdad es que ElasticSearch es bastante complejo de utilizar ya que utiliza una conjunto de conceptos específicos de este software y su configuración no es del todo intuitiva. Sin embargo, los resultados valen la pena. Por este motivo os dejo la siguiente presentación, en la cual podéis ver un explicación detallada de todos los conceptos, cómo configurar ElasticSearch y algunos casos de uso. Esta presentación es la que yo he utilizado para desarrollar un trabajo sobre este software y es de lo mejor que he leído en español sobre este tema.
Muchos os preguntaréis por qué hablo de ElasticSearch si es un software de búsqueda. Esto es debido a que ElasticSearch tiene implementado multitud de algoritmos para el procesamiento del lenguaje natural, ya que estos se usan para mejorar los resultados. Por ejemplo, si el usuario busca por “coches” también le interesan los resultados de “coche”.
Los algoritmos de procesamiento del lenguaje más destacados se pueden categorizar en:
Para obtener los mejores resultados, hay que utilizar los tres anteriores de manera consecutiva.
Para ilustrar cómo funcionaría, si nosotros realizásemos la siguiente búsqueda: “¿Dónde comer en Salamanca?”, con lo anterior se transformaría en “donde come salamanca”. Esto haría que el número de resultados desfavorables se redujera ya que, aquellos que tienen en su título la palabra “en” no saldrían, al haber sido eliminada.
Debido al modelo de negocio de ElasticSearch, que combina una base gratuita con multitud addons de pago, para rentabilizar el proyecto, muchos de ellos relativos a la seguridad, Amazon ha creado Open Distro for ElasticSearch. Esta nueva distribución, no es más que la base de ElasticSearch con algunas mejoras, principalmente en los siguientes aspectos:
Debido a estas mejoras, puede que te interese probar esta versión si estas comenzando en este mundillo.
Espero que esta entrada os anime a profundizar en ElasticSearch y que lo podáis utilizar para vuestros sistemas de búsqueda.
Si bien ElasticSearch trae un número bastante grande de analyzers ya creados, si necesitas realizar búsquedas muy específicas, te tocará diseñar tu propio analyzer. Ese sistema se diseña como un pipeline o tu tubería, donde la salida de un módulo se conecta a la entrada de otro módulo, dando como resultado los tokens que se indexaran en el diccionario invertido. Si estas palabras te suenan a chino, te invito a ver la presentación de mercadolibre que hay en este mismo artículo. Los distintos módulos que forman un analyzer pueden ser:
Supongamos que tenemos un campo “teléfonos” y ahí los usuarios introducen datos de múltiples maneras:
Si queremos realizar una búsqueda con ElasticSearch sobre estos campos podríamos configurar un analyzer de la siguiente manera:
Supongamos que la entrada a indexar es “+34 123-456-789 +77456789123” el resultado de aplicar cada módulo sería el siguiente:
El algoritmo que se sigue para esto último es similar a:
var input = "123456789" var ngram =3; do{ for(var i=0;input.length>=(i+ngram);i++) console.log(input.slice(i,i+ngram)); ngram++ }while(ngram<7)
Espero que este artículo te resulte útil
Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…
Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…
Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…
Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…
Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…
En los últimos tiempos y debido a la transformación digital de las empresas, cada vez…