2009-09-10 18 views
35

Estoy interesado en los motores de recomendación en estos días y quiero mejorar en esta área. Actualmente estoy leyendo "Programming Collective Intelligence". Creo que este es el mejor libro sobre este tema, de O'Reilly. Pero no tengo ninguna idea sobre cómo implementar el motor; Lo que quiero decir con "no tengo idea" es "no sé cómo comenzar". Tengo un proyecto como Last.fm en mi mente.¿Cómo crear mi propio motor de recomendación?

  1. ¿Dónde (debería implementarse en el lado de la base de datos back-end o lateral) comienzo a la creación de motor de recomendación?
  2. ¿Qué nivel de conocimiento de la base de datos se necesitará?
  3. ¿Hay alguna de código abierto que se puede utilizar como ayuda o como recurso?
  4. ¿Cuáles deberían ser los primeros pasos que tengo que hacer?
+0

¿Cuál es su experiencia? ¿Ya sabes cómo programar? ¿En que idioma?¿Y cuál es su enfoque? Supongo que la lógica de back-end, pero si también quiere que las páginas se vean bien es un challgenge extra ;-) –

+0

soy estudiante cs tengo buen conocimiento c, C++, java y también C# en lado web tengo php en la base de datos intermedia mysql y un pequeño oráculo. –

+0

Lo que necesita es algún conocimiento de ingeniería de software, como cómo obtener y analizar requisitos. Si descubres lo que realmente quieres, otra técnica ya no es un problema. –

Respuesta

22

He creado uno para un portal de video. La idea principal que tuve fue sobre la recopilación de datos sobre todo:

  • ¿Quién subió un video?
  • ¿Quién comentó un video?
  • ¿Qué etiquetas se crearon?
  • ¿Quién visitó el video? (también rastreando visitantes anónimos)
  • ¿Quién marcó la diferencia como favorito de un video?
  • ¿Quién evaluó un video?
  • ¿A qué canales se le asignó el video?
  • Las secuencias de texto del título, la descripción, las etiquetas, los canales y los comentarios se recopilan mediante un indizador de texto completo que asigna importancia a cada una de las fuentes de datos.

Siguiente He creado funciones que devuelven listas de (id, peso) tuplas para cada uno de los puntos anteriores. Algunos solo consideran una cantidad limitada de videos (por ejemplo, los últimos 50), algunos modifican el peso, por ejemplo, clasificación, conteo de etiquetas (más a menudo etiquetado = menos expresivo).Hay funciones que devuelven las siguientes listas:

  • vídeos similares por búsqueda de texto completo
  • vídeos subidos por el mismo usuario
  • Otros videos los usuarios de estos comentarios también comentadas
  • Otros videos de los usuarios de estos favoritos también favorited
  • Otros videos los calificadores de estas calificaciones también rated (ponderada) del
  • Otros videos en los mismos canales
  • Otros vídeos con las mismas etiquetas (ponderado por "expresividad" de las etiquetas)
  • Otros vídeos reproducidos por personas que jugaron este vídeo (XY últimas jugadas)
  • Vídeos similares por los comentarios de texto completo
  • vídeos similares por texto completo del título
  • vídeos similares por descripción de texto completo
  • vídeos similares por etiquetas de texto completo

Todos estos serán combinadas en una sola lista con sólo sumar los pesos de identificaciones de video, t gallina clasificada por peso. Esto funciona bastante bien para alrededor de 1000 videos ahora. Pero necesitas hacer un procesamiento en segundo plano o almacenamiento en caché extremo para que esto sea rápido.

Espero que pueda reducir esto a un motor de recomendación genérico o una calculadora de similitud pronto y liberarlo como un complemento de rails/activerecord. Actualmente sigue siendo una parte bien integrada de mi proyecto.

para dar una pequeña pista, en el código de rubí se ve así:

def related_by_tags 
    tag_names.find(:all, :include => :videos).inject([]) { |result,t| 
    result + t.video_ids.map { |v| 
     [v, TAG_WEIGHT/(0.1 + Math.log(t.video_ids.length)/Math.log(2))] 
    } 
    } 
end 

estaría interesado en cómo otras personas a resolver este tipo de algoritmos.

+0

¿Ya se ha convertido en una joya? –

+0

