database - ¿Cómo crear mi propio motor de recomendación?
recommendation-engine collective-intelligence (5)
Estoy interesado en los motores de recomendación en estos días y quiero mejorar en esta área. Actualmente estoy leyendo " Programando la inteligencia colectiva " 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.
- ¿Dónde (debería implementarse en el lado de la base de datos o en el lado del back-end) empiezo a crear un motor de recomendación?
- ¿Qué nivel de conocimiento de la base de datos se necesitará?
- ¿Hay alguno de código abierto que pueda usarse como ayuda o como recurso?
- ¿Cuáles deberían ser los primeros pasos que tengo que hacer?
Esta es realmente una gran pregunta, por lo que incluso si pudiera darle una respuesta detallada, dudo que tuviera tiempo ... pero tengo una sugerencia, eche un vistazo al blog de Greg Linden y sus documentos. en 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/ Paper: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (Me temo que debe iniciar sesión para leerlo en su totalidad, ya que eres un estudiante de CS esto debería ser posible).
Editar También puedes echar un vistazo a Infer.Net , que incluye un ejemplo de Infer.Net crear un sistema de recomendación para datos de películas.
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 fueron creadas?
- ¿Quién visitó el video? (también rastreando visitantes anónimos)
- ¿Quién prefirió un video?
- ¿Quién calificó 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 son recopilados por un indexador de texto completo que pone peso en cada una de las fuentes de datos.
A continuación, creé funciones que devuelven listas de tuplas (id, peso) 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
- Videos subidos por el mismo usuario
- Otros videos que los usuarios de estos comentarios también comentaron
- Otros videos los usuarios de estos favoritos también son favoritos
- Otros videos que calificaron los evaluadores de estas clasificaciones (ponderados)
- Otros videos en los mismos canales
- Otros videos con las mismas etiquetas (ponderados por "expresividad" de las etiquetas)
- Otros videos reproducidos por personas que jugaron este video (XY últimas jugadas)
- Vídeos similares por comentarios texto completo
- Vídeos similares por título texto completo
- Vídeos similares por descripción texto completo
- Vídeos similares por etiquetas texto completo
Todos estos se combinarán en una sola lista al resumir los pesos por identificadores de video, y luego ordenados 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 poder reducir esto a un motor de recomendación genérico o una calculadora de similitud pronto y lanzarlo como un complemento de rails / activerecord. Actualmente sigue siendo una parte bien integrada de mi proyecto.
Para dar una pequeña pista, en código ruby 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
Me interesaría saber cómo otras personas resuelven dichos algoritmos.
Las recomendaciones de presentación se pueden dividir en dos secciones principales:
- Extracción de características
- 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 vectores de características 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.
Recientemente, Filmaster.com ha publicado un motor de recomendación de ejemplo que es de código abierto (licencia AGPLv3). Está escrito en C ++ y utiliza las mejores prácticas de los libros blancos producidos como parte del reto de Netflix. Puede encontrar un artículo al respecto 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
Tengo un blog de 2 partes sobre el motor de recomendación basado en filtrado colaborativo para la implementación en Hadoop.
http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/
http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/
Aquí está el repositorio github para el proyecto de código abierto https://github.com/pranab/sifarish
Siéntete libre de usar si te gusta.