Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #22531 > unrolled thread

La logica dei simili e la loro relazione

Started by^Bart <gabriele1NOSPAM@hotmail.com>
First post2019-01-29 11:27 +0100
Last post2019-02-08 23:24 +0100
Articles 12 — 3 participants

Back to article view | Back to it.comp.www.php


Contents

  La logica dei simili e la loro relazione ^Bart <gabriele1NOSPAM@hotmail.com> - 2019-01-29 11:27 +0100
    Re: La logica dei simili e la loro relazione Alessandro Pellizzari <shuriken@amiran.it> - 2019-01-29 10:45 +0000
      Re: La logica dei simili e la loro relazione ^Bart <gabriele1NOSPAM@hotmail.com> - 2019-01-29 23:54 +0100
    Re: La logica dei simili e la loro relazione bramante <bramante@yopmail.com> - 2019-01-31 07:35 +0100
      Re: La logica dei simili e la loro relazione bramante <bramante@yopmail.com> - 2019-01-31 07:35 +0100
      Re: La logica dei simili e la loro relazione ^Bart <gabriele1NOSPAM@hotmail.com> - 2019-01-31 09:38 +0100
        Re: La logica dei simili e la loro relazione bramante <bramante@yopmail.com> - 2019-02-01 21:33 +0100
          Re: La logica dei simili e la loro relazione bramante <bramante@yopmail.com> - 2019-02-01 22:05 +0100
            Re: La logica dei simili e la loro relazione ^Bart <gabriele1NOSPAM@hotmail.com> - 2019-02-02 11:57 +0100
          Re: La logica dei simili e la loro relazione ^Bart <gabriele1NOSPAM@hotmail.com> - 2019-02-02 12:08 +0100
            Re: La logica dei simili e la loro relazione bramante <bramante@yopmail.com> - 2019-02-02 19:00 +0100
              Re: La logica dei simili e la loro relazione ^Bart <gabriele1NOSPAM@hotmail.com> - 2019-02-08 23:24 +0100

#22531 — La logica dei simili e la loro relazione

From^Bart <gabriele1NOSPAM@hotmail.com>
Date2019-01-29 11:27 +0100
SubjectLa logica dei simili e la loro relazione
Message-ID<q2p9q0$q0j$1@gioia.aioe.org>
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

[toc] | [next] | [standalone]


#22533

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2019-01-29 10:45 +0000
Message-ID<gbap6mFu4trU1@mid.individual.net>
In reply to#22531
On 29/01/2019 10:27, ^Bart wrote:

> 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:

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.

[toc] | [prev] | [next] | [standalone]


#22538

From^Bart <gabriele1NOSPAM@hotmail.com>
Date2019-01-29 23:54 +0100
Message-ID<q2qlid$18v8$1@gioia.aioe.org>
In reply to#22533
> Solitamente questo tipo di associazioni vengono fatte tramire graph DBs 
> e (a volte) algoritmi di machine learning.

Ho cercato in rete e diciamo che per ora non sono capace di tanto! :)

> 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.

Io pensavo di popolare con una query da eseguire in maniera schedulata 
tipo ogni ora (non mi interessa il tempo reale!) in modo che vada a 
pescare gli interessi di ogni utente e li memorizzi nella tabella match 
in cui avrei:

match
------------------------
id
utente
lista_numerica_interessi

A questo punto con una query si potrebbero confrontare gli interessi del 
singolo utente con tutti quelli degli altri!

> Elasticsearch potrebbe rendere la cosa più semplice in alcuni casi, ma 
> anche lui è una "pezza".

Anche qui c'è tanto da "studiare": 
https://qbox.io/blog/what-is-elasticsearch ed ora devo affrontare 
Python, Arduino, SQL, Inventor e qualcosa sui PLC giusto per non 
annoiarsi! :)

> Dovrai comunque trovare un modo per:
> 
> - distinguere gli interessi simili ma in campi diversi

Gli interessi sono tutti già inseriti, l'utente finale può scegliere 
solo tra quelli proposti!

> - trovare i sinonimi per gli interessi

Come sopra, se c'è necessità di aggiungere altri interessi si chiede 
all'admin.

> - normalizzare gli interessi (per esempio tra lingue diverse)

Per il discorso di sopra parto da una tabella inglese e poi linko quelle 
delle altre lingue.

