Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/07/2014, 18:40
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Hashtags del momento

Hola! Me alegro de ver que te esforzaste en intentar algo, con gusto te respondere.

Primero que nada, el algoritmo esta bastante bien planteado solo tiene unas pequeñas falencias relacionadas con las preguntas que hiciste luego. Te voy a proponer otra forma de implemntarlo, solo con MySQL que te sera mas eficiente y facil de inplementar y mantener.

Para poblar la base de datos de prueba use el siguiente codigo (Para probar estas cosas hacen falta unos miles de registros, con solo 3 no se apreciara mucho):

Código PHP:
Ver original
  1. <?php
  2.     set_time_limit(0);
  3.     $mysqli = mysqli_connect('localhost', 'root', '', 'pruebas') or die(mysqli_error($mysqli));
  4.  
  5.         $fecha_desde = "2014-07-01 00:00:00";
  6.         $fecha_hasta = date("Y-m-d H:i:s");
  7.         $palabras_hashtags = array(
  8.                                 'photooftheday'
  9.                                 ,'love'
  10.                                 ,'igers'
  11.                                 ,'cute'
  12.                                 ,'me'
  13.                                 ,'picoftheday'
  14.                                 ,'sky'
  15.                                 ,'bestoftheday'
  16.                                 ,'girl'
  17.                                 ,'igdaily'
  18.                                 ,'beautiful'
  19.                                 ,'food'
  20.                                 ,'dog'
  21.                                 ,'nature');
  22.                                
  23.         for($fecha=$fecha_desde; $fecha<=$fecha_hasta; $fecha=date("Y-m-d H:i:s", strtotime($fecha ." +30 second")))
  24.         {  
  25.             mysqli_query($mysqli, "INSERT INTO `pruebas`.`publicaciones` (`fecha_publicacion`, `hashtag`) VALUES ('$fecha', '".($palabras_hashtags[rand(0, count($palabras_hashtags)-1)])."');") or die("Error en consulta.");        
  26.         }
  27.         die("listo");

Luego de casi 3 minutos de ejecucion, la tabla quedo poblada con 1 hashtag cada 30 segundos (~83,297 registros)

El algoritmo que te propongo es este:

Código PHP:
Ver original
  1. /*
  2.      *  Cantidad de dias que tendras en cuenta en el ranking.
  3.      *  Los dias se cuentan de la fecha actual, hacia atras.
  4.      *  En este caso son 7, es decir, la ultima semana.
  5.      */
  6.     $reporte_ultimos_dias = 7;
  7.  
  8.     /*
  9.      *  Cantidad de minutos de los sub-intervalos de la puntuacion.
  10.      *  Esto es con que frecuencia consideras que una aparicion de hashtag vale mas que otra.
  11.      *  En este caso son 5, es decir, los que esten en los mismos 5 minutos, tendran el mismo indice de puntuacion.
  12.      */
  13.     $lapso_de_intervalo = 5;
  14.  
  15.     $mysqli = mysqli_connect('localhost', 'root', '', 'pruebas') or die(mysqli_error($mysqli));
  16.     $sql = mysqli_query($mysqli, "SELECT info.hashtag, SUM(info.cantidad) menciones, ( (CEIL( ( TIMESTAMPDIFF (  MINUTE,
  17.                                                        DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
  18.                                                        NOW()
  19.                                                      ) / $lapso_de_intervalo)
  20.                                                ) / info.intervalo_actual) * info.cantidad) puntuacion
  21.                                    FROM (
  22.                                        SELECT
  23.                                            hashtag,
  24.                                             CEIL(   ( TIMESTAMPDIFF(  MINUTE,
  25.                                                        DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
  26.                                                        fecha_publicacion
  27.                                                       ) / $lapso_de_intervalo)
  28.                                                ) intervalo_actual,
  29.                                            COUNT(DISTINCT id) cantidad
  30.                                        FROM publicaciones
  31.                                        WHERE ( fecha_publicacion >= DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY) )
  32.                                        GROUP BY intervalo_actual, hashtag
  33.                                        HAVING intervalo_actual > 0
  34.                                     ) info 
  35.                                    GROUP BY info.hashtag
  36.                                    ORDER BY puntuacion DESC") or die(mysqli_error($sql));                                    
  37.     echo("<table>
  38.            <tr>
  39.                <th colspan=\"3\">Tendencias de los ultimos $reporte_ultimos_dias dias</th>
  40.            </tr>
  41.            <tr>
  42.                <th>#Hashtag</th>
  43.                <th>Menciones</th>
  44.                <th>Popularidad</th>
  45.            </tr>");
  46.     while($hashtag = mysqli_fetch_array($sql))
  47.         echo("<tr><td>#".$hashtag["hashtag"]."</td><td>".$hashtag["menciones"]."</td><td>".$hashtag["puntuacion"]."<td></tr>");
  48.     echo("</table>");

Para mis datos obtube esto:

Tendencias de los ultimos 7 dias
#Hashtag Menciones Popularidad
#bestoftheday 1453 4032.0000
#sky 1465 4032.0000
#photooftheday 1455 3024.0000
#beautiful 1410 2016.0000
#cute 1444 2016.0000
#love 1456 2016.0000
#picoftheday 1419 2016.0000
#girl 1434 2016.0000
#me 1444 2016.0000
#igers 1457 1344.0000
#food 1422 672.0000
#nature 1395 672.0000
#igdaily 1410 672.0000
#dog 1443 504.0000

Como puedes observar, la cantidad de menciones no es determinante, es importante que se lo mencione mucho, pero tambien es importante que se lo halla mencionado recientemente.

No es lo mismo lo mas mencionado que lo que esta de moda, puedes comparar esto con las visitas de un video de youtube, el video con mas visitas NO tiene porque ser el mas visitado, el de mas visitas es que fue visto mas veces, no importa cuando, el mas visitado es el que mas gente esta viendo ultimamente.

Seria cuestion de que ajustes los dos parametros para afinar el resultado tanto como quieras.

Cita:
¿Qué diferencia hay entre $inicio y $intervalo? ¿Qué significa $cant_intervalos?
La diferencia esta explicada en los comentarios del codigo que te acabo de pasar, les puse unos nombres mas claros a cada uno, la cantidad de intervalos es un valor calculado, no es un valor que debas porner tu, sino que se calcula solo en funcion de los dos valores anteriores.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios