Muchos sitios ofrecen algunas estadísticas como "Los temas más candentes en las últimas 24 horas". Por ejemplo, Topix.com muestra esto en su sección "Tendencias de noticias". Allí, puede ver los temas que tienen el mayor número de menciones.
También quiero calcular tal "zumbido" para un tema. ¿Cómo podría hacer esto? El algoritmo debe ponderar los temas que siempre son menos interesantes. Los temas que normalmente (casi) nadie menciona deberían ser los más candentes.
Google ofrece "Tendencias populares", topix.com muestra "Temas de actualidad", fav.or.it muestra "Tendencias de palabras clave": todos estos servicios tienen una cosa en común: solo muestran tendencias futuras que son anormalmente actuales en este momento.
Términos como "Britney Spears", "clima" o "Paris Hilton" no aparecerán en estas listas porque siempre son calientes y frecuentes. Este artículo llama a esto "El problema de Britney Spears".
Mi pregunta: ¿cómo puede codificar un algoritmo o utilizar uno existente para resolver este problema? Al tener una lista con las palabras clave buscadas en las últimas 24 horas, el algoritmo debería mostrar las 10 (por ejemplo) más populares.
Lo sé, en el artículo anterior, hay algún tipo de algoritmo mencionado. He intentado codificarlo en PHP pero no creo que funcione. Simplemente encuentra la mayoría, ¿no?
Espero que me puedan ayudar (codificar ejemplos sería genial).
fuente
Respuestas:
Este problema requiere un puntaje z o puntaje estándar, que tendrá en cuenta el promedio histórico, como han mencionado otras personas, pero también la desviación estándar de estos datos históricos, lo que lo hace más robusto que el simple uso del promedio.
En su caso, la siguiente fórmula calcula un puntaje z, donde la tendencia sería una tasa tal como vistas / día.
Cuando se utiliza un puntaje z, cuanto mayor o menor es el puntaje z, más anormal es la tendencia, por ejemplo, si el puntaje z es altamente positivo, entonces la tendencia aumenta de manera anormal, mientras que si es altamente negativo, disminuye anormalmente . Entonces, una vez que calcule el puntaje z para todas las tendencias candidatas, los 10 puntajes z más altos se relacionarán con los puntajes z más anormales.
Consulte Wikipedia para obtener más información sobre las puntuaciones z.
Código
Salida de muestra
Notas
Puede usar este método con una ventana deslizante (es decir, los últimos 30 días) si no desea tener en cuenta demasiado historial, lo que hará que las tendencias a corto plazo sean más pronunciadas y reduzca el tiempo de procesamiento.
También puede usar una puntuación z para valores como el cambio en las vistas de un día al día siguiente para ubicar los valores anormales para aumentar / disminuir las vistas por día. Esto es como usar la pendiente o derivada del gráfico de vistas por día.
Si realiza un seguimiento del tamaño actual de la población, el total actual de la población y el total actual de x ^ 2 de la población, no necesita recalcular estos valores, solo actualícelos y, por lo tanto, solo necesita mantenga estos valores para el historial, no cada valor de datos. El siguiente código demuestra esto.
Con este método, su flujo de trabajo sería el siguiente. Para cada tema, etiqueta o página, cree un campo de punto flotante, para el número total de días, la suma de vistas y la suma de vistas al cuadrado en su base de datos. Si tiene datos históricos, inicialice estos campos utilizando esos datos, de lo contrario, inicialícelos a cero. Al final de cada día, calcule el puntaje z utilizando el número de vistas del día contra los datos históricos almacenados en los tres campos de la base de datos. Los temas, las etiquetas o las páginas con los puntajes z X más altos son sus X "tendencias más populares" del día. Finalmente actualice cada uno de los 3 campos con el valor del día y repita el proceso mañana.
Nueva adquisición
Los puntajes z normales como se discutió anteriormente no tienen en cuenta el orden de los datos y, por lo tanto, el puntaje z para una observación de '1' o '9' tendría la misma magnitud contra la secuencia [1, 1, 1, 1 , 9, 9, 9, 9]. Obviamente para la búsqueda de tendencias, los datos más actuales deberían tener más peso que los datos más antiguos y, por lo tanto, queremos que la observación '1' tenga una puntuación de magnitud mayor que la observación '9'. Para lograr esto, propongo una puntuación z promedio flotante. Debe quedar claro que NO se garantiza que este método sea estadísticamente sólido, pero debería ser útil para la búsqueda de tendencias o similar. La principal diferencia entre el puntaje z estándar y el puntaje z promedio flotante es el uso de un promedio flotante para calcular el valor promedio de la población y el valor promedio de la población al cuadrado. Ver código para más detalles:
Código
Muestra IO
Actualizar
Como David Kemp señaló correctamente, si se le da una serie de valores constantes y luego se solicita un puntaje z para un valor observado que difiere de los otros valores, el resultado probablemente no sea cero. De hecho, el valor devuelto debe ser infinito. Entonces cambié esta línea,
a:
Este cambio se refleja en el código de la solución fazscore. Si uno no quiere lidiar con valores infinitos, una solución aceptable podría ser cambiar la línea a:
fuente
paste
enlaces no parecen funcionar ... ¡gracias!Necesita un algoritmo que mida la velocidad de un tema, o en otras palabras, si lo grafica, desea mostrar los que están subiendo a una velocidad increíble.
Esta es la primera derivada de la línea de tendencia, y no es difícil de incorporar como un factor ponderado de su cálculo general.
Normalizar
Una técnica que deberá hacer es normalizar todos sus datos. Para cada tema que esté siguiendo, mantenga un filtro de paso muy bajo que defina la línea base de ese tema. Ahora, todos los puntos de datos que surjan sobre ese tema deben normalizarse: reste su línea de base y obtendrá TODOS sus temas cerca de 0, con picos encima y debajo de la línea. En cambio, es posible que desee dividir la señal por su magnitud de línea de base, lo que hará que la señal sea de alrededor de 1.0; esto no solo alinea todas las señales entre sí (normaliza la línea de base), sino que también normaliza los picos. Una espiga de Britney será de magnitud mayor que la espiga de otra persona, pero eso no significa que debas prestarle atención; la espiga puede ser muy pequeña en relación con su línea de base.
Derivar
Una vez que haya normalizado todo, descubra la pendiente de cada tema. Tome dos puntos consecutivos y mida la diferencia. Una diferencia positiva es una tendencia ascendente, una diferencia negativa es una tendencia descendente. Luego, puede comparar las diferencias normalizadas y descubrir qué temas se están disparando en popularidad en comparación con otros temas, con cada tema ajustado a su propia 'normalidad', que pueden ser magnitudes de orden diferentes de otros temas.
Esto es realmente un primer paso en el problema. Hay técnicas más avanzadas que necesitará usar (principalmente una combinación de lo anterior con otros algoritmos, ponderados para satisfacer sus necesidades), pero debería ser suficiente para comenzar.
Sobre el articulo
El artículo trata sobre tendencias de temas, pero no trata sobre cómo calcular lo que está de moda y lo que no, sino sobre cómo procesar la gran cantidad de información que dicho algoritmo debe procesar en lugares como Lycos y Google. El espacio y el tiempo necesarios para dar un contador a cada tema y encontrar el contador de cada tema cuando se realiza una búsqueda es enorme. Este artículo trata sobre los desafíos que uno enfrenta cuando intenta tal tarea. Menciona el efecto Brittney, pero no habla de cómo superarlo.
Como señala Nixuz, esto también se conoce como Z o puntaje estándar .
fuente
Chad Birch y Adam Davis tienen razón en que tendrá que mirar hacia atrás para establecer una línea de base. Su pregunta, tal como está redactada, sugiere que solo desea ver los datos de las últimas 24 horas, y eso no será suficiente.
Una forma de dar a sus datos algo de memoria sin tener que consultar un gran cuerpo de datos históricos es usar un promedio móvil exponencial. La ventaja de esto es que puede actualizar esto una vez por período y luego eliminar todos los datos antiguos, por lo que solo necesita recordar un solo valor. Entonces, si su período es un día, debe mantener un atributo de "promedio diario" para cada tema, lo que puede hacer de la siguiente manera:
Donde
a_n
está el promedio móvil a partir del dían
, b es algo constante entre 0 y 1 (cuanto más cercano a 1, más largo es el recuerdo) yc_n
es el número de visitas en el dían
. La belleza es que si realiza esta actualización al final del dían
, puede enjuagarsec_n
ya_(n-1)
.La única advertencia es que inicialmente será sensible a lo que elija para su valor inicial de
a
.EDITAR
Si se ayuda a visualizar este enfoque, tomar
n = 5
,a_0 = 1
yb = .9
.Digamos que los nuevos valores son 5,0,0,1,4:
¿No se parece mucho a un promedio? Observe cómo el valor se mantuvo cerca de 1, a pesar de que nuestra siguiente entrada fue 5. ¿Qué está pasando? Si expandes las matemáticas, lo que obtienes es que:
¿Qué quiero decir con peso sobrante? Bueno, en cualquier promedio, todos los pesos deben sumarse a 1. Si n fuera infinito y el ... pudiera continuar para siempre, entonces todos los pesos sumarían 1. Pero si n es relativamente pequeño, queda una buena cantidad de peso en la entrada original.
Si estudia la fórmula anterior, debe darse cuenta de algunas cosas sobre este uso:
Creo que las dos primeras características son exactamente lo que estás buscando. Para darle una idea de lo simple, esto puede ser implementar, aquí hay una implementación de Python (menos toda la interacción de la base de datos):
fuente
Por lo general, el "zumbido" se resuelve utilizando alguna forma de mecanismo de descomposición exponencial / logarítmica. Para obtener una descripción general de cómo Hacker News, Reddit y otros manejan esto de una manera simple, vea esta publicación .
Esto no aborda completamente las cosas que siempre son populares. Lo que estás buscando parece ser algo así como la función " Tendencias populares " de Google . Para eso, puede dividir el valor actual por un valor histórico y luego restar los que están por debajo de un umbral de ruido.
fuente
Creo que la palabra clave que debes notar es "anormalmente". Para determinar cuándo algo es "anormal", debe saber qué es normal. Es decir, necesitará datos históricos, que puede promediar para averiguar la tasa normal de una consulta en particular. Es posible que desee excluir días anormales del cálculo del promedio, pero nuevamente eso requerirá tener suficientes datos ya, para que sepa qué días excluir.
A partir de ahí, tendrá que establecer un umbral (lo que requeriría experimentación, estoy seguro), y si algo sale del umbral, digamos 50% más de búsquedas de lo normal, puede considerarlo una "tendencia". O bien, si desea poder encontrar el "Top X Trendiest" como mencionó, solo necesita ordenar las cosas según la distancia (porcentual) que están lejos de su tasa normal.
Por ejemplo, supongamos que sus datos históricos le han dicho que Britney Spears generalmente obtiene 100,000 búsquedas, y Paris Hilton generalmente obtiene 50,000. Si tiene un día en el que ambos obtienen 10,000 búsquedas más de lo normal, debería considerar a Paris "más caliente" que Britney, porque sus búsquedas aumentaron un 20% más de lo normal, mientras que las de Britney fueron solo del 10%.
Dios, no puedo creer que acabo de escribir un párrafo que compara la "pasión" de Britney Spears y Paris Hilton. ¿Qué me has hecho?
fuente
Me preguntaba si es posible utilizar la fórmula de aceleración física regular en tal caso.
¿Podemos considerar v1 como me gusta / votos / conteo de comentarios iniciales por hora y v2 como "velocidad" actual por hora en las últimas 24 horas?
Esto se parece más a una pregunta que a una respuesta, pero parece que puede funcionar. Cualquier contenido con mayor aceleración será el tema de tendencia ...
Estoy seguro de que esto puede no resolver el problema de Britney Spears :-)
fuente
v1
y necesitaría un valor muy altov2
para ser considerado "tendencia". Sin embargo, probablemente haya fórmulas y algoritmos mejores y más sofisticados para hacer esto. Sin embargo, es un ejemplo de trabajo básico.probablemente funcionaría un simple gradiente de frecuencia de tema: gran gradiente positivo = creciente popularidad rápidamente.
la forma más fácil sería agrupar el número de búsquedas cada día, para que tenga algo como
y luego descubra cuánto cambió día a día:
y simplemente aplique algún tipo de umbral para que los días en que el aumento fue> 50 se consideren "calientes". podrías hacer esto mucho más complicado si quieres también. en lugar de la diferencia absoluta, puede tomar la diferencia relativa para que pasar de 100 a 150 se considere caliente, pero de 1000 a 1050 no. o un gradiente más complicado que tenga en cuenta las tendencias durante más de un día para el siguiente.
fuente
Había trabajado en un proyecto, donde mi objetivo era encontrar temas de tendencias de Live Twitter Stream y también hacer un análisis sentimental sobre los temas de tendencias (encontrar si el tema de tendencias hablaba positiva / negativamente). He usado Storm para manejar la transmisión de Twitter.
He publicado mi informe como blog: http://sayrohan.blogspot.com/2013/06/finding-trending-topics-and-trending.html
He usado Total Count y Z-Score para el ranking.
El enfoque que he usado es un poco genérico, y en la sección de discusión, mencioné cómo podemos extender el sistema para aplicaciones que no son de Twitter.
Espero que la información ayude.
fuente
Si simplemente mira tweets o mensajes de estado para obtener sus temas, encontrará mucho ruido. Incluso si elimina todas las palabras vacías. Una forma de obtener un mejor subconjunto de candidatos a temas es centrarse solo en tweets / mensajes que comparten una URL y obtener las palabras clave del título de esas páginas web. Y asegúrese de aplicar el etiquetado POS para obtener sustantivos + frases nominales también.
Los títulos de las páginas web generalmente son más descriptivos y contienen palabras que describen de qué trata la página. Además, compartir una página web generalmente se correlaciona con el intercambio de noticias de última hora (es decir, si una celebridad como Michael Jackson murió, habrá muchas personas compartiendo un artículo sobre su muerte).
Realicé experimentos donde solo tomo palabras clave populares de los títulos, y luego obtengo el recuento total de esas palabras clave en todos los mensajes de estado, y definitivamente eliminan mucho ruido. Si lo hace de esta manera, no necesita un algoritmo complejo, solo haga un simple pedido de las frecuencias de las palabras clave y estará a medio camino.
fuente
Puede usar las razones de probabilidad de registro para comparar la fecha actual con el último mes o año. Esto es estadísticamente sólido (dado que sus eventos no se distribuyen normalmente, lo que debe suponerse a partir de su pregunta).
Simplemente ordene todos sus términos por logLR y elija los diez mejores.
PD: un TermBag es una colección desordenada de palabras. Para cada documento, crea una bolsa de términos. Solo cuenta las ocurrencias de las palabras. Luego, el método
occurrences
devuelve el número de apariciones de una palabra determinada y el métodosize
devuelve el número total de palabras. Es mejor normalizar las palabras de alguna manera, por lo generaltoLowerCase
es lo suficientemente bueno. Por supuesto, en los ejemplos anteriores, crearía un documento con todas las consultas de hoy y uno con todas las consultas del año pasado.fuente
La idea es hacer un seguimiento de tales cosas y notar cuándo saltan significativamente en comparación con su propia línea de base.
Por lo tanto, para consultas que tienen más de un umbral determinado, haga un seguimiento de cada una y cuando cambie a algún valor (digamos casi el doble) de su valor histórico, entonces es una nueva tendencia.
fuente