> - ricavare gli interessi da quello che la gente fa (like, condivisioni, 
> ecc.). Questo di solito viene fatto con machine learning.

E' molto più semplice tipo, compro i bucatini barilla o i biscotti 
galbusera questi hanno il loro id numerico e tutto il resto quindi vien 
da se! :)

> Bye.

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

[toc] | [prev] | [next] | [standalone]


#22539

Frombramante <bramante@yopmail.com>
Date2019-01-31 07:35 +0100
Message-ID<q2u4up$ucm$1@gioia.aioe.org>
In reply to#22531
Il 29/01/19 11:27, ^Bart ha scritto:
> 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


  abitudini
  -------------------
  id_abitudini (autoincrement)
  nome_abitudine

  tabella user
-----------------
  id_user (autoincrement)
  name
  FK_id_abitudini


  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

[toc] | [prev] | [next] | [standalone]


#22540

Frombramante <bramante@yopmail.com>
Date2019-01-31 07:35 +0100
Message-ID<q2u4vk$ucm$2@gioia.aioe.org>
In reply to#22539
Il 31/01/19 07:35, bramante ha scritto:
> Il 29/01/19 11:27, ^Bart ha scritto:
>> 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
> 
> 
>   abitudini
>   -------------------
>   id_abitudini (autoincrement)
>   nome_abitudine
> 
>   tabella user
> -----------------
>   id_user (autoincrement)
>   name
> 
> 
>   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

[toc] | [prev] | [next] | [standalone]


#22541

From^Bart <gabriele1NOSPAM@hotmail.com>
Date2019-01-31 09:38 +0100
Message-ID<q2uc6i$1u6s$1@gioia.aioe.org>
In reply to#22539
>   Utenti 1:N
>   abitudini 1:N
>   abitutini_utente N.N

Ok.

> 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

Ok.

> 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)

Le ultime due righe non le ho capite o meglio la penultima fa il match 
nel caso le abitudini siano identiche, nell'ultima verifica "solo" che 
ci siano delle abitudini nella lista delle abitudini, diciamo che poi 
bisognerà lavorare tipo con delle variabili per definire l'incidenza 
delle abitudini comuni tipo 70% di compatibilità, 50%, oppure totalmente 
l'opposto quindi 0%.

> Ciao

Saluti e grazie per la risposta! :)
^Bart

[toc] | [prev] | [next] | [standalone]


#22542

Frombramante <bramante@yopmail.com>
Date2019-02-01 21:33 +0100
Message-ID<q32afe$441$1@gioia.aioe.org>
In reply to#22541
Il 31/01/19 09:38, ^Bart ha scritto:

> 
>> 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)
> 
> Le ultime due righe non le ho capite o meglio la penultima fa il match 
> nel caso le abitudini siano identiche, nell'ultima verifica "solo" che 
> ci siano delle abitudini nella lista delle abitudini, diciamo che poi 
> bisognerà lavorare tipo con delle variabili per definire l'incidenza 
> delle abitudini comuni tipo 70% di compatibilità, 50%, oppure totalmente 
> l'opposto quindi 0%.
> 
>> Ciao
> 
> Saluti e grazie per la risposta! :)
> ^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

[toc] | [prev] | [next] | [standalone]


#22543

Frombramante <bramante@yopmail.com>
Date2019-02-01 22:05 +0100
Message-ID<q32cb7$ckk$1@gioia.aioe.org>
In reply to#22542
Il 01/02/19 21:33, bramante ha scritto:
> Il 31/01/19 09:38, ^Bart ha scritto:
> 
>>
>>> 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)
>>
>> Le ultime due righe non le ho capite o meglio la penultima fa il match 
>> nel caso le abitudini siano identiche, nell'ultima verifica "solo" che 
>> ci siano delle abitudini nella lista delle abitudini, diciamo che poi 
>> bisognerà lavorare tipo con delle variabili per definire l'incidenza 
>> delle abitudini comuni tipo 70% di compatibilità, 50%, oppure 
>> totalmente l'opposto quindi 0%.
>>
>>> Ciao
>>
>> Saluti e grazie per la risposta! :)
>> ^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

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

[toc] | [prev] | [next] | [standalone]


#22544

From^Bart <gabriele1NOSPAM@hotmail.com>
Date2019-02-02 11:57 +0100
Message-ID<q33t21$sqm$2@gioia.aioe.org>
In reply to#22543
> 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%

