¿Cómo se incorpora el aprendizaje automático en el diseño de motores de búsqueda?

15

Actualmente estoy construyendo un pequeño motor de búsqueda interno basado en Apache Lucene. Su propósito es simple: basado en algunas palabras clave, sugerirá algunos artículos escritos internamente dentro de nuestra empresa. Estoy usando una puntuación TF-IDF bastante estándar como métrica base y construí mi propio mecanismo de puntuación encima. Todo esto parece estar funcionando excelente, excepto en algunos casos en los que la clasificación parece desordenada.

Entonces, lo que planeo hacer es agregar un pequeño enlace Relevante / No Relevante a la página de resultados de búsqueda para que los usuarios puedan hacer clic en uno de ellos dependiendo de su percepción de si ese resultado debería haberse incluido en primer lugar.

Mi idea

  1. Trate estos Relevantes / No Relevantes como etiquetas y cree datos de capacitación.
  2. Use estos datos para entrenar a un clasificador (como SVM)
  3. Incorpore este modelo en el motor de búsqueda, es decir, cada nuevo resultado pasará por el clasificador y se le asignará una etiqueta sobre si es relevante o no.

Este enfoque me parece intuitivo, pero no estoy seguro de si funcionará en la práctica. Tengo dos preguntas específicas:

  1. ¿Qué características debo extraer?
  2. ¿Hay una mejor manera de integrar el componente de aprendizaje automático en el motor de búsqueda? Mi objetivo final es "aprender" la función de clasificación basada tanto en la lógica empresarial como en los comentarios de los usuarios.
Leyenda
fuente
44
Hice algo como esto una vez y los usuarios lo odiaron, así que lo apagué. El problema era el comportamiento del usuario. Los usuarios se adaptaron a las debilidades en los resultados de búsqueda al cambiar sus términos, y luego continuaron reutilizando esos términos. El sistema respondió ajustando la clasificación de los elementos y esos términos favoritos comenzaron a producir resultados diferentes. Esto pisoteó a los usuarios. Aprender no significa que sea más inteligente;)
Reactgular
Aquí hay una implementación usando elasticsearch y angularjs - también contiene las explicaciones que necesita - machinelearningblogs.com/2016/12/12/…
Vivek Kalyanarangan

Respuestas:

15

(1) ¿Qué características debo extraer?

Primero, date cuenta de que no estás clasificando documentos. Está clasificando pares (documento, consulta), por lo que debe extraer características que expresen qué tan bien coinciden.

El enfoque estándar para aprender a clasificar es ejecutar la consulta en varias configuraciones de motor de búsqueda (por ejemplo, tf-idf, BM-25, etc.) y luego entrenar un modelo en los puntajes de similitud, pero para un SE pequeño, específico de dominio, podrías tener características como

  • Para cada término, un booleano que indica si el término aparece tanto en la consulta como en el documento. O tal vez no sea un valor booleano, pero los pesos tf-idf de esos términos de consulta que realmente ocurren en el documento.
  • Diversas métricas de superposición como Jaccard o Tanimoto.

(2) ¿Hay una mejor manera de integrar el componente de aprendizaje automático en el motor de búsqueda? Mi objetivo final es "aprender" la función de clasificación basada tanto en la lógica empresarial como en los comentarios de los usuarios.

Esta es una pregunta muy amplia, y la respuesta depende de cuánto esfuerzo quieras poner. La primera mejora que se te viene a la mente es que no debes usar los juicios de relevancia binarios del clasificador, sino su función de decisión con valor real, para que puedas hacer una clasificación en lugar de solo filtrar. Para un SVM, la función de decisión es la distancia firmada al hiperplano. Los buenos paquetes de aprendizaje automático tienen una interfaz para obtener el valor de eso.

Más allá de eso, mire en pares y en listas para aprender a clasificar; lo que estás sugiriendo es el llamado enfoque puntiagudo. IIRC, pairwise funciona mucho mejor en la práctica. La razón es que con la clasificación por pares, necesita muchos menos clics: en lugar de que los usuarios etiqueten los documentos como relevantes / irrelevantes, solo les da el botón "relevante". Luego, aprende un clasificador binario en triples (documento1, documento2, consulta) que indica si el documento1 es más relevante para la consulta que el documento2, o viceversa. Cuando un usuario etiqueta, digamos, el documento 4 en la clasificación como relevante, eso le da seis muestras para aprender:

  • document4> document3
  • document4> document2
  • document4> document1
  • documento1 <documento4
  • documento2 <documento4
  • documento3 <documento4

así que obtienes los negativos gratis.

(Todas estas son solo sugerencias, no he probado nada de esto. Simplemente he trabajado en un grupo de investigación donde la gente investigó aprender a clasificar. Hice una presentación del trabajo de otra persona para un grupo de lectura una vez, tal vez el las diapositivas pueden ser de ayuda).

Fred Foo
fuente
+1 gracias. ¡Esta es la segunda vez que me ayudas! Déjame tomar un par de horas para digerir esto. :)
Leyenda
44
Esa es una excelente respuesta, solo me gustaría sugerir un pequeño ajuste. Desde una perspectiva de UX, es mucho más probable que los usuarios obtengan un resultado utilizando un botón "irrelevante" que un botón "relevante". ¿Quién se queda para anotar un resultado cuando encuentran lo que están buscando? Son mucho más propensos a presionar un botón que parece una "oportunidad para quejarse" cuando no han encontrado lo que querían, porque mejorar el sistema en ese momento en realidad está alineado con su objetivo actual.
Racheet
44
tl; dr Si va a usar solo una entrada, haga que sea "irrelevante", es más probable que las personas hagan clic cuando están frustrados.
Racheet
¿Cuál sería el enfoque "por listas"? Además, ¿quisiste decir 3 o 6 ejemplos gratis? (¿Los últimos 3 parecen ser solo una repetición de los primeros 3?)
max