Viele Websites bieten Statistiken wie "Die heißesten Themen der letzten 24 Stunden". Zum Beispiel zeigt Topix.com dies in seinem Abschnitt "News Trends". Dort sehen Sie die Themen mit der am schnellsten wachsenden Anzahl von Erwähnungen.
Ich möchte einen solchen "Buzz" auch für ein Thema berechnen. Wie könnte ich das machen? Der Algorithmus sollte die Themen gewichten, die immer weniger heiß sind. Die Themen, die normalerweise (fast) niemand erwähnt, sollten die heißesten sein.
Google bietet "Hot Trends" an, topix.com zeigt "Hot Topics", fav.or.it zeigt "Keyword Trends" - all diese Dienste haben eines gemeinsam: Sie zeigen Ihnen nur kommende Trends, die momentan ungewöhnlich heiß sind.
Begriffe wie "Britney Spears", "Wetter" oder "Paris Hilton" werden in diesen Listen nicht angezeigt, da sie immer heiß und häufig sind. Dieser Artikel nennt dies "The Britney Spears Problem".
Meine Frage: Wie können Sie einen Algorithmus codieren oder einen vorhandenen verwenden, um dieses Problem zu lösen? Wenn Sie eine Liste mit den Schlüsselwörtern haben, die in den letzten 24 Stunden gesucht wurden, sollte der Algorithmus Ihnen die 10 (zum Beispiel) heißesten anzeigen.
Ich weiß, dass im obigen Artikel eine Art Algorithmus erwähnt wird. Ich habe versucht, es in PHP zu codieren, aber ich glaube nicht, dass es funktionieren wird. Es findet nur die Mehrheit, nicht wahr?
Ich hoffe, Sie können mir helfen (Codierungsbeispiele wären großartig).
quelle
Antworten:
Dieses Problem erfordert einen Z-Score oder Standard-Score, der den historischen Durchschnitt berücksichtigt, wie andere bereits erwähnt haben, aber auch die Standardabweichung dieser historischen Daten, wodurch sie robuster sind als nur die Verwendung des Durchschnitts.
In Ihrem Fall wird ein Z-Score nach der folgenden Formel berechnet, wobei der Trend eine Rate wie Ansichten / Tag ist.
Wenn ein Z-Score verwendet wird, ist der Trend umso abnormaler, je höher oder niedriger der Z-Score ist. Wenn beispielsweise der Z-Score hoch positiv ist, steigt der Trend abnormal an, während er ungewöhnlich stark fällt, wenn er stark negativ ist . Sobald Sie den Z-Score für alle Kandidatentrends berechnet haben, beziehen sich die höchsten 10 Z-Scores auf die ungewöhnlich ansteigenden Z-Scores.
Weitere Informationen zu Z-Scores finden Sie in Wikipedia .
Code
Beispielausgabe
Anmerkungen
Sie können diese Methode mit einem Schiebefenster (dh den letzten 30 Tagen) verwenden, wenn Sie nicht zu viel Verlauf berücksichtigen möchten, wodurch kurzfristige Trends deutlicher werden und die Verarbeitungszeit verkürzt werden kann.
Sie können auch einen Z-Score für Werte wie die Änderung der Ansichten von einem Tag zum nächsten Tag verwenden, um die abnormalen Werte für das Erhöhen / Verringern der Ansichten pro Tag zu ermitteln. Dies entspricht der Verwendung der Steigung oder Ableitung der Ansichten pro Tag.
Wenn Sie die aktuelle Bevölkerungsgröße, die aktuelle Gesamtbevölkerung und die aktuelle Gesamtgröße von x ^ 2 der Bevölkerung verfolgen, müssen Sie diese Werte nicht neu berechnen, sondern nur aktualisieren und müssen daher nur Behalten Sie diese Werte für den Verlauf bei, nicht für jeden Datenwert. Der folgende Code demonstriert dies.
Mit dieser Methode würde Ihr Arbeitsablauf wie folgt aussehen. Erstellen Sie für jedes Thema, Tag oder jede Seite ein Gleitkommafeld für die Gesamtzahl der Tage, die Summe der Ansichten und die Summe der Ansichten in Ihrer Datenbank. Wenn Sie historische Daten haben, initialisieren Sie diese Felder mit diesen Daten, andernfalls initialisieren Sie sie auf Null. Berechnen Sie am Ende eines jeden Tages den Z-Score anhand der Anzahl der Aufrufe des Tages anhand der in den drei Datenbankfeldern gespeicherten historischen Daten. Die Themen, Tags oder Seiten mit den höchsten X Z-Scores sind Ihre X "heißesten Trends" des Tages. Aktualisieren Sie abschließend jedes der 3 Felder mit dem Tageswert und wiederholen Sie den Vorgang morgen.
Neuer Zusatz
Normale Z-Scores, wie oben diskutiert, berücksichtigen nicht die Reihenfolge der Daten, und daher hätte der Z-Score für eine Beobachtung von '1' oder '9' gegenüber der Sequenz die gleiche Größe [1, 1, 1, 1 9, 9, 9, 9]. Offensichtlich sollten für die Trenderkennung die aktuellsten Daten mehr Gewicht haben als ältere Daten, und daher möchten wir, dass die '1'-Beobachtung eine größere Größenbewertung als die' 9'-Beobachtung hat. Um dies zu erreichen, schlage ich einen gleitenden durchschnittlichen Z-Score vor. Es sollte klar sein, dass diese Methode NICHT garantiert statistisch fundiert ist, sondern für die Trenderkennung oder ähnliches nützlich sein sollte. Der Hauptunterschied zwischen dem Standard-Z-Score und dem gleitenden Durchschnitt des Z-Scores besteht in der Verwendung eines gleitenden Durchschnitts zur Berechnung des durchschnittlichen Bevölkerungswerts und des durchschnittlichen quadratischen Bevölkerungswerts. Siehe Code für Details:
Code
Beispiel IO
Aktualisieren
Wie David Kemp richtig hervorhob, sollte das Ergebnis wahrscheinlich ungleich Null sein, wenn eine Reihe konstanter Werte und dann ein Z-Wert für einen beobachteten Wert angegeben werden, der sich von den anderen Werten unterscheidet. Tatsächlich sollte der zurückgegebene Wert unendlich sein. Also habe ich diese Zeile geändert,
zu:
Diese Änderung spiegelt sich im Code der Fazscore-Lösung wider. Wenn man sich nicht mit unendlichen Werten befassen möchte, könnte eine akzeptable Lösung darin bestehen, stattdessen die Zeile zu ändern in:
quelle
paste
Links scheinen nicht zu funktionieren ... danke!Sie benötigen einen Algorithmus, der die Geschwindigkeit eines Themas misst - oder mit anderen Worten, wenn Sie es grafisch darstellen, möchten Sie diejenigen anzeigen, die mit einer unglaublichen Geschwindigkeit steigen.
Dies ist die erste Ableitung der Trendlinie, und es ist nicht schwierig, sie als gewichteten Faktor in Ihre Gesamtberechnung einzubeziehen.
Normalisieren
Eine Technik, die Sie ausführen müssen, besteht darin, alle Ihre Daten zu normalisieren. Behalten Sie für jedes Thema, dem Sie folgen, einen Tiefpassfilter bei, der die Grundlinie dieses Themas definiert. Jetzt sollte jeder Datenpunkt, der zu diesem Thema eingeht, normalisiert werden. Subtrahieren Sie die Grundlinie, und Sie erhalten ALLE Ihre Themen in der Nähe von 0 mit Spitzen über und unter der Linie. Möglicherweise möchten Sie das Signal stattdessen durch seine Grundliniengröße teilen, wodurch das Signal auf etwa 1,0 gebracht wird. Dadurch werden nicht nur alle Signale miteinander in Einklang gebracht (normalisiert die Grundlinie), sondern auch die Spitzen normalisiert. Ein Britney-Spike wird größer sein als der Spike eines anderen, aber das bedeutet nicht, dass Sie darauf achten sollten - der Spike kann im Verhältnis zu ihrer Grundlinie sehr klein sein.
Ableiten
Wenn Sie alles normalisiert haben, ermitteln Sie die Steigung jedes Themas. Nehmen Sie zwei aufeinanderfolgende Punkte und messen Sie die Differenz. Ein positiver Unterschied ist im Aufwärtstrend, ein negativer Unterschied im Abwärtstrend. Anschließend können Sie die normalisierten Unterschiede vergleichen und herausfinden, welche Themen im Vergleich zu anderen Themen immer beliebter werden. Jedes Thema ist entsprechend seiner eigenen „Normalität“ skaliert, wobei sich die Größenordnungen möglicherweise von anderen Themen unterscheiden.
Dies ist wirklich ein erster Durchgang bei dem Problem. Es gibt fortgeschrittenere Techniken, die Sie verwenden müssen (meistens eine Kombination der oben genannten mit anderen Algorithmen, gewichtet nach Ihren Anforderungen), aber es sollte ausreichen, um Ihnen den Einstieg zu erleichtern.
Zum Artikel
In dem Artikel geht es um Themen-Trends, aber es geht nicht darum, zu berechnen, was aktuell ist und was nicht, sondern darum, wie viele Informationen verarbeitet werden müssen, die ein solcher Algorithmus an Orten wie Lycos und Google verarbeiten muss. Der Raum und die Zeit, die erforderlich sind, um jedem Thema einen Zähler zu geben und den Zähler jedes Themas zu finden, wenn eine Suche durchgeführt wird, sind enorm. In diesem Artikel geht es um die Herausforderungen, denen man beim Versuch einer solchen Aufgabe gegenübersteht. Der Brittney-Effekt wird zwar erwähnt, es wird jedoch nicht darüber gesprochen, wie er überwunden werden kann.
Wie Nixuz betont, wird dies auch als Z- oder Standard-Score bezeichnet .
quelle
Chad Birch und Adam Davis haben insofern Recht, als Sie zurückblicken müssen, um eine Basislinie zu erstellen. Ihre Frage deutet darauf hin, dass Sie nur Daten der letzten 24 Stunden anzeigen möchten, und das wird nicht ganz funktionieren.
Eine Möglichkeit, Ihren Daten Speicherplatz zu geben, ohne nach einer großen Anzahl historischer Daten fragen zu müssen, ist die Verwendung eines exponentiellen gleitenden Durchschnitts. Dies hat den Vorteil, dass Sie dies einmal pro Periode aktualisieren und dann alle alten Daten löschen können, sodass Sie sich nur einen einzigen Wert merken müssen. Wenn Ihre Periode also ein Tag ist, müssen Sie für jedes Thema ein Attribut "Tagesdurchschnitt" beibehalten. Dies können Sie tun, indem Sie:
Wo
a_n
ist der gleitende Durchschnitt ab Tagn
, b ist eine Konstante zwischen 0 und 1 (je näher an 1, desto länger der Speicher) undc_n
ist die Anzahl der Treffer am Tagn
. Das Schöne ist, wenn Sie dieses Update am Ende des Tages durchführenn
, können Sie spülenc_n
unda_(n-1)
.Die einzige Einschränkung ist, dass es anfangs empfindlich auf alles reagiert, was Sie für Ihren Anfangswert von auswählen
a
.BEARBEITEN
Wenn es diesen Ansatz zu visualisieren hilft, nehmen
n = 5
,a_0 = 1
undb = .9
.Angenommen, die neuen Werte sind 5,0,0,1,4:
Sieht nicht sehr nach einem Durchschnitt aus, oder? Beachten Sie, wie der Wert nahe 1 blieb, obwohl unsere nächste Eingabe 5 war. Was ist los? Wenn Sie die Mathematik erweitern, was bekommen Sie das:
Was meine ich mit Restgewicht? Nun, in jedem Durchschnitt müssen sich alle Gewichte zu 1 addieren. Wenn n unendlich wäre und das ... für immer weitergehen könnte, würden sich alle Gewichte zu 1 summieren. Wenn n jedoch relativ klein ist, bleibt eine gute Menge an Gewicht übrig auf dem ursprünglichen Eingang.
Wenn Sie die obige Formel studieren, sollten Sie einige Dinge über diese Verwendung erkennen:
Ich denke, die ersten beiden Merkmale sind genau das, wonach Sie suchen. Um Ihnen eine Vorstellung davon zu geben, wie einfach dies sein kann, ist dies eine Python-Implementierung (abzüglich der gesamten Datenbankinteraktion):
quelle
Typischerweise wird "Buzz" unter Verwendung eines Exponential- / Log-Zerfallsmechanismus herausgefunden. Eine Übersicht darüber, wie Hacker News, Reddit und andere auf einfache Weise damit umgehen, finden Sie in diesem Beitrag .
Dies spricht die Dinge, die immer beliebt sind, nicht vollständig an. Was Sie suchen, scheint so etwas wie Googles " Hot Trends " -Funktion zu sein. Dazu können Sie den aktuellen Wert durch einen historischen Wert teilen und dann diejenigen subtrahieren, die unterhalb einer Rauschschwelle liegen.
quelle
Ich denke, das Schlüsselwort, das Sie beachten müssen, ist "abnormal". Um festzustellen, wann etwas "abnormal" ist, müssen Sie wissen, was normal ist. Das heißt, Sie benötigen historische Daten, die Sie mitteln können, um die normale Rate einer bestimmten Abfrage zu ermitteln. Möglicherweise möchten Sie abnormale Tage von der Durchschnittsberechnung ausschließen. Dafür müssen jedoch bereits genügend Daten vorhanden sein, damit Sie wissen, welche Tage ausgeschlossen werden müssen.
Von dort aus müssen Sie einen Schwellenwert festlegen (was sicherlich Experimente erfordern würde). Wenn etwas außerhalb des Schwellenwerts liegt, z. B. 50% mehr Suchanfragen als normal, können Sie dies als "Trend" betrachten. Oder wenn Sie in der Lage sein möchten, die "Top X Trendiest" zu finden, wie Sie es erwähnt haben, müssen Sie die Dinge nur danach bestellen, wie weit (prozentual) sie von ihrer normalen Rate entfernt sind.
Nehmen wir zum Beispiel an, Ihre historischen Daten haben Ihnen mitgeteilt, dass Britney Spears normalerweise 100.000 Suchanfragen und Paris Hilton normalerweise 50.000 Suchanfragen erhält. Wenn Sie einen Tag haben, an dem beide 10.000 Suchanfragen mehr als normal erhalten, sollten Sie Paris als "heißer" als Britney betrachten, da ihre Suchanfragen um 20% höher waren als normal, während die von Britney nur 10% waren.
Gott, ich kann nicht glauben, dass ich gerade einen Absatz geschrieben habe, in dem die "Schärfe" von Britney Spears und Paris Hilton verglichen wird. Was hast du mit mir gemacht?
quelle
Ich habe mich gefragt, ob es in einem solchen Fall überhaupt möglich ist, eine reguläre Physikbeschleunigungsformel zu verwenden.
Wir können v1 als anfängliche Likes / Stimmen / Anzahl der Kommentare pro Stunde und v2 als aktuelle "Geschwindigkeit" pro Stunde in den letzten 24 Stunden betrachten.
Dies ist eher eine Frage als eine Antwort, aber es scheint, als würde es einfach funktionieren. Jeder Inhalt mit der höchsten Beschleunigung wird das Trendthema sein ...
Ich bin sicher, dass dies das Problem von Britney Spears nicht lösen kann :-)
quelle
v1
und einen sehr hohenv2
Wert benötigt , um als "Trend" zu gelten. Es gibt jedoch wahrscheinlich bessere und ausgefeiltere Formeln und Algorithmen, um dies zu tun. Trotzdem ist es ein grundlegendes Arbeitsbeispiel.wahrscheinlich würde ein einfacher Gradient der Themenhäufigkeit funktionieren - großer positiver Gradient = schnell wachsende Popularität.
Der einfachste Weg wäre, die Anzahl der gesuchten Personen pro Tag zu speichern, damit Sie so etwas haben
und dann herausfinden, wie sehr es sich von Tag zu Tag verändert hat:
und wenden Sie einfach eine Art Schwellenwert an, damit Tage, an denen der Anstieg> 50 war, als "heiß" betrachtet werden. Sie könnten dies auch viel komplizierter machen, wenn Sie möchten. Anstelle des absoluten Unterschieds können Sie den relativen Unterschied so nehmen, dass ein Wechsel von 100 auf 150 als heiß angesehen wird, 1000 auf 1050 jedoch nicht. oder ein komplizierterer Gradient, der Trends über mehr als nur einen Tag zum nächsten berücksichtigt.
quelle
Ich hatte an einem Projekt gearbeitet, bei dem mein Ziel darin bestand, Trendthemen aus dem Live-Twitter-Stream zu finden und auch sentimentale Analysen zu den Trendthemen durchzuführen (herauszufinden, ob über Trendthemen positiv / negativ gesprochen wurde). Ich habe Storm für den Umgang mit Twitter-Streams verwendet.
Ich habe meinen Bericht als Blog veröffentlicht: http://sayrohan.blogspot.com/2013/06/finding-trending-topics-and-trending.html
Ich habe Total Count und Z-Score für das Ranking verwendet.
Der Ansatz, den ich verwendet habe, ist etwas allgemein gehalten, und im Diskussionsteil habe ich erwähnt, wie wir das System für Nicht-Twitter-Anwendungen erweitern können.
Hoffe die Informationen helfen.
quelle
Wenn Sie sich einfach Tweets oder Statusmeldungen ansehen, um Ihre Themen zu erhalten, werden Sie auf viel Lärm stoßen. Auch wenn Sie alle Stoppwörter entfernen. Eine Möglichkeit, eine bessere Untergruppe von Themenkandidaten zu erhalten, besteht darin, sich nur auf Tweets / Nachrichten zu konzentrieren, die eine URL gemeinsam haben, und die Schlüsselwörter aus dem Titel dieser Webseiten abzurufen. Und stellen Sie sicher, dass Sie POS-Tagging anwenden, um auch Substantive + Nominalphrasen zu erhalten.
Titel von Webseiten sind normalerweise aussagekräftiger und enthalten Wörter, die beschreiben, worum es auf der Seite geht. Darüber hinaus ist das Teilen einer Webseite normalerweise mit dem Teilen aktueller Nachrichten verbunden (dh wenn eine Berühmtheit wie Michael Jackson gestorben ist, werden viele Leute einen Artikel über seinen Tod teilen).
Ich habe Experimente durchgeführt, bei denen ich nur beliebte Schlüsselwörter aus Titeln nehme UND dann die Gesamtzahl dieser Schlüsselwörter über alle Statusmeldungen hinweg erhalte, und sie entfernen definitiv viel Rauschen. Wenn Sie dies auf diese Weise tun, benötigen Sie keinen komplexen Algorithmus. Führen Sie einfach eine einfache Reihenfolge der Keyword-Häufigkeiten durch, und schon sind Sie auf halbem Weg.
quelle
Sie können Log-Likelihood-Verhältnisse verwenden, um das aktuelle Datum mit dem letzten Monat oder Jahr zu vergleichen. Dies ist statistisch fundiert (da Ihre Ereignisse nicht normal verteilt sind, was aus Ihrer Frage hervorgeht).
Sortieren Sie einfach alle Ihre Begriffe nach logLR und wählen Sie die Top Ten aus.
PS, ein TermBag ist eine ungeordnete Sammlung von Wörtern. Für jedes Dokument erstellen Sie eine Tasche mit Begriffen. Zählen Sie einfach das Vorkommen von Wörtern. Dann gibt die Methode
occurrences
die Anzahl der Vorkommen eines bestimmten Wortes zurück, und die Methodesize
gibt die Gesamtzahl der Wörter zurück. Es ist am besten, die Wörter irgendwie zu normalisieren, normalerweisetoLowerCase
ist es gut genug. In den obigen Beispielen würden Sie natürlich ein Dokument mit allen Abfragen von heute und eines mit allen Abfragen des letzten Jahres erstellen.quelle
Die Idee ist, solche Dinge im Auge zu behalten und zu bemerken, wenn sie im Vergleich zu ihrer eigenen Basislinie signifikant springen.
Verfolgen Sie also bei Abfragen, die mehr als einen bestimmten Schwellenwert haben, jeden einzelnen. Wenn sich der historische Wert auf einen Wert (z. B. fast das Doppelte) ändert, handelt es sich um einen neuen Trend.
quelle