Mi ritaglio il weekend per digerire il tutto, comunque sei stato chiaro 
negli esempi!

> Ciao

Saluti!
^Bart

[toc] | [prev] | [next] | [standalone]


#22545

From^Bart <gabriele1NOSPAM@hotmail.com>
Date2019-02-02 12:08 +0100
Message-ID<q33tmt$10n0$1@gioia.aioe.org>
In reply to#22542
> faccio un esempio
> 
> passioni persona a
> correre
> passeggiare
> guardare film
> leggere
> modellismo
> 
> passioni persona b
> viaggiare
> leggere
> dormire
> correre

Praticamente avrei un'unica tabella in cui inserire i vari utenti con la 
lista delle loro passioni:

passioni_utenti
-----------------------
ID
FK_user
FK_passioni

> lista passioni totali (lista unica 100% 7 elementi)
> correre
> viaggiare
> leggere
> dormire
> passeggiare
> guardare film
> modellismo

C'è già una tabella con la lista degli utenti ed un'altra con la lista 
delle passioni quindi quella che tu mi scrivi già c'è! :)

> passioni in comune (2 elementi)
> correre
> leggere
> 
> proporzione
> 100:7=X:2
> 
> percentuale passioni compatibili
> 100*2/7=28,57%

Questa sarebbe "solo" una query che confronterebbe l'utente con gli 
altri utenti giusto?

> l'esempio di cui sopra è fattibile con un unica query.

Ah ok, però ovviamente occorrono almeno tre tabelle ovvero una user, una 
passioni ed una che colleghi user e passioni sulla quale agire con la 
query per mostrare il risultato!

> Ciao

Saluti!
^Bart

[toc] | [prev] | [next] | [standalone]


#22546

Frombramante <bramante@yopmail.com>
Date2019-02-02 19:00 +0100
Message-ID<q34lsp$ga2$1@gioia.aioe.org>
In reply to#22545
Il 02/02/19 12:08, ^Bart ha scritto:
>> faccio un esempio
>>
>> passioni persona a
>> correre
>> passeggiare
>> guardare film
>> leggere
>> modellismo
>>
>> passioni persona b
>> viaggiare
>> leggere
>> dormire
>> correre
> 
> Praticamente avrei un'unica tabella in cui inserire i vari utenti con la 
> lista delle loro passioni:
> 
> passioni_utenti
> -----------------------
> ID
> FK_user
> FK_passioni

si, ID non serve a nulla

FK_user | FK_passioni
---------------------
1       |  1
1       |  3
1       |  7
1       |  8
2       |  1
2       |  2
2       |  4
2       |  5
2       |  7
3       |  4
3       |  6
3       |  9
ecc..

> 
>> lista passioni totali (lista unica 100% 7 elementi)
>> correre
>> viaggiare
>> leggere
>> dormire
>> passeggiare
>> guardare film
>> modellismo
> 
> C'è già una tabella con la lista degli utenti ed un'altra con la lista 
> delle passioni quindi quella che tu mi scrivi già c'è! :)
> 

la devi estrarre, la lista che hai è una tabella delle passioni (statica 
elenco passioni), in questo caso devi fare una lista delle sole passioni 
di a e b
select distinct a.fk_passioni, a.descrizione_passione
   from passioni a
      , abitutini_utente b
  where b.id_user in (utente_A, utente_b)
    and a.fk_passioni = b.fk_passioni


>> passioni in comune (2 elementi)
>> correre
>> leggere
>>
>> proporzione
>> 100:7=X:2
>>
>> percentuale passioni compatibili
>> 100*2/7=28,57%
> 
> Questa sarebbe "solo" una query che confronterebbe l'utente con gli 
> altri utenti giusto?
> 

si

>> l'esempio di cui sopra è fattibile con un unica query.
> 
> Ah ok, però ovviamente occorrono almeno tre tabelle ovvero una user, una 
> passioni ed una che colleghi user e passioni sulla quale agire con la 
> query per mostrare il risultato!
> 

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.

[toc] | [prev] | [next] | [standalone]


#22548

From^Bart <gabriele1NOSPAM@hotmail.com>
Date2019-02-08 23:24 +0100
Message-ID<q3kvim$1i21$1@gioia.aioe.org>
In reply to#22546
> 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

[toc] | [prev] | [standalone]


Back to top | Article view | it.comp.www.php


csiph-web