7

Ho un database di circa 700k utenti insieme a oggetti che hanno guardato/ascoltato/letto/comprato/ecc. Mi piacerebbe creare un motore di raccomandazione che consiglia nuovi articoli basati su ciò che gli utenti con gusti simili hanno apprezzato, oltre a trovare effettivamente persone con cui l'utente potrebbe voler essere amico su un social network che sto costruendo (simile a last.fm).Algoritmo di raccomandazione (e implementazione) per la ricerca di oggetti e utenti simili

miei requisiti sono i seguenti:

  • maggioranza degli "utenti" nel mio database non sono in realtà gli utenti del mio sito web. Sono stati estratti da fonti di terze parti. Tuttavia, quando raccomando gli utenti, vorrei limitare la ricerca alle persone che sono membri del mio sito Web (sfruttando ancora il set di dati più grande).
  • Ho bisogno di prendere in considerazione più oggetti. Non "persone a cui piace questo elemento che ti piaceva ...", ma "persone a cui piacciono la maggior parte degli oggetti che ti sono piaciuti ...".
  • Ho bisogno di calcolare le somiglianze tra gli utenti e mostrarli durante la visualizzazione dei loro profili (gusto-o-metro).
  • Alcuni articoli sono classificati, altri no. Le valutazioni sono da 1 a 10, non da valori booleani. Nella maggior parte dei casi è possibile dedurre un valore di valutazione da altre statistiche se non è presente (ad esempio se l'utente ha preferito un articolo, ma non lo ha valutato, potrei semplicemente assumere una valutazione di 9).
  • Deve interagire con il codice Python in un modo o nell'altro. Preferibilmente, dovrebbe utilizzare un database separato (possibilmente NoSQL) ed esporre un'API da utilizzare nel mio back-end web. Il progetto che sto facendo utilizza Pyramid e SQLAlchemy.
  • Vorrei prendere in considerazione i generi di articoli.
  • Vorrei visualizzare articoli simili sulle pagine degli articoli in base al genere (eventualmente tag) e agli utenti che hanno apprezzato l'elemento (ad esempio "persone che hanno acquistato questo articolo" di Amazon e pagine degli artisti di Last.fm). Gli oggetti di generi diversi dovrebbero ancora essere mostrati, ma hanno un valore di similarità più basso.
  • Preferirei un'implementazione ben documentata di un algoritmo con alcuni esempi.

Si prega di non dare una risposta come "usa pysuggest o mahout", dal momento che quelli implementano una pletora di algoritmi e sto cercando uno che è più adatto per i miei dati/utilizzo. Sono stato interessato a Neo4j e come tutto potrebbe essere espresso come un grafico delle connessioni tra utenti e oggetti.

risposta

4

In realtà questo è uno dei Sweetspots di un database grafico come Neo4j.

Così, se il modello di dati si presenta così:

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

Si può facilmente ottenere raccomandazioni per un utente con una dichiarazione cifra come questa:

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 

Questo può anche essere fatto utilizzando il Neo4j Core-API o Traversal-API.

Neo4j ha un Python API che è anche in grado di eseguire le query cypher.

Disclaimer: io lavoro per Neo4j

Ci sono anche alcuni interessanti articoli di Marko Rodriguez circa filtraggio collaborativo.

+0

per i generi Raccomando i nodi delle categorie di generi a cui sono connessi gli elementi e puoi tenerne conto nella clausola di corrispondenza –

+1

Questo è davvero molto utile, il collegamento pubblicato memorizza le informazioni in un grafico-db invece di essere un grafico approccio basato sulla raccomandazione. – Steve

+0

Grazie! Ho fatto un po 'di lettura, aveva uno sguardo al libro di cucina cifra nella documentazione Neo4j e lo fa esattamente quello che ho bisogno di fare. Ho deciso di andare con l'approccio del database grafico per il mio motore di raccomandazione. – vomitcuddle

4

Per determinare la somiglianza tra gli utenti è possibile eseguire la similarità cosine o pearson (trovata in Mahout e in qualsiasi punto della rete!) Attraverso il vettore dell'utente. Così la vostra rappresentazione dei dati dovrebbe essere simile a

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

Nel punto in cui si desidera effettuare più elementi in considerazione che è possibile utilizzare quanto sopra per determinare in che modo simili profili someones sono. Maggiore è il punteggio di correlazione, la probabilità che abbiano elementi molto simili è. È possibile impostare una soglia in modo che qualcuno con la somiglianza .75 abbia un insieme simile di elementi nel proprio profilo.

Dove mancano i valori è possibile ovviamente creare i propri valori. Li terrei solo binari e proverei a fondere i vari algoritmi. Questo è chiamato un ensemble.

Nel complesso, si sta cercando qualcosa chiamato filtro collaborativo basato sull'elemento come aspetto della raccomandazione del set up e utilizzato anche per identificare elementi simili. È un algoritmo di raccomandazione standard che fa praticamente tutto quello che hai chiesto.

Quando si cerca di trovare gli utenti simili che è possibile eseguire un certo tipo di somiglianza metrica tra i vettori degli utenti.

Per quanto riguarda Python, il libro intitolato programmazione in intelligenza collettiva dà tutti i loro campioni in pitone in modo da andare a prendere una copia e leggere il capitolo 1.

Rappresentare tutto questo come un grafico sarà un po 'come il vostro problamatic rappresentazione immortale è un Bipartile Graph. Esistono molti approcci alla raccomandazione che utilizzano un approccio basato sul grafico, ma generalmente non sono l'approccio migliore.

1

posso suggerire di dare un'occhiata al mio progetto open source Reco4j. Si tratta di un motore di raccomandazione basato su grafici che può essere utilizzato su un database grafico come il tuo in un modo molto stravagante. Supportiamo come database grafico neo4j. È in una versione precedente ma molto presto sarà disponibile una versione più completa. Nel frattempo stiamo cercando alcuni casi l'uso del nostro progetto, quindi vi prego di contattarmi in modo che possiamo vedere come possiamo collaborare.

Problemi correlati