Многие сайты предлагают некоторую статистику, например «Самые горячие темы за последние 24 часа». Например, Topix.com показывает это в разделе «Тенденции новостей». Там вы можете увидеть темы, которые имеют наиболее быстро растущее число упоминаний.
Я хочу вычислить такой "шум" и для темы. Как я мог это сделать? Алгоритм должен взвешивать темы, которые всегда менее горячие. Темы, которые обычно (почти) никто не упоминает, должны быть самыми горячими.
Google предлагает «Горячие тренды», topix.com показывает «Горячие темы», fav.or.it показывает «Тенденции ключевых слов» - у всех этих сервисов есть одна общая черта: они показывают только будущие тренды, которые в настоящий момент необычайно горячие.
Такие термины, как «Бритни Спирс», «погода» или «Пэрис Хилтон», не появятся в этих списках, потому что они всегда горячие и частые. Эта статья называет это «Проблема Бритни Спирс».
Мой вопрос: как вы можете написать алгоритм или использовать существующий для решения этой проблемы? Имея список с ключевыми словами, которые искали за последние 24 часа, алгоритм должен показать вам 10 (например) самых горячих.
Я знаю, что в вышеприведенной статье упоминается какой-то алгоритм. Я пытался закодировать это в PHP, но я не думаю, что это будет работать. Это просто находит большинство, не так ли?
Я надеюсь, что вы можете мне помочь (примеры кодирования были бы хорошими).
источник
Ответы:
Эта проблема требует z-показателя или стандартного значения, которое будет учитывать среднее историческое значение, как упоминали другие люди, а также стандартное отклонение этих исторических данных, что делает его более надежным, чем просто использование среднего значения.
В вашем случае z-показатель рассчитывается по следующей формуле, где трендом будет показатель, например, количество просмотров в день.
Когда используется z-оценка, чем выше или ниже z-оценка, тем ненормальнее тренд, например, если z-оценка является очень положительной, тогда тенденция ненормально возрастает, в то время как если она сильно отрицательная, она ненормально падает , Поэтому, как только вы вычислите z-показатель для всех возможных тенденций, самые высокие 10-значные значения будут относиться к наиболее ненормально увеличивающимся z-показателям.
Пожалуйста, смотрите Википедию для получения дополнительной информации о z-показателях.
Код
Пример вывода
Ноты
Вы можете использовать этот метод со скользящим окном (т. Е. Последние 30 дней), если вы не хотите учитывать слишком много истории, что сделает краткосрочные тренды более выраженными и может сократить время обработки.
Вы также можете использовать z-показатель для значений, таких как изменение просмотров с одного дня на следующий день, чтобы найти ненормальные значения для увеличения / уменьшения просмотров в день. Это похоже на использование наклона или производной графика просмотров за день.
Если вы отслеживаете текущий размер населения, текущий итог населения и текущий итог x ^ 2 населения, вам не нужно пересчитывать эти значения, только обновлять их и, следовательно, вам нужно только сохраните эти значения для истории, а не для каждого значения данных. Следующий код демонстрирует это.
Используя этот метод, ваш рабочий процесс будет следующим. Для каждой темы, тега или страницы создайте поле с плавающей запятой для общего количества дней, суммы просмотров и суммы просмотров в квадрате в вашей базе данных. Если у вас есть исторические данные, инициализируйте эти поля, используя эти данные, в противном случае инициализируйте в ноль. В конце каждого дня рассчитайте z-показатель, используя количество просмотров за день по историческим данным, хранящимся в трех полях базы данных. Темы, теги или страницы с самыми высокими X z-показателями - это ваши «самые горячие тренды» дня. Наконец, обновите каждое из 3 полей значением дня и повторите процедуру завтра.
Новое дополнение
Нормальные z-оценки, как обсуждалось выше, не учитывают порядок данных, и, следовательно, z-оценка для наблюдения «1» или «9» будет иметь такую же величину относительно последовательности [1, 1, 1, 1 , 9, 9, 9, 9]. Очевидно, что для определения тренда самые последние данные должны иметь больший вес, чем более старые данные, и поэтому мы хотим, чтобы наблюдение «1» имело больший показатель магнитуды, чем наблюдение «9». Чтобы достичь этого, я предлагаю плавающий средний z-счет. Должно быть ясно, что этот метод НЕ гарантированно является статистически надежным, но должен быть полезен для поиска тренда или аналогичного. Основное различие между стандартным z-показателем и плавающим средним z-показателем заключается в использовании плавающего среднего для вычисления среднего значения популяции и квадрата среднего значения популяции. Смотрите код для деталей:
Код
Образец ввода-вывода
Обновить
Как правильно указал Дэвид Кемп, если задан ряд постоянных значений, а затем запрашивается zscore для наблюдаемого значения, которое отличается от других значений, результат, вероятно, должен быть ненулевым. На самом деле возвращаемое значение должно быть бесконечностью. Так что я изменил эту строку,
чтобы:
Это изменение отражено в коде решения fazscore. Если кто-то не хочет иметь дело с бесконечными значениями, приемлемым решением было бы вместо этого изменить строку на:
источник
paste
кажется , ссылки не работают ... спасибо!Вам нужен алгоритм, который измеряет скорость темы - или, другими словами, если вы отображаете график, вы хотите показать те, которые растут с невероятной скоростью.
Это первая производная от линии тренда, и ее нетрудно включить в качестве взвешенного фактора вашего общего расчета.
Нормализовать
Один из методов, который вам нужно сделать, это нормализовать все ваши данные. Для каждой темы, которую вы читаете, сохраняйте фильтр низких частот, который определяет базовый уровень этой темы. Теперь каждая точка данных, которая приходит по этой теме, должна быть нормализована - вычтите ее базовый уровень, и вы получите ВСЕ ваши темы около 0, с пиками выше и ниже линии. Вместо этого вы можете разделить сигнал на его базовую величину, что приведет к тому, что сигнал приблизится к 1,0 - это не только приведет все сигналы в соответствие друг с другом (нормализует базовую линию), но также нормализует пики. Пик Бритни будет на величины больше, чем у кого-то другого, но это не значит, что вы должны обратить на него внимание - шип может быть очень маленьким по сравнению с ее исходным уровнем.
Выведите
Как только вы все нормализуете, определите наклон каждой темы. Возьмите два последовательных пункта и измерьте разницу. Положительная разница имеет тенденцию к росту, отрицательная разница имеет тенденцию к снижению. Затем вы можете сравнить нормализованные различия и выяснить, какие темы становятся все более популярными по сравнению с другими темами, причем каждая тема масштабируется в соответствии со своим «нормальным» значением, которое может быть величиной порядка, отличного от других тем.
Это действительно первый подход к проблеме. Существуют более продвинутые методы, которые вам нужно использовать (в основном это комбинация вышеупомянутых с другими алгоритмами, взвешенными в соответствии с вашими потребностями), но этого должно быть достаточно для начала работы.
По поводу статьи
Статья посвящена теме трендов, но не о том, как рассчитать, что горячо, а что нет, а о том, как обрабатывать огромное количество информации, которую такой алгоритм должен обрабатывать в таких местах, как Lycos и Google. Пространство и время, необходимое для задания счетчика каждой темы и поиска счетчика каждой темы при поиске по ней, огромны. Эта статья о проблемах, с которыми приходится сталкиваться при попытке выполнить такую задачу. В нем упоминается эффект Бритни, но не говорится о том, как его преодолеть.
Как указывает Никсуз, это также называется Z или стандартным счетом .
источник
Чад Бёрч и Адам Дэвис правы в том, что вам придется оглянуться назад, чтобы установить исходный уровень. Ваш вопрос, как сформулировано, говорит о том, что вы хотите просматривать данные только за последние 24 часа, и это не совсем так.
Один из способов дать вашим данным немного памяти без необходимости запрашивать большой массив исторических данных - это использовать экспоненциальное скользящее среднее. Преимущество этого заключается в том, что вы можете обновлять его один раз за период, а затем сбрасывать все старые данные, поэтому вам нужно запомнить только одно значение. Поэтому, если ваш период - день, вы должны поддерживать атрибут «среднедневное» для каждой темы, что вы можете сделать следующим образом:
Где
a_n
скользящее среднее по состоянию на деньn
, b - это некоторая постоянная между 0 и 1 (чем ближе к 1, тем дольше память) иc_n
является количеством обращений за деньn
. Прелесть в том, что если вы выполните это обновление в конце дняn
, вы можете очиститьc_n
иa_(n-1)
.Единственное предостережение в том, что изначально оно будет чувствительным к тому, что вы выберете для своего начального значения
a
.РЕДАКТИРОВАТЬ
Если это помогает визуализировать этот подход, принять
n = 5
,a_0 = 1
иb = .9
.Допустим, новые значения 5,0,0,1,4:
Разве это не очень похоже на среднее? Обратите внимание, что значение оставалось близким к 1, даже если наш следующий ввод был 5. Что происходит? Если вы расширите математику, что вы получите, что:
Что я имею в виду под оставшимся весом? Ну, в любом среднем, все веса должны быть добавлены к 1. Если бы n было бесконечностью, а ... могло продолжаться вечно, то все веса были бы равны 1. Но если n относительно мало, вы получите хорошее количество оставшегося веса на оригинальном входе.
Если вы изучите приведенную выше формулу, вы должны понять несколько вещей об этом использовании:
Я думаю, что первые две характеристики именно то, что вы ищете. Чтобы дать вам представление о простоте, это можно реализовать, вот реализация Python (за вычетом всего взаимодействия с базой данных):
источник
Обычно "жужжание" вычисляется с использованием некоторой формы механизма экспоненциального / логарифмического затухания. Для обзора того, как Hacker News, Reddit и другие справляются с этим простым способом, см. Этот пост .
Это не в полной мере относится к вещам, которые всегда популярны. То, что вы ищете, похоже на функцию « горячих трендов » Google . Для этого вы можете разделить текущее значение на историческое значение, а затем вычесть значения, которые ниже некоторого порога шума.
источник
Я думаю, что ключевое слово, которое вы должны заметить, это «ненормально». Чтобы определить, когда что-то «ненормально», вы должны знать, что является нормальным. То есть вам понадобятся исторические данные, которые вы можете усреднить, чтобы узнать нормальную частоту конкретного запроса. Возможно, вы захотите исключить ненормальные дни из расчета усреднения, но опять же, для этого потребуется наличие достаточного количества данных, чтобы вы знали, какие дни исключить.
Оттуда вам нужно будет установить порог (который, я уверен, потребует экспериментов), и если что-то выходит за порог, скажем, на 50% больше запросов, чем обычно, вы можете считать это «тенденцией». Или, если вы хотите найти «Top X Trendiest», как вы упомянули, вам просто нужно упорядочить вещи по тому, насколько (в процентном отношении) они отличаются от своей обычной нормы.
Например, предположим, что ваши исторические данные говорят вам, что Бритни Спирс обычно получает 100 000 запросов, а Пэрис Хилтон - 50 000. Если у вас есть день, когда они оба получают на 10 000 больше запросов, чем обычно, вы должны считать Париж «более горячим», чем Бритни, потому что ее поиски увеличились на 20% больше, чем обычно, в то время как у Бритни было только 10%.
Боже, я не могу поверить, что я только что написал параграф, сравнивающий "жаркость" Бритни Спирс и Пэрис Хилтон. Что ты со мной сделал?
источник
Мне было интересно, можно ли вообще использовать обычную формулу ускорения физики в таком случае?
Мы можем считать v1 начальными лайками / голосами / количеством комментариев в час, а v2 - текущей скоростью в час за последние 24 часа?
Это больше похоже на вопрос, чем на ответ, но, похоже, это может сработать. Любой контент с самым высоким ускорением будет самой популярной темой ...
Я уверен, что это может не решить проблему Бритни Спирс :-)
источник
v1
и должен былv2
бы быть очень высоким, чтобы считаться «трендовым». Однако, вероятно, для этого есть более совершенные и сложные формулы и алгоритмы. Тем не менее, это основной рабочий пример.возможно, подойдет простой градиент частоты темы - большой положительный градиент = популярность быстро растет.
Самый простой способ - это каждый день проверять количество поисковых запросов, чтобы у вас было что-то вроде
а затем выясните, насколько это изменилось со дня на день:
и просто примените некоторый порог, чтобы дни, когда увеличение было> 50, считались «горячими». Вы могли бы сделать это намного сложнее, если хотите. вместо абсолютной разницы вы можете взять относительную разницу, чтобы переход от 100 до 150 считался горячим, а от 1000 до 1050 - нет. или более сложный градиент, который учитывает тенденции за более чем один день до следующего.
источник
Я работал над проектом, где моей целью было найти Тенденции в Живом Твиттере, а также проводить сентиментальный анализ по актуальным темам (найти, обсуждала ли Тенденция Тема положительно / отрицательно). Я использовал Storm для обработки твиттера.
Я опубликовал свой отчет в виде блога: http://sayrohan.blogspot.com/2013/06/finding-trending-topics-and-trending.html
Я использовал Total Count и Z-Score для рейтинга.
Подход, который я использовал, немного общий, и в разделе обсуждения я упомянул, как мы можем расширить систему для приложений, не относящихся к Твиттеру.
Надеюсь, что информация помогает.
источник
Если вы просто просматриваете твиты или сообщения о статусе, чтобы получить ваши темы, вы столкнетесь с большим шумом. Даже если вы удалите все стоп-слова. Один из способов получить лучшее подмножество кандидатов в темы - это сосредоточиться только на твитах / сообщениях с общим URL-адресом и получить ключевые слова из заголовка этих веб-страниц. И убедитесь, что вы применяете POS-теги, чтобы получить также существительные + существительные.
Названия веб-страниц обычно являются более описательными и содержат слова, которые описывают, о чем эта страница. Кроме того, совместное использование веб-страницы обычно связано с обменом новостями, которые являются критическими (т. Е. В случае смерти такой знаменитости, как Майкл Джексон, вы получите множество людей, которые поделятся статьей о его смерти).
Я провел эксперименты, в которых я беру только популярные ключевые слова из заголовков, а затем получаю общее количество этих ключевых слов во всех сообщениях о статусе, и они определенно устраняют много шума. Если вы делаете это таким образом, вам не нужен сложный алгоритм, достаточно просто упорядочить частоты ключевых слов, и вы на полпути.
источник
Вы можете использовать логарифмические отношения правдоподобия, чтобы сравнить текущую дату с прошлым месяцем или годом. Это статистически обоснованно (учитывая, что ваши события обычно не распространяются, что следует из вашего вопроса).
Просто отсортируйте все условия по logLR и выберите первую десятку.
PS, TermBag - это неупорядоченная коллекция слов. Для каждого документа вы создаете один пакет терминов. Просто посчитай вхождения слов. Затем метод
occurrences
возвращает количество вхождений данного слова, а методsize
возвращает общее количество слов. Лучше всего как-нибудь нормализовать слова, обычноtoLowerCase
это достаточно хорошо. Конечно, в приведенных выше примерах вы создадите один документ со всеми запросами за сегодняшний день и один со всеми запросами за прошлый год.источник
Идея состоит в том, чтобы отслеживать такие вещи и замечать, когда они значительно прыгают по сравнению с их собственной базовой линией.
Таким образом, для запросов, которые имеют более чем определенную пороговую величину, отслеживайте каждый из них, и когда он изменяется на какое-то значение (скажем, почти в два раза) своего исторического значения, это новый горячий тренд.
источник