Foros del Web » Programando para Internet » PHP »

Agrupando datos en PHP

Estas en el tema de Agrupando datos en PHP en el foro de PHP en Foros del Web. Hola de nuevo, estoy tratando de crear un script que agrupe datos, me explico: Tengo una lista de imágenes que son similares, algo así: 01.jpg;02.jpg;98 ...
  #1 (permalink)  
Antiguo 24/11/2010, 16:26
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Agrupando datos en PHP

Hola de nuevo, estoy tratando de crear un script que agrupe datos, me explico:
Tengo una lista de imágenes que son similares, algo así:

01.jpg;02.jpg;98
01.jpg;03.jpg;95
01.jpg;04.jpg;94
01.jpg;05.jpg;93
02.jpg;03.jpg;99
02.jpg;04.jpg;98
02.jpg;05.jpg;97
03.jpg;04.jpg;100
03.jpg;05.jpg;100
04.jpg;05.jpg;100
08.jpg;09.jpg;99
08.jpg;10.jpg;99
08.jpg;11.jpg;98
08.jpg;12.jpg;94
08.jpg;13.jpg;97
09.jpg;10.jpg;100
09.jpg;11.jpg;99
09.jpg;12.jpg;95
09.jpg;13.jpg;98
10.jpg;11.jpg;99
10.jpg;12.jpg;95
10.jpg;13.jpg;98

Lo que quiero hacer es agrupar las imagenes que son similares de modo que quede así:
Group1:
1.jpg; 2.jpg; 3.jpg; 4.jpg; 5.jpg: similaridad: 90+
Group2:
8.jpg; 9.jpg; 10.jpg; 11.jpg; 12.jpg; 13.jpg: similaridad: 90+

Tengo algunas ideas de como hacerlo pero creo que seria poco optimo.
Alguien conoce algun algoritmo para agrupar estos datos de una forma otima?

Gracias de antemano por su apoyo
  #2 (permalink)  
Antiguo 24/11/2010, 16:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Agrupando datos en PHP

pues de los ejemplos que colocas yo no entiendo a que le dices "similares", pues no le veo nada similar...

bueno, quizá la longitud en caracteres del nombre sin extensión... ¿es así?

pues... algoritmos existentes desconozco, en todo caso un simple bucle, algún arreglo y sencillas comparaciones deberían hacer todo el trabajo!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 24/11/2010, 16:31
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Agrupando datos en PHP

Gracias por responder, la lista muestra la similaridad.
En la primera linea: 01.jpg;02.jpg;98
01.jpg es similar a 02.jpg en un 98%
  #4 (permalink)  
Antiguo 24/11/2010, 16:41
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 6 meses
Puntos: 80
Respuesta: Agrupando datos en PHP

No se el tamaño de las imágenes pero lo único que se me ocurre es recorrerlas bit a bit y comparar las coincidencias, ahora si son de distinto tamaño cambiar el tamaño a una y compararla con esa como testigo y mantener el original, pero esto en imágenes grandes seria muy costoso....

Pero algún algoritmo debe haber pues TinEye http://www.tineye.com/ , le das una imagen y te busca en la web (su base de datos) imágenes parecidas...

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #5 (permalink)  
Antiguo 24/11/2010, 16:44
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Agrupando datos en PHP

Gracias portalmana, mi problema no esta en comparar las imagenes ya tengo un software que las compara pero me devuelve una lista con las coincidencias, ahora lo que quiero es agruparlas, estoy programando un script pero estoy seguro que se va a ejecutar muy lento.
  #6 (permalink)  
Antiguo 24/11/2010, 16:56
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Agrupando datos en PHP

Programe este, me funciona a medias:

Código PHP:
        //arrayres contiene la lista de coincidencias
        
foreach ($arrayres as $xcompare){
            list(
$imgsname,$imgdname,$percent) = explode(";",$xcompare);
            if(
$percent 90){

                if(!isset(
$lastgroup)){
                    
$lastgroup="$imgsname;$imgdname;";
                }else{
                    if(
eregi("($imgsname|$imgdname)",$lastgroup)){
                        
$lastgroup .= "$imgsname;$imgdname;";
                    }else{
                        
$grupos[]=$lastgroup;
                        
$lastgroup="$imgsname;$imgdname;";
                    }
                }
            }
        }
        
$i=0;
        foreach(
$grupos as $xgrupo){
            
$lgrupo explode(";",$xgrupo);
            
$agrupo array_unique($lgrupo);
            
$sgrupo implode(";",$agrupo);
            echo 
"Grupo " $i++ . ": $sgrupo<br>";
        }
        echo 
$matchimgs
Este script me funciona solo si las coincidencias están ordenadas
  #7 (permalink)  
Antiguo 24/11/2010, 20:23
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Agrupando datos en PHP

Bueno creo que lo logre, aun que tal vez se puede optimizar más remplazando eregi_replace por preg_replace, les dejo el código por si algún día lo necesitan:

Código PHP:
        foreach ($arrayres as $xcompare){
            list($
$imgsname,$imgdname,$percent) = explode(";",$xcompare);
            if(
$percent 90){
                if(!isset(
$lastgroup)){
                    
$lastgroup="$imgsname;$imgdname";
                }else{
                    if(
eregi("($imgsname|$imgdname)",$lastgroup)){
                        
$lastgroup .= ";$imgsname;$imgdname";
                    }else{
                        
$grupos[]=$lastgroup;
                        
$lastgroup="$imgsname;$imgdname";
                    }
                }
            }
        }
        
$x=0;
        while(
$grupos[$x]){
            
$og=$grupos[$x];
            if(
$og==1){
                
$x++;
                continue;
            }

            
$y=$x+1;
            while(
$grupos[$y]){
                
$dg=$grupos[$y];
                if(
$dg==1){
                    
$y++;
                    continue;
                }
                
$og_regex eregi_replace(";","|",$og);
                if(
eregi("($og_regex)",$dg)){
                    
$grupos[$x] .= ";"$grupos[$y];
                    
$grupos[$y] = 1;
                }
                
$y++;
            }
            
$x++;
        }
        
$i=0;
        foreach(
$grupos as $xgrupo){
            if(
$xgrupo==1) continue;
            
$lgrupo explode(";",$xgrupo);
            
$agrupo array_unique($lgrupo);
            
$sgrupo implode(";",$agrupo);
            echo 
"Grupo " $i++ . ": $sgrupo<br>";
            foreach(
$agrupo as $smatch){
                echo 
"<img src='folder_img/$id/$smatch' width='150'>";
            }
            echo 
"<br>";
        } 

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:26.