Wiele stron oferuje statystyki takie jak „Najgorętsze tematy w ciągu ostatnich 24 godzin”. Na przykład Topix.com pokazuje to w sekcji „Trendy informacyjne”. Tam możesz zobaczyć tematy, które mają najszybciej rosnącą liczbę wzmianek.
Chcę też obliczyć taki „szum” dla tematu. Jak mogłem to zrobić? Algorytm powinien ważyć tematy, które zawsze są mniej popularne. Tematy, o których normalnie (prawie) nikt nie wspomina, powinny być najgorętsze.
Google oferuje „Gorące trendy”, topix.com pokazuje „Gorące tematy”, fav.or.it pokazuje „Trendy słów kluczowych” - wszystkie te usługi mają jedną wspólną cechę: pokazują tylko nadchodzące trendy, które są obecnie niezwykle gorące.
Terminy takie jak „Britney Spears”, „pogoda” lub „Paris Hilton” nie pojawią się na tych listach, ponieważ zawsze są gorące i częste. Artykuł nazywa to „problemem Britney Spears”.
Moje pytanie: jak możesz kodować algorytm lub użyć istniejącego, aby rozwiązać ten problem? Mając listę ze słowami kluczowymi wyszukanymi w ciągu ostatnich 24 godzin, algorytm powinien pokazać Ci 10 (na przykład) najgorętszych.
Wiem, że w powyższym artykule wymieniono jakiś algorytm. Próbowałem napisać kod w PHP, ale nie sądzę, że zadziała. Po prostu znajduje większość, prawda?
Mam nadzieję, że możesz mi pomóc (przykłady kodowania byłyby świetne).
źródło
Odpowiedzi:
Ten problem wymaga wyniku z-score lub standardowego, który weźmie pod uwagę średnią historyczną, jak wspomnieli inni ludzie, ale także standardowe odchylenie tych danych historycznych, co czyni ją bardziej niezawodną niż zwykłe stosowanie średniej.
W twoim przypadku wynik Z obliczany jest według następującego wzoru, w którym trendem będzie wskaźnik, taki jak liczba wyświetleń / dzień.
Gdy stosuje się wynik Z, im wyższy lub niższy wynik Z, tym bardziej nienormalny jest trend, więc na przykład, jeśli wynik Z jest bardzo pozytywny, to trend rośnie nienormalnie, a jeśli jest wysoce ujemny, to nienormalnie spada . Tak więc po obliczeniu wyniku Z dla wszystkich trendów kandydujących najwyższe 10 punktów Z odniesie się do najbardziej nienormalnie rosnących wyników Z.
Więcej informacji na temat wyników Z można znaleźć na Wikipedii .
Kod
Przykładowe dane wyjściowe
Notatki
Możesz użyć tej metody z przesuwanym oknem (tj. Z ostatnich 30 dni), jeśli nie chcesz brać pod uwagę zbyt dużej historii, co sprawi, że trendy krótkoterminowe będą bardziej wyraźne i mogą skrócić czas przetwarzania.
Możesz również użyć wyniku Z dla wartości takich jak zmiana wyświetleń z jednego dnia na następny dzień, aby zlokalizować nieprawidłowe wartości zwiększania / zmniejszania wyświetleń dziennie. To jest jak użycie nachylenia lub pochodnej wykresów na dzień.
Jeśli śledzisz bieżącą wielkość populacji, bieżącą sumę populacji i bieżącą sumę x ^ 2 populacji, nie musisz ponownie obliczać tych wartości, tylko je aktualizować, a zatem musisz tylko zachowaj te wartości dla historii, nie dla każdej wartości danych. Poniższy kod to pokazuje.
Dzięki tej metodzie przepływ pracy wyglądałby następująco. Dla każdego tematu, znacznika lub strony utwórz zmiennoprzecinkowe pole dla całkowitej liczby dni, sumy wyświetleń i sumy wyświetleń w bazie danych. Jeśli masz dane historyczne, zainicjuj te pola przy użyciu tych danych, w przeciwnym razie zainicjuj do zera. Na koniec każdego dnia oblicz wynik Z na podstawie liczby wyświetleń w danym dniu w porównaniu do danych historycznych przechowywanych w trzech polach bazy danych. Tematy, tagi lub strony z najwyższymi wynikami X-Z to Twoje „najgorętsze trendy” dnia. Na koniec zaktualizuj każde z 3 pól wartością dnia i powtórz proces jutro.
Nowy dodatek
Normalne wyniki Z, jak omówiono powyżej, nie uwzględniają kolejności danych, a zatem wynik Z dla obserwacji „1” lub „9” miałby taką samą wielkość w stosunku do sekwencji [1, 1, 1, 1 , 9, 9, 9, 9]. Oczywiście w celu znalezienia trendów najbardziej aktualne dane powinny mieć większą wagę niż starsze dane, dlatego chcemy, aby obserwacja „1” miała większy wynik jasności niż obserwacja „9”. Aby to osiągnąć, proponuję zmienną średnią z-score. Powinno być jasne, że ta metoda NIE jest gwarantowana pod względem statystycznym, ale powinna być użyteczna do znajdowania trendów lub podobnych. Główną różnicą między standardowym wynikiem Z i zmienną średnią oceną Z jest zastosowanie zmiennej ruchomej do obliczenia średniej wartości populacji i kwadratowej średniej wartości populacji. Szczegóły w kodzie:
Kod
Próbka IO
Aktualizacja
Jak słusznie zauważył David Kemp, jeśli otrzyma się ciąg stałych wartości, a następnie zscore dla obserwowanej wartości, która różni się od innych wartości, wynik powinien być prawdopodobnie niezerowy. W rzeczywistości zwracana wartość powinna być nieskończonością. Więc zmieniłem tę linię,
do:
Ta zmiana znajduje odzwierciedlenie w kodzie rozwiązania fazscore. Jeśli nie chcesz zajmować się nieskończonymi wartościami, akceptowalnym rozwiązaniem może być zmiana linii na:
źródło
paste
linki nie wydają się działać ... dzięki!Potrzebujesz algorytmu, który mierzy prędkość tematu - lub innymi słowy, jeśli go wykreślisz, chcesz pokazać te, które idą w niewiarygodnym tempie.
Jest to pierwsza pochodna linii trendu i nie jest trudna do włączenia jako ważonego czynnika w twoich ogólnych obliczeniach.
Normalizować
Jedną z technik, którą musisz wykonać, jest normalizacja wszystkich danych. Dla każdego śledzonego tematu utrzymuj filtr dolnoprzepustowy, który określa linię bazową tego tematu. Teraz każdy punkt danych, który pojawia się na ten temat, powinien zostać znormalizowany - odejmij jego linię bazową, a otrzymasz WSZYSTKIE swoje tematy w pobliżu 0, z pikami powyżej i poniżej linii. Zamiast tego możesz podzielić sygnał przez jego wartość bazową, co doprowadzi sygnał do około 1,0 - to nie tylko zrównuje wszystkie sygnały ze sobą (normalizuje linię bazową), ale także normalizuje skoki. Skok britney będzie większy od skoku kogoś innego, ale to nie znaczy, że powinieneś zwrócić na to uwagę - skok może być bardzo mały w stosunku do jej linii bazowej.
Czerpać
Gdy wszystko znormalizujesz, ustal nachylenie każdego tematu. Weź dwa kolejne punkty i zmierz różnicę. Dodatnia różnica rośnie w górę, ujemna różnica spada. Następnie możesz porównać znormalizowane różnice i dowiedzieć się, które tematy zwiększają popularność w porównaniu do innych tematów - z każdym tematem skalowanym odpowiednio do jego własnej „normalności”, która może być wielkości rzędu innej niż inne tematy.
To naprawdę pierwszy krok do rozwiązania problemu. Istnieją bardziej zaawansowane techniki, których będziesz potrzebować (głównie połączenie powyższych z innymi algorytmami, dostosowanymi do twoich potrzeb), ale powinno wystarczyć, aby zacząć.
Odnośnie artykułu
Artykuł dotyczy trendów w temacie, ale nie chodzi o to, jak obliczyć, co jest gorące, a co nie, chodzi o to, jak przetworzyć ogromną ilość informacji, które taki algorytm musi przetworzyć w miejscach takich jak Lycos i Google. Przestrzeń i czas wymagany do nadania każdemu tematowi licznika i znalezienia licznika każdego tematu, gdy trwa wyszukiwanie, jest ogromny. Ten artykuł dotyczy wyzwań, jakie stoją przed podjęciem takiego zadania. Wspomina o efekcie Brittneya, ale nie mówi o tym, jak go pokonać.
Jak zauważa Nixuz, jest to również określane jako Z lub Standard Score .
źródło
Chad Birch i Adam Davis mają rację, ponieważ trzeba będzie spojrzeć wstecz, aby ustalić linię bazową. Twoje pytanie, jak zostało sformułowane, sugeruje, że chcesz tylko przeglądać dane z ostatnich 24 godzin, a to nie całkiem latać.
Jednym ze sposobów na zapewnienie pamięci danych bez konieczności wyszukiwania dużej ilości danych historycznych jest zastosowanie wykładniczej średniej ruchomej. Zaletą tego jest to, że możesz aktualizować to raz na okres, a następnie wyczyścić wszystkie stare dane, więc musisz zapamiętać tylko jedną wartość. Więc jeśli twój okres to dzień, musisz zachować atrybut „średniej dziennej” dla każdego tematu, co możesz zrobić poprzez:
Gdzie
a_n
średnia ruchoma na dzieńn
, b jest stałą stałą między 0 a 1 (im bliżej 1, tym dłuższa pamięć) ic_n
jest liczbą trafień w ciągu dnian
. Piękno polega na tym, że jeśli wykonasz tę aktualizację pod koniec dnian
, możesz spłukaćc_n
ia_(n-1)
.Jedynym zastrzeżeniem jest to, że początkowo będzie wrażliwy na wszystko, co wybierzesz dla swojej początkowej wartości
a
.EDYTOWAĆ
Jeśli to pomaga wizualizować to podejście, brać
n = 5
,a_0 = 1
ib = .9
.Powiedzmy, że nowe wartości to 5,0,0,1,4:
Czy to nie wygląda na przeciętne? Zwróć uwagę, jak wartość pozostała blisko 1, mimo że naszym następnym wejściem było 5. Co się dzieje? Jeśli rozszerzysz matematykę, co otrzymasz:
Co mam na myśli przez pozostałą wagę? Cóż, w każdym uśrednieniu, wszystkie ciężary muszą dodać się do 1. Gdyby n było nieskończonością, a ... mogłoby trwać wiecznie, to wszystkie ciężary sumowałyby się do 1. Ale jeśli n jest względnie małe, pozostawia się dobrą ilość masy na oryginalnym wejściu.
Jeśli przestudiujesz powyższą formułę, powinieneś zdać sobie sprawę z kilku rzeczy na temat tego użycia:
Myślę, że dwie pierwsze cechy są dokładnie tym, czego szukasz. Aby dać ci wyobrażenie o prostocie, możesz to zaimplementować, oto implementacja python (minus cała interakcja z bazą danych):
źródło
Zazwyczaj „brzęczenie” jest określane za pomocą jakiejś formy mechanizmu rozkładu wykładniczego / logarytmicznego. Aby zapoznać się z tym, jak Hacker News, Reddit i inni radzą sobie z tym w prosty sposób, zobacz ten post .
Nie dotyczy to w pełni rzeczy, które są zawsze popularne. To, czego szukasz, wydaje się być czymś w rodzaju „ gorących trendów ” Google . W tym celu można podzielić bieżącą wartość przez wartość historyczną, a następnie odjąć te, które są poniżej pewnego progu hałasu.
źródło
Myślę, że kluczowym słowem, które należy zauważyć, jest „nienormalnie”. Aby ustalić, kiedy coś jest „nienormalne”, musisz wiedzieć, co jest normalne. Oznacza to, że będziesz potrzebować danych historycznych, które możesz uśrednić, aby znaleźć normalną stawkę dla konkretnego zapytania. Możesz wykluczyć nieprawidłowe dni z obliczeń uśredniania, ale znowu będzie to wymagało posiadania wystarczającej ilości danych, abyś wiedział, które dni należy wykluczyć.
Stamtąd będziesz musiał ustawić próg (jestem pewien, że wymagałoby to eksperymentów), a jeśli coś wykroczy poza próg, powiedz o 50% więcej wyszukiwań niż normalnie, możesz uznać to za „trend”. Lub, jeśli chcesz znaleźć „Top X najmodniejszych”, jak wspomniałeś, musisz tylko uporządkować rzeczy według odległości (procentowej) od ich normalnej stawki.
Załóżmy na przykład, że z twoich danych historycznych wynika, że Britney Spears zwykle uzyskuje 100 000 wyszukiwań, a Paris Hilton zwykle 50 000. Jeśli masz dzień, w którym oboje uzyskują 10 000 więcej wyszukiwań niż normalnie, powinieneś rozważyć Paryż „gorętszy” niż Britney, ponieważ jej wyszukiwania wzrosły o 20% więcej niż normalnie, podczas gdy Britney było tylko 10%.
Boże, nie mogę uwierzyć, że właśnie napisałem akapit porównujący „upał” Britney Spears i Paris Hilton. Co mi zrobiłeś?
źródło
Zastanawiałem się, czy w takim przypadku można w ogóle zastosować zwykłą formułę przyspieszenia fizyki?
Możemy uznać v1 za początkowe polubienia / głosy / liczbę komentarzy na godzinę, a v2 za bieżącą „prędkość” na godzinę w ciągu ostatnich 24 godzin?
To bardziej przypomina pytanie niż odpowiedź, ale wydaje się, że może po prostu działać. Najpopularniejsze będą treści o najwyższym przyspieszeniu ...
Jestem pewien, że to może nie rozwiązać problemu Britney Spears :-)
źródło
v1
i potrzebuje bardzo wysokiego,v2
aby można go było uznać za „trendy”. Jednak istnieją do tego prawdopodobnie lepsze i bardziej wyrafinowane formuły i algorytmy. Niemniej jest to podstawowy przykład działania.prawdopodobnie zadziałałby prosty gradient częstotliwości tematów - duży gradient dodatni = szybko rosnąca popularność.
najłatwiejszym sposobem jest zbieranie liczby wyszukiwań każdego dnia, więc masz coś takiego
a następnie dowiedz się, jak bardzo zmieniło się z dnia na dzień:
i po prostu zastosuj jakiś próg, aby dni, w których wzrost był> 50, były uważane za „gorące”. możesz to jeszcze bardziej skomplikować, jeśli chcesz. zamiast bezwzględnej różnicy możesz wziąć różnicę względną, tak że przejście od 100 do 150 jest uważane za gorące, ale od 1000 do 1050 nie. lub bardziej skomplikowany gradient, który uwzględnia trendy w ciągu więcej niż jednego dnia.
źródło
Pracowałem nad projektem, w którym moim celem było znalezienie popularnych tematów z Live Twitter Stream, a także przeprowadzenie analizy sentymentalnej na temat popularnych trendów (ustalenie, czy temat ten był pozytywny / negatywny). Użyłem Storm do obsługi strumienia Twittera.
Mój raport opublikowałem jako blog: http://sayrohan.blogspot.com/2013/06/finding-trending-topics-and-trending.html
Do rankingu wykorzystałem Total Count i Z-Score.
Podejście, które zastosowałem, jest nieco ogólne, aw sekcji dyskusji wspomniałem, w jaki sposób możemy rozszerzyć system dla aplikacji innych niż Twitter.
Mam nadzieję, że informacje pomogą.
źródło
Jeśli po prostu spojrzysz na tweety lub komunikaty o stanie, aby uzyskać dostęp do swoich tematów, napotkasz dużo hałasu. Nawet jeśli usuniesz wszystkie słowa stop. Jednym ze sposobów uzyskania lepszego podzbioru kandydatów do tematu jest skupienie się tylko na tweetach / wiadomościach, które mają wspólny adres URL, i uzyskanie słów kluczowych z tytułu tych stron internetowych. I upewnij się, że stosujesz tagowanie POS, aby uzyskać także rzeczowniki i wyrażenia rzeczownikowe.
Tytuły stron internetowych są zazwyczaj bardziej opisowe i zawierają słowa opisujące treść strony. Ponadto udostępnianie strony internetowej jest zwykle skorelowane z dzieleniem się nowymi wiadomościami (np. Jeśli umrze celebrytka taka jak Michael Jackson, wielu ludzi udostępni artykuł na temat jego śmierci).
Przeprowadziłem eksperymenty, w których pobieram tylko popularne słowa kluczowe z tytułów, a następnie uzyskuję całkowitą liczbę tych słów kluczowych we wszystkich komunikatach o stanie i zdecydowanie usuwają dużo hałasu. Jeśli zrobisz to w ten sposób, nie potrzebujesz skomplikowanego algorytmu, po prostu zrób proste uporządkowanie częstotliwości słów kluczowych i jesteś w połowie drogi.
źródło
Możesz użyć współczynników wiarygodności do porównania bieżącej daty z ostatnim miesiącem lub rokiem. Jest to poprawne statystycznie (biorąc pod uwagę, że wydarzenia nie są normalnie dystrybuowane, co należy założyć na podstawie pytania).
Po prostu posortuj wszystkie warunki według logLR i wybierz pierwszą dziesiątkę.
PS, TermBag to nieuporządkowany zbiór słów. Dla każdego dokumentu tworzysz jedną torbę terminów. Po prostu policz wystąpienia słów. Następnie metoda
occurrences
zwraca liczbę wystąpień danego słowa, a metodasize
zwraca całkowitą liczbę słów. Najlepiej jakoś znormalizować słowa, zwykletoLowerCase
wystarcza. Oczywiście w powyższych przykładach utworzyłbyś jeden dokument ze wszystkimi zapytaniami z dnia dzisiejszego i jeden ze wszystkimi zapytaniami z ostatniego roku.źródło
Chodzi o to, aby śledzić takie rzeczy i zauważać, kiedy skaczą znacznie w porównaniu z własną linią bazową.
Tak więc, w przypadku zapytań, które mają więcej niż pewien próg, należy śledzić każde, a gdy zmienia się ono na pewną wartość (powiedzmy prawie dwukrotnie) swojej wartości historycznej, jest to nowy gorący trend.
źródło