.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Basi di dati ~ informatica triennale (http://www.dsy.it/forum/forumdisplay.php?forumid=211)
-- calcolo affinità (http://www.dsy.it/forum/showthread.php?threadid=41299)


Posted by Chobeat on 08-12-2010 10:52:

calcolo affinità

Sto penando per realizzare appropriatamente la funzione di calcolo dell'affinità ma ho paura di fare una roba pesantissima e malfatta.

Ho realizzato una funzione che calcola correttamente l'affinità tra 2 utenti, ma mi sembra scontato che iterarla su tutto il database e sortare selezionando i primi 100, è una cazzata.

Quindi vorrei sapere voi in linea generale come avete impostato, oppure se avete trovato qualche testo che spieghi i fondamenti per realizzare in maniera ottimale questo tipo di funzioni.


Posted by fabrileroy on 12-12-2010 17:03:

anche io ho questo problema, nel senso che non capisco quale dovrebbe essere il livello di affinità utile per comparire nella lista.


Posted by CowBoy on 23-12-2010 13:15:

Se hai usato l'indicizzazione allora la selezione e/o l'iterazione vengono eseguite abbastanza velocemente. Se magari scrivete i requisite e cosa deve fare questa funzione magari vi vengono in aiuto anche utenti che non sono immersi nel vostro progetto...

__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..


Posted by fabrileroy on 26-12-2010 15:57:

ciao, io ho scritto una cosa del genere, ma mi sembra abbastanza complessa e non mi stampa proprio ciò che desidero:

<?php
function similare($login, $connection)
{
//QUI DOVREI INSERIRE UN CONTROLLO CHE SE GLI UTENTI SONO < 100 ALLORA LI STAMPO TUTTI
// SIMILARITà SUI GIOCHI POSSEDUTI

$query=" SELECT login FROM utente WHERE login<> '$login' "; //seleziono gli utenti diversi da quello che considero
$resource=pg_query ($connection, $query);
$key=0;
while($row=pg_fetch_row($resource, $i))
{
$count=0;
$que=" SELECT gioco FROM lista_posseduti WHERE utente='$row[0]' "; // seleziono i giochi posseduti dall'utente risultato della pg_fetch_row
$res=pg_query ($connection, $que);
while($ro=pg_fetch_row($res, $w))
{
if(empty($ro[0])) { break; }
else
{
$q=" SELECT count(*) FROM lista_posseduti WHERE gioco='$ro[0]' AND utente='$login' "; // conto se se il gioco puntato dal secondo pg_fetch_row è posseduto anche dall'utente che considero
$rs=pg_query ($connection, $q);
$r=pg_fetch_row($rs, $z);
if ($r[0]!=0) { $count++; }
}
$key=$count;
if (empty($simile[$key])) { $simile[$key]=$row[0]; } // in questa parte aggiorno un array che alla fine dovrà contentere i primi 100 utenti + simili
else { for($key_tmp=$key+1; key_tmp <=100; $key_tmp++)
{ if (empty($simile[$key_tmp])) { $simile[$key_tmp]=$row[0]; break; }}}
}
}
print_r ($simile);
}
?>


Posted by fabrileroy on 26-12-2010 15:59:

e comunque la richiesta sarebbe questa:
"applicazione segnala a ogni utente la lista dei primi 100
utenti a lui piu simili. La similarita fra utenti e misurata da un valore numerico proporzionale
al numero di giochi posseduti e desiderati in comune e al giudizio espresso su tali giochi." grazie


Posted by fabrileroy on 26-12-2010 16:21:

posto lo script di prima corretto, perchè c'erano delle cose errate:
<?php
function similare($login, $connection)
{
//QUI DOVREI INSERIRE UN CONTROLLO CHE SE GLI UTENTI SONO < 100 ALLORA LI STAMPO TUTTI
// SIMILARITà SUI GIOCHI POSSEDUTI

$query=" SELECT login FROM utente WHERE login<> '$login' "; //seleziono gli utenti diversi da quello che considero
$resource=pg_query ($connection, $query);
$key=0;
while($row=pg_fetch_row($resource, $i))
{
$count=0;
$que=" SELECT gioco FROM lista_posseduti WHERE utente='$row[0]' "; // seleziono i giochi posseduti dall'utente risultato della pg_fetch_row
$res=pg_query ($connection, $que);
while($ro=pg_fetch_row($res, $w))
{
if(empty($ro[0])) { break; }
else {
$q=" SELECT count(*) FROM lista_posseduti WHERE gioco='$ro[0]' AND utente='$login' "; // conto se il gioco puntato dal secondo pg_fetch_row è posseduto anche dall'utente che considero
$rs=pg_query ($connection, $q);
$r=pg_fetch_row($rs, $z);
if ($r[0]!=0) { $count++; }}
}
if($count!=0)
{
$key=$count;
if (empty($simile[$key])) { $simile[$key]=$row[0]; } // in questa parte aggiorno un array che alla fine dovrà contentere i primi 100 utenti + simili
else { for($key_tmp=$key+1; key_tmp <=100; $key_tmp++)
{ if (empty($simile[$key_tmp])) { $simile[$key_tmp]=$row[0]; break; }}}
}
}
for($scr=0; $scr<count($simile)+1; $scr++) {
echo "$simile[$scr]"; echo"<br>"; }
}
?>


Posted by CowBoy on 26-12-2010 16:24:

Allora - in teoria - la soluzione migliore sarebbe di creare una funzione in PL/pgSQL. La funzione dovrebbe semplicemente selezionare tutti gli utenti, fare un join con i giochi e restituire una lista contenente nome e numero(tramite count()) di giochi tutto con un sort sul numero. Per concludere in php non vi resta che leggere l'output della funzione con un ciclo for da 0 a 99...
Usare le funzioni su postgres vi fa risparmiare tempo sui calcoli dato che un DBMS cerca sempre la via migliore senza che ci pensiate voi all'ottimizzazione.

__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..


Posted by Chobeat on 26-12-2010 16:38:

Sì e sopratutto ti permette di avere un voto decente, perchè se ste cose le fai in PHP, ti fucilano alla discussione.


Posted by CowBoy on 26-12-2010 16:53:

Originally posted by Chobeat
Sì e sopratutto ti permette di avere un voto decente, perchè se ste cose le fai in PHP, ti fucilano alla discussione.


hahaha... sono d'accordissimo!! :D

__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..


Posted by fabrileroy on 28-12-2010 12:58:

grazie per il consiglio ... proverò a vedere se riesco a combinare qualcosa d + accettabile...al max vi scrivo ;)


Posted by fabrileroy on 28-12-2010 15:53:

Mi sembra però che CowBoy tu la faccia un pò troppo facile.... nella tua breve spiegazione non trovo la verifica di somiglianza tra l'utente scelto e gli altri utenti !!


Posted by CowBoy on 04-01-2011 16:08:

Il progetto di DB l'ho già superato. Stavo semplicemente condividendo la mia opinione riguardo il problema, in linea teorica... ovviamente nella realtà tutto dipende dai requisiti e dal modello creato.

__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..


All times are GMT. The time now is 18:28.
Show all 12 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.