7

Tengo una base de datos de aproximadamente 700k usuarios junto con elementos que han visto/escuchado/leído/comprado/etc. Me gustaría crear un motor de recomendación que recomiende nuevos elementos según lo que han disfrutado los usuarios con gusto similar, así como también encontrar personas con las que el usuario quiera ser amigo en una red social que estoy construyendo (similar a Last FM).Algoritmo de recomendación (e implementación) para encontrar artículos y usuarios similares

Mis requisitos son los siguientes:

  • La mayoría de los "usuarios" en mi base de datos no son en realidad los usuarios de mi sitio web. Han sido datos extraídos de fuentes de terceros. Sin embargo, al recomendar a los usuarios, me gustaría limitar la búsqueda a las personas que son miembros de mi sitio web (mientras se sigue aprovechando el conjunto de datos más grande).
  • Necesito tomar varios elementos en consideración. No "personas a las que les gusta este artículo que disfrutaste ...", sino "personas a quienes les gustan la mayoría de los artículos que disfrutaste ...".
  • Necesito calcular las similitudes entre los usuarios y mostrarlos al ver sus perfiles (taste-o-meter).
  • Algunos ítems son calificados, otros no lo son. Las clasificaciones son de 1-10, no valores booleanos. En la mayoría de los casos, sería posible deducir un valor de clasificación de otras estadísticas si no está presente (por ejemplo, si el usuario ha preferido un artículo, pero no lo ha calificado, podría suponer una calificación de 9).
  • Tiene que interactuar con el código de Python de una forma u otra. Preferiblemente, debe usar una base de datos separada (posiblemente NoSQL) y exponer una API para usar en mi back-end web. El proyecto que estoy haciendo usa Pyramid y SQLAlchemy.
  • Me gustaría tener en cuenta los géneros de elementos.
  • Me gustaría mostrar artículos similares en páginas de artículos basadas en su género (posiblemente etiquetas) y lo que les gustó a los usuarios (como las "personas que compraron este artículo" de Amazon y las páginas de Last.fm). Aún se deben mostrar elementos de diferentes géneros, pero tienen un valor de similitud menor.
  • Preferiría una implementación bien documentada de un algoritmo con algunos ejemplos.

Por favor, no responda como "use pysuggest o mahout", ya que implementa una gran cantidad de algoritmos y estoy buscando uno que sea más adecuado para mis datos/uso. Me interesó Neo4j y cómo se podría expresar como un gráfico de conexiones entre usuarios y elementos.

Respuesta

4

En realidad, es uno de los sweetspots de una base de datos de gráficos como Neo4j.

Así que si su modelo de datos tiene el siguiente aspecto:

user -[:LIKE|:BOUGHT]-> item 

Usted puede obtener recomendaciones de un usuario con una declaración cero a la izquierda de esta manera:

start user = node:users(id="doctorkohaku") 
match user -[r:LIKE]->item<-[r2:LIKE]-other-[r3:LIKE]->rec_item 
where r.stars > 2 and r2.stars > 2 and r3.stars > 2 
return rec_item.name, count(*) as cnt, avg(r3.stars) as rating 
order by rating desc, cnt desc limit 10 

Esto también se puede hacer utilizando el Neo4j Core-API o la API Traversal.

Neo4j tiene un Python API que también es capaz de ejecutar consultas de cifrado.

responsabilidad: yo trabajo para Neo4j

También hay algunos artículos interesantes por Marko Rodriguez sobre el filtrado colaborativo.

+0

para géneros Recomiendo los nodos de categoría de géneros a los que están conectados los elementos y puedes tenerlos en cuenta en la cláusula –

+1

. Es bastante útil, el enlace publicado almacena la información en un gráfico-db en lugar de ser un gráfico enfoque basado en la recomendación. – Steve

+0

¡Gracias! He leído un poco más, he echado un vistazo al libro de cocina cypher en la documentación de Neo4j y hace exactamente lo que necesito que haga. Decidí ir con el enfoque de la base de datos de gráficos para mi motor de recomendación. – vomitcuddle

4

Para determinar la similitud entre los usuarios, puede ejecutar la similitud coseno o pearson (¡que se encuentra en Mahout y en cualquier lugar de la red realmente!) En todo el vector de usuario. Por lo que su representación de datos debería ser algo como

u1 [1,2,3,4,5,6] 
u2 [35,24,3,4,5,6] 
u1 [35,3,9,2,1,11] 

En el punto en el que desea tomar en consideración varios elementos que se pueden utilizar lo anterior para determinar la similitud de los perfiles son repique. Cuanto mayor sea la puntuación de correlación, la probabilidad de que tengan elementos muy similares es. Puede establecer un umbral para que alguien con similitud .75 tenga un conjunto similar de elementos en su perfil.

En los valores que le faltan puede, por supuesto, hacer sus propios valores. Solo los mantendría binarios e intentaré combinar los diferentes algoritmos. Eso se llama un conjunto.

En general, está buscando algo llamado filtrado colaborativo basado en elementos como el aspecto de recomendación de su configuración y también se utiliza para identificar elementos similares. Es un algoritmo de recomendación estándar que hace prácticamente todo lo que ha pedido.

Al tratar de encontrar usuarios similares, puede realizar algún tipo de métrica de similitud en sus vectores de usuario.

En cuanto a Python, el libro llamado la programación en inteligencia colectiva da todas sus muestras en pitón a fin de ir a recoger una copia y leer el capítulo 1.

En representación de todo esto como un gráfico será algo problamatic como su representación inmortal es un Bipartile Graph. Hay muchos enfoques de recomendación que usan un enfoque basado en gráficos, pero generalmente no es el mejor enfoque.

1

Puedo sugerir que eche un vistazo a mi proyecto de código abierto Reco4j. Es un motor de recomendación basado en gráficos que se puede utilizar en una base de datos de gráficos como la suya de una manera muy directa. Apoyamos como base de datos de gráficos neo4j. Está en una versión anterior, pero muy pronto estará disponible una versión más completa. Mientras tanto, estamos buscando algún caso de uso de nuestro proyecto, así que contácteme para que podamos ver cómo podemos colaborar.

Cuestiones relacionadas