Hay un problema que estamos tratando de resolver donde queremos hacer una búsqueda semántica en nuestro conjunto de datos, es decir, tenemos datos específicos de dominio (ejemplo: oraciones que hablan de automóviles)
Nuestros datos son solo un montón de oraciones y lo que queremos es dar una frase y recuperar las oraciones que son:
- Similar a esa frase
- Tiene una parte de una oración que es similar a la frase
- Una oración que tiene significados contextualmente similares.
Déjame intentar darte un ejemplo, supongo que busco la frase "Experiencia de compra", debería obtener las siguientes frases:
- Nunca pensé que la compra de automóviles podría tomar menos de 30 minutos para firmar y comprar.
Encontré un auto que me gustó y el proceso de compra fue
sencillo y sencilloAbsolutamente odiaba ir de compras, pero hoy me alegro de haberlo hecho.
Quiero poner énfasis en el hecho de que estamos buscando similitudes contextuales y no solo una búsqueda de palabras de fuerza bruta.
Si la oración usa palabras diferentes, entonces también debería poder encontrarla.
Cosas que ya hemos probado:
Búsqueda semántica abierta El problema que enfrentamos aquí es generar ontología a partir de los datos que tenemos, o por eso buscar ontología disponible de diferentes dominios de nuestro interés.
Búsqueda elástica (BM25 + Vectores (tf-idf)), probamos esto donde daba algunas oraciones, pero la precisión no era tan buena. La precisión también era mala. Intentamos contra un conjunto de datos curado por humanos, solo pudo obtener alrededor del 10% de las oraciones.
Probamos diferentes incrustaciones como las que se mencionaron anteriormente en transformadores de oraciones y también pasamos por el ejemplo e intentamos evaluar contra nuestro conjunto curado por humanos y eso también tenía una precisión muy baja.
Intentamos ELMO . Esto fue mejor pero aún menor precisión de lo que esperábamos y hay una carga cognitiva para decidir el valor del coseno por debajo del cual no deberíamos considerar las oraciones. Esto incluso se aplica al punto 3.
Cualquier ayuda será apreciada. Muchas gracias por la ayuda de antemano
Respuestas:
Le sugiero que vea la conferencia de Trey Grainger sobre cómo construir un sistema de búsqueda semántica => https://www.youtube.com/watch?v=4fMZnunTRF8 . Habla sobre la anatomía de un sistema de búsqueda semántica y cada una de las piezas que solían encajar para ofrecer una solución final.
Un gran ejemplo de la similitud contextual es el motor de búsqueda de Bing:
La consulta original tenía los términos {refresco enlatado} y los resultados de búsqueda de Bing pueden referirse a {refresco dietético enlatado}, {refrescos}, {pop de temperatura ambiente sin abrir} o {bebidas gaseosas}. ¿Cómo hizo esto Bing ?:
Bueno, las palabras que tienen significados similares obtienen vectores similares y luego estos vectores se pueden proyectar en un gráfico bidimensional para visualizarlos fácilmente. Estos vectores se entrenan asegurando que las palabras con significados similares estén físicamente cerca unas de otras. Puede entrenar su propio modelo basado en vectores entrenando el modelo GloVe
Cuanto más cercanas estén las distancias de los vectores entre sí, mejor. Ahora puede buscar consultas vecinas más cercanas en función de la distancia de sus vectores. Por ejemplo, para la consulta {cómo evitar que los animales destruyan mi jardín}, el vecino más cercano da estos resultados:
Puedes aprender más acerca de esto aquí. Para su caso, puede encontrar un umbral para la distancia máxima que puede ser un vector de una oración desde la consulta de búsqueda original para que se considere una oración contextualmente similar.
La similitud contextual también puede lograrse reduciendo la dimensión del vocabulario utilizando algo como LSI (indexación semántica latente). Para hacer esto en Python, le recomiendo que revise la biblioteca genism para python: https://radimrehurek.com/gensim/about.html .
fuente
Es posible que le interese investigar Weaviate para ayudarlo a resolver este problema. Es un gráfico inteligente basado en la vectorización de objetos de datos .
Si tiene un lenguaje específico de dominio (por ejemplo, abreviaturas) puede extender Weaviate con conceptos personalizados .
Es posible que pueda resolver su problema con las funciones de búsqueda semántica (es decir,
Explore{}
) o las funciones de clasificación automática.Función de exploración
Como todos los objetos de datos se vectorizan, puede hacer una búsqueda semántica como la siguiente (este ejemplo proviene de los documentos , puede probarlo aquí usando GraphQL):
Si estructura su esquema gráfico basado, por ejemplo, en el nombre de la clase "Sentencia", una consulta similar podría verse así:
Nota:
También puede explorar el gráfico semánticamente como un todo.
Clasificación automática
Una alternativa podría ser trabajar con las características de clasificación contextual o KNN .
En su caso, puede usar la clase Sentencia y relacionarla con una clase llamada Experiencia, que tendría la propiedad:
buying
(por supuesto, hay muchas otras configuraciones y estrategias entre las que puede elegir).PD:
este video da un poco más de contexto si lo desea.
fuente
Hasta donde sé, no creo que exista ningún modelo teórico para construir un motor de búsqueda semántico. Sin embargo, creo que un motor de búsqueda semántico debería estar diseñado para satisfacer los requisitos específicos disponibles. Dicho esto, cualquier motor de búsqueda semántico que pueda comprender con éxito la intención del usuario, así como el contexto del término de búsqueda, necesita trabajar con el procesamiento del lenguaje natural (PNL) y el aprendizaje automático como los componentes básicos.
Aunque los motores de búsqueda funcionan de manera diferente a las herramientas de búsqueda, puede consultar las herramientas de búsqueda empresarial para tener una idea sobre un modelo de búsqueda semántica que funcione. Las plataformas de la nueva era como 3RDi Search funcionan según los principios de la búsqueda semántica y han demostrado ser la solución ideal para los datos no estructurados con los que las empresas tienen que lidiar. Es muy probable que Google esté trabajando en un modelo para introducir semántica avanzada en el motor de búsqueda.
fuente