Как я могу измерить тренды в определенных словах, таких как Twitter? - PullRequest
15 голосов
/ 13 декабря 2011

У меня есть корпус газетных статей днем.Каждое слово в корпусе имеет частоту присутствия в тот день.Я занимался поиском алгоритма, который фиксирует отдельные слова, аналогично тому, как Twitter измеряет тенденции в твитах людей.

Для экземпляра, скажем, слово «рецессия» появляется со следующей частотой в том жегруппа газет:
день 1 |рецессия |456
День 2 |рецессия |2134
День 3 |рецессия |3678

В то время как «Европа»
День 1 |Европа |67895
День 2 |Европа |71999
День 3 |Европа |73321

Я думал о том, чтобы взять% роста в день и умножить его на логарифм суммы частот.Тогда я взял бы среднее значение, чтобы набрать и сравнить различные слова.

В этом случае:
рецессия = (3,68 * 8,74 + 0,72 * 8,74) / 2 = 19,23
европа = (0,06 * 12,27+ 0,02 * 12,27) / 2 = 0,49

Есть ли лучший способ уловить взрывной рост?Я пытаюсь найти ежедневный корпус, чтобы найти термины, которые все чаще упоминаются в определенный период времени.ПОЖАЛУЙСТА, дайте мне знать, если есть лучший алгоритм.Я хочу быть в состоянии найти слова с высоким непостоянным ускорением.Возможно, вторая производная будет более эффективной.Или, может быть, я слишком усложняю и смотрю слишком много физических программ на канале открытий.Дайте мне знать, если возможно, с математическим примером. Спасибо!

Ответы [ 3 ]

8 голосов
/ 21 декабря 2011

Первое, на что нужно обратить внимание, это то, что это может быть аппроксимировано локальной проблемой.То есть слово «тренд» действительно зависит только от последних данных.Таким образом, мы сразу можем усечь наши данные до самых последних N дней, где N - это некоторое экспериментально определенное оптимальное значение.Это значительно сокращает объем данных, на которые мы должны смотреть.

Фактически, статья NPR предлагает это.

Тогда вам нужно как-то взглянуть на рост,И это именно то, что захватывает производная.Первое, что нужно сделать, это нормализовать данные.Разделите все ваши точки данных на значение первой точки данных.Это делает так, чтобы большой рост редкого слова не заглушался относительно небольшим ростом популярного слова.

Для первой производной сделайте что-то вроде этого:

d[i] = (data[i] - data[i+k])/k

для некоторого экспериментально определенного значения k (которое, в данном случае, является числом дней).Аналогично, вторая производная может быть выражена как:

d2[i] = (data[i] - 2*data[i+k] + data[i+2k])/(2k)

Более высокие производные также могут быть выражены следующим образом.Затем вам нужно назначить какую-то систему взвешивания для этих производных.Это чисто экспериментальная процедура, которая действительно зависит от того, что вы хотите считать «трендовым».Например, вы можете дать ускорение роста вдвое меньше веса, чем скорость.Еще одна вещь, на которую стоит обратить внимание, это то, что вы должны изо всех сил удалять шум из ваших данных, потому что производные очень чувствительны к шуму.Вы делаете это, тщательно выбирая свое значение для k, а также отбрасывая слова с очень низкими частотами.

Я также заметил, что вы умножаете на лог-сумму частот.Я предполагаю, что это должно придать росту популярности популярных слов больший вес (поскольку более популярные слова с меньшей вероятностью будут развиваться в первую очередь).Стандартный способ измерить популярность слова - посмотреть на частоту обратного документа (IDF).

Я бы разделил на IDF слова, чтобы дать рост популярностислова больше веса.

IDF[word] = log(D/(df[word))

где D - общее количество документов (например, для Twitter это будет общее количество твитов), а df[word] - количество документов, содержащих word (например, количество твитов, содержащих слово).

Высокий IDF соответствует непопулярному слову, тогда как низкий IDF соответствует популярному слову.

1 голос
/ 21 декабря 2011

Проблема вашего подхода (измерения ежедневного роста в процентах) заключается в том, что он игнорирует обычный «фоновый уровень» слова, как показывает ваш пример;«Европа» растет быстрее, чем «рецессия», но имеет гораздо более низкий балл.

Если фоновый уровень слов имеет хорошо организованное распределение (гауссово, или что-то еще, что не слишком далеко заходитот среднего) тогда я думаю, что изменение предложения CanSpice было бы хорошей идеей.Определите среднее значение и стандартное отклонение для каждого слова, используя дни от C-N+1-T до C-T, где C - текущая дата, N - количество дней, которые необходимо учитывать, и T - количество дней, определяющих тренд..

Скажем, например, N = 90 и T = 3, поэтому мы используем около трех месяцев для фона и говорим, что тренд определяется тремя пиками подряд.В этом случае, например, вы можете ранжировать слова в соответствии с их хи-квадратом p -значением, рассчитанным так:

(mu, sigma) = fitGaussian(word='europe', startday=C-N+1-3, endday=C-3)
X1 =  count(word='europe', day=C-2)
X2 =  count(word='europe', day=C-1)
X3 =  count(word='europe', day=C)

S = ((X1-mu)/sigma)^2 + ((X2-mu)/sigma)^2 + ((X3-mu)/sigma)^2 
p = pval.chisq(S, df=3)

По существу, тогда вы можете получить слова, которыеза последние три дня являются наиболее экстремальными по сравнению с их фоновым уровнем.

0 голосов
/ 20 декабря 2011

Я бы сначала попробовал простое решение.Простая взвешенная разница между соседними днями, вероятно, должна работать.Может быть, беру журнал до этого.Возможно, вам придется экспериментировать с весами.Например, (-2, -1,1,2) даст вам точки, где данные взрываются.

Если этого недостаточно, вы можете попробовать фильтрацию по уклону (http://www.claysturner.com/dsp/fir_regression.pdf).Поскольку алгоритм основан на линейной регрессии, должна быть возможность изменить его для других типов регрессии (например, квадратичных).

Все попытки, использующие такие методы фильтрации, также имеют то преимущество, что они могут бытьсделано для очень быстрой работы, и вы сможете найти библиотеки, которые обеспечивают быструю фильтрацию.

...