Newsgroup: it.comp.www.php
Titolo: La logica dei simili e la loro relazione

Salve,
 
sono incuriosito dal funzionamento dei social e da come riescano ad 
esempio con dati simili a mettere in connessione gli utenti "simili"!
 
Partendo da MySQL/MariaDB ipotizziamo un social in cui ci siano gli 
utenti e le loro abitudini:
 
abitudini
-------------------
id_abitudini (autoincrement)
nome_abitudine
 
tabella user
-----------------
id_user (autoincrement)
name
FK_id_abitudini
 
match
--------------------------
id_match (autoincrement)
FK_id_abitudini
FK_id_user
FK_id_user
 
Come avete visto ogni abitudine ha un suo id quindi giocando su questo 
valore numerico già presente si potrebbe dire che l'utente tizio ha tra 
le sue abitudini i numeri 2-4-7-3-1-9 e l'utente caio ha 2-7-3
 
Forse prima del match tra utenti occorre un'altra tabella specifica che 
memorizzi tutte le abitudini per ogni utente per poi metterle in 
relazione nella tabella match?
 
Saluti.
^Bart

 utenti e le loro abitudini:
 
Solitamente questo tipo di associazioni vengono fatte tramire graph DBs 
e (a volte) algoritmi di machine learning.
 
Puoi fare qualcosa di approssimato con MySQL. Per esempio con una 
tabella utente<->interesse, per poi trovare tutti gli utenti con lo 
stesso interesse o, a partire da un utente, prendi la sua lista di 
interessi e trovi quali altri utenti hanno gli stessi interessi, 
ordinandoli per quanti interessi ci sono in comune, ecc. ecc. ecc.
 
Elasticsearch potrebbe rendere la cosa più semplice in alcuni casi, ma 
anche lui è una "pezza".
 
Dovrai comunque trovare un modo per:
 
- distinguere gli interessi simili ma in campi diversi
 
- trovare i sinonimi per gli interessi
 
- normalizzare gli interessi (per esempio tra lingue diverse)
 
- ricavare gli interessi da quello che la gente fa (like, condivisioni, 
ecc.). Questo di solito viene fatto con machine learning.
 
Bye.

 Bye.
 
Saluti e grazie per tutte le informazioni! :)
^Bart

Il 29/01/19 11:27, ^Bart ha scritto:

  tabella abitutini_utente
  -----------------
  id_user
  id_abitudini
 
 
  Utenti 1:N
  abitudini 1:N
  abitutini_utente N.N
 
 
per estrarre le abitutidi degli utenti:
  select 
a.name
,
       , b.nome_abitudine
    from user a
       , abitudini b
       , abitutini_utente c
   where a.id_user = c.id_user
     and b.id_abitudini = c.id_abitudini
 
 
estrarre tutti gli utenti con un abitudine in comune
  select 
a.name
,
    from user a
       , abitudini b
       , abitutini_utente c
   where a.id_user = c.id_user
     and b.id_abitudini = c.id_abitudini
     and b.id_abitudini in (:LISTA_ABITUDINI_SEPARATI_DA_VIRGOLA)
 
Ciao

Il 31/01/19 07:35, bramante ha scritto:



 Ciao
 
Saluti e grazie per la risposta! :)
^Bart

 ^Bart
 
con l'ultima riga si indica un sottoinsieme delle abitudini che ti 
interessa estrarre.
 
se la tua idea è quella di capire il grado di compatibilità di 2 persone 
in base alla percentuale degli interessi in comune, la query diventa 
abbastanza corposa
dovresti estrarre tutte le abitudine della persona "a", tutte le 
abitudini della persona "b", creare una lista unica delle due 
abitudini) e fare una proporzione delle abitudini in comune.
 
faccio un esempio
 
passioni persona a
correre
passeggiare
guardare film
leggere
modellismo
 
passioni persona b
viaggiare
leggere
dormire
correre
 
lista passioni totali (lista unica 100% 7 elementi)
correre
viaggiare
leggere
dormire
passeggiare
guardare film
modellismo
 
passioni in comune (2 elementi)
correre
leggere
 
proporzione
100:7=X:2
 
percentuale passioni compatibili
100*2/7=28,57%
 
 
questo potrebbe essere uno dei tanti modi (dipende dal tipo di dato che 
si ha a disposizione o da quello che si cerca di analizzare)
 
l'esempio di cui sopra è fattibile con un unica query.
 
Ciao

Il 01/02/19 21:33, bramante ha scritto:

P.S.
l'esempio fatto è in valori assoluti
 
ma ad esempio la persona "a" ha una compatibilità del 40% rispetto "b"
mentre la persona "b" del 50% rispetto ad "a"
 
percentuale compatibilità persona a su b
100*2/5=40%
 
percentuale compatibilità persona b su a
100*2/4=50%
 
 
Ciao

 Ciao
 
Saluti!
^Bart

 Ciao
 
Saluti!
^Bart

 
 
parti dalle 3 tabelle e crei dei semi lavorati che dai impasto ad una 
query superiore
non so quanto conosci sql, ma in questo caso se vuoi risolvere tutto con 
un unica query, diventa una query con 3 o piu subquery.
altrimenti puoi lavorare con php o con qualsiasi altro linguaggio per 
arrivare allo stesso risultato.
 

 
 
Anche se in ritardo ti ringrazio per tutte le dritte! :)
 
Saluti.
^Bart