Ver Mensaje Individual
  #11 (permalink)  
Antiguo 10/08/2014, 11:17
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Hashtags del momento

Prueba este:

Código PHP:
Ver original
  1. $reporte_ultimos_dias = 7;
  2.     $lapso_de_intervalo = 2;
  3.     $sql = mysqli_query($mysqli, "SELECT    
  4.                                    info.hashtag_content,
  5.                                    SUM(info.cantidad) menciones,
  6.                                    SUM( (info.intervalo_actual / ( TIMESTAMPDIFF(  MINUTE,
  7.                                                                      DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
  8.                                                                      NOW()
  9.                                                                    ) / $lapso_de_intervalo
  10.                                                                  )
  11.                                         ) * info.cantidad
  12.                                       ) puntuacion
  13.                                   FROM (
  14.                                       SELECT
  15.                                           hashtag_content,
  16.                                           CEIL( ( TIMESTAMPDIFF(  MINUTE,
  17.                                                       DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
  18.                                                       hashtag_date
  19.                                                      ) / $lapso_de_intervalo)
  20.                                               ) intervalo_actual,
  21.                                           COUNT(DISTINCT hashtag_id) cantidad
  22.                                       FROM hashtags
  23.                                       WHERE ( hashtag_date >= DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY) )
  24.                                       GROUP BY intervalo_actual, hashtag_content
  25.                                       HAVING intervalo_actual > 0
  26.                                   ) info  
  27.                                   GROUP BY info.hashtag_content
  28.                                   ORDER BY puntuacion DESC, menciones DESC, intervalo_actual DESC");
  29.     while($hashtag = mysqli_fetch_array($sql))
  30.         echo '<div><a href="/i/hashtag/'.$hashtag['hashtag_content'].'" class="hcolor">#'.$hashtag['hashtag_content'].' -> '.$hashtag['puntuacion'].'</a></div>'; ?>

retorna acertadamente los resultados en base a la prueba, habria que tener mas datos en la base como para probarlo mejor, la clave esta aca:

Código MySQL:
Ver original
  1. SUM( (info.intervalo_actual / ( TIMESTAMPDIFF(  MINUTE,
  2.                                                                       DATE_SUB(NOW(), INTERVAL $reporte_ultimos_dias DAY),
  3.                                                                       NOW()
  4.                                                                     ) / $lapso_de_intervalo
  5.                                                                   )
  6.                                          ) * info.cantidad
  7.                                        ) puntuacion

esa suma es la quedes ir modificando para pulir al calculo lo mas posible, por ejemplo, si en vez de:

Código MySQL:
Ver original
  1. ) * info.cantidad
pones:
Código MySQL:
Ver original
  1. ) * (info.cantidad-1)

estaras diciendo que para entrar en el ranking, un hastag debe tener como minimo dos menciones (2-1 > 0) por supuesto esto podrias parametrizarlo a una variable php, que para el script tal como esta ahora, valdria 0.

es cuestion de que cuando lo implementes, le hagas durante 1 o 2 semanas un seguimiento y lo vallas puliendo con detalles como el que te mencione.

La idea es que cuando el programa te retorne algo que no es lo esperado, mires los datos y te preguntes ¿Porque este elemento no debe tener (tanta|tan poca) puntuacion? y cuando encuentres esa respuesta, por ejemplo en el caso del ejemplo anterior seria: porque aun se lo menciono muy pocas veces vallas y hagas el retoque.

Puede pasar que una resta tan directa sea un metodo un poco agresivo, ya que aquellos que solo se los menciona menos de 2 veces por intervalo dejaran de figurar, asi que podrias suavizar esa penalizacion haciendo algo asi:
Código MySQL:
Ver original
  1. ) * (info.cantidad-(0.1*(IF(info.cantidad = 1, 0.1, (1 / (info.cantidad-1))))))

con lo cual ya tienes 2 parametros mas, el minimo de menciones (1) y el factor de penalizacion (0.1) donde aquellos que no alcancen el minimo de menciones reciben una penalizacion acorde al factor de penalizacion.

Las empresas que se dedican a estas cosas, llevan mucho tiempo realizando un seguimiento de los datos, comparando lo que sus programas devuelven con lo que deberian devolver y luego puliendo y mejorando algoritmos como este, dibujando los numeros de los informes y agregando decenas de parametros para torcer el ranking hacia donde ellos creen o consideran que es correcto.
(Por algo en twitter Obama mide mas que musicos o artistas famosos a nivel mundial, no es porque a la mayor parte del mundo le importe la politica y lo que Twitea el presidente de estados unidos, sino porque las empresas que arman los ranking "consideran..." que eso es lo que deberia ocurrir, y llevan meses perfeccionando sus codigos para que reflejen sus criterios.)

tu debes hacer lo mismo, de a poco ir agregando pequeños cambios y torciendo el informe hacia lo que tu consideres los resultados correctos, no tengas ninguna duda que si juntas a 10 personas, le muestras los mismos datos, tendras no menos de 5 opiniones diferentes de como deberian ordenarse
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios