Muitos sites oferecem algumas estatísticas como "Os tópicos mais quentes nas últimas 24h". Por exemplo, o Topix.com mostra isso em sua seção "Tendências de notícias". Lá, você pode ver os tópicos que têm o número de menções que mais cresce.
Também quero calcular esse "burburinho" para um tópico. Como eu pude fazer isso? O algoritmo deve ponderar os tópicos que estão sempre menos quentes. Os tópicos que normalmente (quase) ninguém menciona devem ser os mais quentes.
O Google oferece "Hot Trends", topix.com mostra "Hot Topics", fav.or.it mostra "Keyword Trends" - todos esses serviços têm uma coisa em comum: eles mostram apenas as próximas tendências que estão anormalmente quentes no momento.
Termos como "Britney Spears", "clima" ou "Paris Hilton" não aparecerão nessas listas porque são sempre quentes e frequentes. Este artigo chama isso de "O problema de Britney Spears".
Minha pergunta: como você pode codificar um algoritmo ou usar um existente para resolver esse problema? Tendo uma lista com as palavras-chave pesquisadas nas últimas 24 horas, o algoritmo deve mostrar as 10 (por exemplo) mais populares.
Eu sei, no artigo acima, há algum tipo de algoritmo mencionado. Eu tentei codificá-lo em PHP, mas não acho que funcione. Apenas encontra a maioria, não acha?
Espero que você possa me ajudar (exemplos de codificação seriam ótimos).
Respostas:
Esse problema exige uma pontuação z ou pontuação padrão, que levará em consideração a média histórica, como outras pessoas mencionaram, mas também o desvio padrão desses dados históricos, tornando-o mais robusto do que apenas usando a média.
No seu caso, um escore z é calculado pela fórmula a seguir, onde a tendência seria uma taxa como visualizações / dia.
Quando um escore z é usado, quanto maior ou menor o escore z, mais anormal é a tendência; por exemplo, se o escore z é altamente positivo, a tendência aumenta anormalmente, enquanto se é altamente negativo, diminui anormalmente. . Portanto, depois de calcular o escore z para todas as tendências candidatas, os 10 escores z mais altos se relacionam com os escores z que aumentam anormalmente.
Por favor, consulte a Wikipedia para obter mais informações sobre z-scores.
Código
Saída de amostra
Notas
Você pode usar esse método com uma janela deslizante (ou seja, nos últimos 30 dias) se não levar muito em consideração o histórico, o que tornará as tendências de curto prazo mais acentuadas e reduzirá o tempo de processamento.
Você também pode usar um z-score para valores como alteração de visualizações de um dia para o dia seguinte para localizar os valores anormais de aumento / diminuição de visualizações por dia. É como usar a inclinação ou a derivada das visualizações por dia.
Se você acompanhar o tamanho atual da população, o total atual da população e o total atual de x ^ 2 da população, não precisará recalcular esses valores, apenas atualizá-los e, portanto, precisará apenas mantenha esses valores para o histórico, não cada valor de dados. O código a seguir demonstra isso.
Usando esse método, seu fluxo de trabalho seria o seguinte. Para cada tópico, tag ou página, crie um campo de ponto flutuante, para o número total de dias, soma de visualizações e soma de visualizações ao quadrado no banco de dados. Se você tiver dados históricos, inicialize esses campos usando esses dados; caso contrário, inicialize com zero. No final de cada dia, calcule a pontuação z usando o número de visualizações do dia em relação aos dados históricos armazenados nos três campos do banco de dados. Os tópicos, tags ou páginas com as maiores pontuações z de X são as suas "tendências mais quentes" do dia. Por fim, atualize cada um dos 3 campos com o valor do dia e repita o processo amanhã.
Nova adição
Os escores z normais, conforme discutido acima, não levam em consideração a ordem dos dados e, portanto, o escore z para uma observação de '1' ou '9' teria a mesma magnitude em relação à sequência [1, 1, 1, 1 9, 9, 9, 9]. Obviamente, para encontrar tendências, os dados mais atuais devem ter mais peso que os dados mais antigos e, portanto, queremos que a observação '1' tenha uma pontuação de magnitude maior que a observação '9'. Para isso, proponho um escore z médio flutuante. Deve ficar claro que esse método NÃO é estatisticamente correto, mas deve ser útil para encontrar tendências ou algo semelhante. A principal diferença entre o escore z padrão e o escore z médio flutuante é o uso de uma média flutuante para calcular o valor médio da população e o valor médio da população ao quadrado. Consulte o código para obter detalhes:
Código
IO de amostra
Atualizar
Como David Kemp apontou corretamente, se for fornecida uma série de valores constantes e, em seguida, for solicitado um zscore para um valor observado diferente dos outros valores, o resultado provavelmente deve ser diferente de zero. De fato, o valor retornado deve ser infinito. Então eu mudei essa linha,
para:
Essa alteração é refletida no código da solução fazscore. Se alguém não quiser lidar com valores infinitos, uma solução aceitável seria alterar a linha para:
fonte
paste
links não parecem estar funcionando ... obrigado!Você precisa de um algoritmo que mede a velocidade de um tópico - ou, em outras palavras, se você o representar graficamente, deseja mostrar aqueles que estão subindo a um ritmo incrível.
Essa é a primeira derivada da linha de tendência e não é difícil incorporar como um fator ponderado do seu cálculo geral.
Normalizar
Uma técnica que você precisará fazer é normalizar todos os seus dados. Para cada tópico que você está seguindo, mantenha um filtro de passagem muito baixa que defina a linha de base desse tópico. Agora todos os pontos de dados que aparecem sobre esse tópico devem ser normalizados - subtraia sua linha de base e você terá TODOS os seus tópicos perto de 0, com picos acima e abaixo da linha. Em vez disso, você pode dividir o sinal pela magnitude da linha de base, o que trará o sinal para cerca de 1,0 - isso não apenas alinha todos os sinais entre si (normaliza a linha de base), mas também normaliza os picos. Um pico de britney será magnitudes maiores que o de outra pessoa, mas isso não significa que você deva prestar atenção a ele - o pico pode ser muito pequeno em relação à linha de base.
Derivar
Depois de normalizar tudo, descubra a inclinação de cada tópico. Tome dois pontos consecutivos e meça a diferença. Uma diferença positiva está tendendo para cima, uma diferença negativa está tendendo para baixo. Em seguida, você pode comparar as diferenças normalizadas e descobrir quais tópicos estão aumentando em popularidade em comparação com outros tópicos - com cada tópico dimensionado de acordo com seu próprio 'normal', que pode ter magnitudes de ordem diferentes de outros tópicos.
Esta é realmente uma primeira passagem para o problema. Existem técnicas mais avançadas que você precisará usar (principalmente uma combinação das opções acima com outros algoritmos, ponderadas para atender às suas necessidades), mas isso deve ser suficiente para você começar.
Em relação ao artigo
O artigo é sobre tendências de tópicos, mas não é sobre como calcular o que é interessante e o que não é, é sobre como processar a enorme quantidade de informações que esse algoritmo deve processar em locais como Lycos e Google. O espaço e o tempo necessários para atribuir um contador a cada tópico e encontrar o contador de cada tópico quando uma pesquisa é enorme. Este artigo é sobre os desafios que se enfrenta ao tentar essa tarefa. Ele menciona o efeito Brittney, mas não fala sobre como superá-lo.
Como Nixuz aponta, isso também é chamado de Z ou Pontuação padrão .
fonte
Chad Birch e Adam Davis estão certos, pois você precisará olhar para trás para estabelecer uma linha de base. Sua pergunta, conforme formulada, sugere que você deseja visualizar apenas os dados das últimas 24 horas e isso não será suficiente.
Uma maneira de fornecer aos seus dados alguma memória sem precisar consultar um grande corpo de dados históricos é usar uma média móvel exponencial. A vantagem disso é que você pode atualizá-lo uma vez por período e liberar todos os dados antigos, portanto, é necessário lembrar apenas de um único valor. Portanto, se seu período é um dia, você deve manter um atributo "média diária" para cada tópico, o que pode ser feito por:
Onde
a_n
está a média móvel a partir do dian
, b é uma constante entre 0 e 1 (quanto mais próximo de 1, maior a memória) ec_n
é o número de ocorrências no dian
. A beleza é que, se você executar essa atualização no final do dian
, poderá liberarc_n
ea_(n-1)
.A única ressalva é que ela será inicialmente sensível ao que você escolher como valor inicial
a
.EDITAR
Se ajudar a visualizar essa abordagem, faça
n = 5
,a_0 = 1
eb = .9
.Digamos que os novos valores sejam 5,0,0,1,4:
Não parece muito com uma média, parece? Observe como o valor ficou próximo de 1, mesmo que nossa próxima entrada tenha sido 5. O que está acontecendo? Se você expandir a matemática, o que você obtém é:
O que quero dizer com sobra de peso? Bem, em qualquer média, todos os pesos devem adicionar a 1. Se n fosse infinito e o ... pudesse durar para sempre, todos os pesos seriam somados a 1. Mas se n for relativamente pequeno, você terá uma boa quantidade de peso restante na entrada original.
Se você estuda a fórmula acima, deve entender algumas coisas sobre esse uso:
Eu acho que as duas primeiras características são exatamente o que você está procurando. Para lhe dar uma idéia simples de implementar, aqui está uma implementação em python (menos toda a interação com o banco de dados):
fonte
Normalmente, o "buzz" é descoberto usando alguma forma de mecanismo de decaimento exponencial / de log. Para uma visão geral de como o Hacker News, Reddit e outros lidam com isso de uma maneira simples, consulte este post .
Isso não aborda completamente as coisas que sempre são populares. O que você procura parece ser algo como o recurso " Hot Trends " do Google . Para isso, você pode dividir o valor atual por um valor histórico e subtrair os que estiverem abaixo de algum limite de ruído.
fonte
Eu acho que a palavra-chave que você precisa notar é "anormalmente". Para determinar quando algo é "anormal", você precisa saber o que é normal. Ou seja, você precisará de dados históricos, que podem ser calculados em média para descobrir a taxa normal de uma consulta específica. Convém excluir dias anormais do cálculo da média, mas novamente será necessário ter dados suficientes, para que você saiba quais dias excluir.
A partir daí, você terá que definir um limite (o que exigiria experimentação, tenho certeza) e, se algo ultrapassar o limite, digitar 50% mais pesquisas do que o normal, você poderá considerá-lo uma "tendência". Ou, se você quiser encontrar o "Top X Trendiest" como você mencionou, basta solicitar as coisas pela distância (percentual) em que elas estão da sua taxa normal.
Por exemplo, digamos que seus dados históricos informam que Britney Spears geralmente recebe 100.000 pesquisas e Paris Hilton geralmente recebe 50.000. Se você tem um dia em que os dois recebem 10.000 pesquisas a mais do que o normal, considere Paris "mais quente" que Britney, porque as pesquisas dela aumentaram 20% a mais do que o normal, enquanto as de Britney foram apenas 10%.
Deus, eu não acredito que acabei de escrever um parágrafo comparando "gostosuras" de Britney Spears e Paris Hilton. O que você fez comigo?
fonte
Eu queria saber se é possível usar a fórmula regular de aceleração física nesse caso?
Podemos considerar v1 como curtidas / votos / contagem de comentários iniciais por hora e v2 como "velocidade" atual por hora nas últimas 24 horas?
Isso é mais uma pergunta do que uma resposta, mas parece que pode funcionar. Qualquer conteúdo com maior aceleração será o tópico de tendência ...
Estou certo de que isso pode não resolver o problema de Britney Spears :-)
fonte
v1
e precisaria de um valor muito altov2
para ser considerado "tendência". No entanto, provavelmente existem fórmulas e algoritmos melhores e mais sofisticados para fazer isso. No entanto, é um exemplo básico de trabalho.provavelmente um simples gradiente de frequência de tópicos funcionaria - grande gradiente positivo = crescendo rapidamente em popularidade.
a maneira mais fácil seria separar o número de pesquisas por dia, para que você tenha algo como
e descubra o quanto isso mudou de dia para dia:
e apenas aplique algum tipo de limite para que os dias em que o aumento fosse> 50 sejam considerados "quentes". você pode tornar isso muito mais complicado se você também quiser. em vez da diferença absoluta, você pode fazer a diferença relativa para que ir de 100 a 150 seja considerado quente, mas 1000 a 1050 não. ou um gradiente mais complicado que leva em consideração as tendências de mais de um dia para o outro.
fonte
Eu havia trabalhado em um projeto, onde meu objetivo era encontrar os Tópicos de Tendências do Live Twitter Stream e também fazer análises sentimentais sobre os tópicos de tendências (descobrir se o Tópico de Tendências falava de maneira positiva / negativa). Eu usei o Storm para lidar com o fluxo do twitter.
Publiquei meu relatório como um blog: http://sayrohan.blogspot.com/2013/06/finding-trending-topics-and-trending.html
Eu usei Total Count e Z-Score para o ranking.
A abordagem que usei é um pouco genérica e, na seção de discussão, mencionei que como podemos estender o sistema para aplicativos que não são do Twitter.
Espero que a informação ajude.
fonte
Se você simplesmente olhar tweets ou mensagens de status para obter seus tópicos, encontrará muito barulho. Mesmo se você remover todas as palavras de parada. Uma maneira de obter um subconjunto melhor de candidatos a tópicos é focar apenas nos tweets / mensagens que compartilham um URL e obter as palavras-chave no título dessas páginas da web. E certifique-se de aplicar a marcação POS para obter substantivos + frases substantivas também.
Os títulos das páginas da web geralmente são mais descritivos e contêm palavras que descrevem o que é a página. Além disso, o compartilhamento de uma página da web geralmente está correlacionado com o compartilhamento de notícias que estão surgindo (por exemplo, se uma celebridade como Michael Jackson morreu, muitas pessoas compartilharão um artigo sobre a morte dele).
Fiz experimentos em que apenas tomo palavras-chave populares de títulos e, em seguida, obtenho a contagem total dessas palavras-chave em todas as mensagens de status, e elas definitivamente removem muito ruído. Se você fizer isso dessa maneira, não precisará de um algoritmo complexo, basta fazer um pedido simples das frequências das palavras-chave e estará no meio do caminho.
fonte
Você pode usar proporções de probabilidade de log para comparar a data atual com o último mês ou ano. Isso é estatisticamente correto (considerando que seus eventos não são normalmente distribuídos, o que deve ser assumido em sua pergunta).
Basta classificar todos os seus termos por logLR e escolher os dez primeiros.
PS, um TermBag é uma coleção desordenada de palavras. Para cada documento, você cria um pacote de termos. Apenas conte as ocorrências de palavras. Em seguida, o método
occurrences
retorna o número de ocorrências de uma determinada palavra e o métodosize
retorna o número total de palavras. É melhor normalizar as palavras de alguma forma, normalmentetoLowerCase
é bom o suficiente. Obviamente, nos exemplos acima, você criaria um documento com todas as consultas de hoje e um com todas as consultas do ano passado.fonte
A idéia é acompanhar essas coisas e perceber quando elas saltam significativamente em comparação com sua própria linha de base.
Portanto, para consultas com mais de um limite de limite, acompanhe cada uma delas e, quando ela mudar para algum valor (digamos quase o dobro) do seu valor histórico, será uma nova tendência quente.
fonte