Как я могу измерять тенденции в определенных словах, таких как Twitter?

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

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

Пока "Европа"
День 1 | европе | 67895
День 2 | европе | 71999
День 3 | европе | 73321

Я подумывал взять% роста в день и умножить его на логарифм суммы частот. Затем я бы взял среднее значение для оценки и сравнения различных слов.

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

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

Ответы

Ответ 1

Прежде всего следует заметить, что это может быть аппроксимировано локальной проблемой. То есть "трендовое" слово действительно зависит только от последних данных. Поэтому сразу мы можем усечь наши данные до последних дней 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 соответствует популярному слову.

Ответ 2

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

Если уровень фона слов имеет хорошее поведение (гауссово или что-то еще, что не слишком сильно блуждает от среднего), то я думаю, что модификация предложения 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)

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

Ответ 3

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

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

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