Aparentemente no, el proyecto está congelado y supongo que nunca continuará ... :-(Así que a menos que haya otro proyecto para mí que haga uso de esto, probablemente no lo dividiré. – hurikhan77

+0

@ hurikhan77 Estaba trabajando en un motor de recomendación de música similar. Estoy confundido sobre la selección de la base de datos. Lo que pensé es almacenar los datos estáticos en una base de datos relacional y almacenar el usuario en eventos (como, reproducir, etc.) en una búsqueda Elastic y trabajar sobre ella. das tu opinión y me ayudas. – Gaurav

2

Esta es realmente una gran pregunta que me hace, así que incluso si pudiera darle una respuesta detallada, dudo que tuviera el tiempo ... pero tengo una sugerencia, eche un vistazo a Greg Linden's blog y sus documentos sobre el filtrado colaborativo basado en elementos. Greg implementó la idea de motores de recomendaciones en Amazon utilizando el enfoque basado en elementos, realmente conoce sus cosas y su blog y sus documentos son muy legibles.

Blog: http://glinden.blogspot.com/ Papel: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (Me temo que tienes que entrar en leerlo en su totalidad, ya que es un estudiante de CS esto debería ser posible).

Edición También puede echar un vistazo a Infer.Net, que incluyen un ejemplo de la construcción de un sistema de recomendación para los datos de la película.

2

Recientemente, Filmaster.com ha publicado un motor de recomendación de ejemplo que es de código abierto (con licencia AGPLv3). Está escrito en C++ y utiliza las mejores prácticas de los libros blancos producidos como parte del reto de Netflix.Un artículo sobre el tema se puede encontrar en: http://polishlinux.org/gnu/open-source-film-recommendation-engine/ y el código está aquí: http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp

27

presentación de recomendaciones se pueden dividir en dos secciones principales:

  1. Extracción de características
  2. Recomendación

La extracción de características es muy específica para el objeto que se recomienda. Para la música, por ejemplo, algunas características del objeto pueden ser la respuesta de frecuencia de la canción, la potencia, el género, etc. Las características para los usuarios pueden ser la edad, la ubicación, etc. Luego, crea un vector para cada usuario y canción con los diversos elementos del vector correspondiente a diferentes características de interés.

Realizar la recomendación real solo requiere de vectores de funciones bien pensados. Tenga en cuenta que si no elige las funciones correctas, su motor de recomendaciones fallará. Esto sería como pedirle que me diga mi sexo según mi edad. Por supuesto, mi edad puede proporcionar un poco de información, pero creo que podrías imaginar mejores preguntas para hacer. De todos modos, una vez que tenga sus vectores de características para cada usuario y canción, tendrá que entrenar el motor de recomendación. Creo que la mejor manera de hacerlo sería conseguir que un grupo de usuarios realice su prueba demográfica y luego contarle canciones específicas que les gusten. En este punto, tiene toda la información que necesita. Su trabajo es dibujar un límite de decisión con la información que tiene. Considera un ejemplo simple. Desea predecir si a un usuario le gusta el "Regreso en negro" de AC/DC según la edad y el sexo. Imagine un gráfico que muestra 100 puntos de datos. El eje x es la edad, el eje y es el sexo (1 es masculino, 2 es femenino). Una marca negra indica que al usuario le gusta la canción, mientras que una marca roja significa que no le gusta la canción. Supongo que este gráfico podría tener muchas marcas negras correspondientes a los usuarios que son hombres y tienen entre 12 y 37 años, mientras que el resto de las marcas serán rojas. Entonces, si tuviéramos que seleccionar manualmente un límite de decisión, sería un rectángulo alrededor de esta área que contiene la mayoría de las marcas negras. Esto se llama límite de decisión porque, si una persona completamente nueva se acerca a ti y te dice su edad y sexo, solo tienes que trazarlos en el gráfico y preguntar si caen dentro de esa caja o no.

Entonces, la parte difícil aquí es encontrar el límite de decisión. La buena noticia es que no necesita saber cómo hacer eso. Solo necesita saber cómo usar algunas de las herramientas comunes. Puedes buscar el uso de redes neuronales, máquinas de vectores de soporte, clasificadores lineales, etc. Nuevamente, no dejes que los grandes nombres te engañen. La mayoría de la gente no puede decirte lo que estas cosas realmente están haciendo. Simplemente saben cómo enchufar cosas y obtener resultados.

Sé que es un poco tarde, pero espero que esto ayude a cualquiera que tropiece con este hilo.

Cuestiones relacionadas