Sto provando a creare un'applicazione nodoJS. Permette agli utenti di valutare un gruppo di canzoni e li memorizza nei loro profili utente. Uso queste informazioni per confrontarle con altri utenti e cerco di trovare utenti con interessi simili nelle canzoni e suggerisco loro nuovi brani basati su questo.
Ogni profilo utente assomiglia a questo
userID: [the userid of the user]
songs: [the list of songs that the user has rated]
ratings: [the corresponding ratings each user gave to the song]
Ogni canzone è rappresentato da un numero intero a 9 cifre e ogni valutazione è un numero intero da 1 a 6 . Fondamentalmente, devo confrontare un utente con il resto degli utenti per determinare quali di essi corrispondono meglio a questo utente. Per corrispondenza, intendo dire le stesse canzoni con valutazioni simili. Per fare questo, ho creato un semplice algoritmo.
Step 1) Create a list, in which each entry maps our target user to each of the other
users.
Step 2) Now consider each entry, determine which songs both of the users have rated, and
store those songs (along with the corresponding ratings each user gave them) in
this entry itself
Step 3) Now iterate through each entry and perform the following operations
a) let percentage = 0
b) let num = [the number of songs that both users rated]
c) iterate through each song (that both the users rated) and perform the
following operations
i) determine the score our target user gave this song and store it in
variable a
ii) determing the score the other user gave this song and store it in
variable b
iii) map a and b to new values based on this
1 --> -3
2 --> -2
3 --> -1
4 --> 1
5 --> 2
6 --> 3
iv) now calculate sum as
sum = |a| + |b|
where || is the absolute values
v) now calculate degree as
degree = sum/2
vi) now if a * b is less than 0 then
calculate (percentage - degree) and store that value
again in percentage
if not then
calculate (percentage - degree) and store that value
again in percentage
d) now calculate (50 + (percentage / (6*num))*100) and store that value
in this entry as match
Step 4) Now that I have my list of entries (along with the match between each pair
of target user and other user) I sort the list in descending order of match
and from that, I can determine which users have the closest match in taste by
selecting from the first entries
Ora per ogni coppia di utenti, sto completamente trascurando le canzoni che un utente ha valutato e l'altra no, e va bene per me.
Tuttavia ci sono diversi problemi con questo metodo, il più importante è che questo algoritmo richiede molto tempo a un vasto gruppo di utenti (ad esempio circa 1.000.000). E anche che devo caricare tutti gli utenti, ogni volta che ho bisogno di trovare un insieme di utenti corrispondenti per solo 1 utente. E ho bisogno di farlo ripetutamente per quell'utente, per aggiornare la sua lista.
C'è un modo per renderlo più efficiente? Posso assegnare un valore a ciascun utente che tenga conto di tutti i brani che hanno valutato e utilizzare quel numero per confrontare gli utenti? È possibile? Immagino che cosa sto chiedendo è, come posso confrontare e confrontare questi dati, matematicamente, per trovare utenti simili, in modo efficiente. Inoltre, qualcuno può suggerire un tag appropriato per questo tipo di domanda?