我白天有报纸文章的语料库。语料库中的每个单词都具有当天存在的频率计数。我一直在寻找能够捕捉突破性词语的算法,类似于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
有没有更好的方法来捕捉爆炸式增长?我正在尝试挖掘每日语料库以查找在特定时间段内越来越多地提及的术语。如果有更好的算法,请告诉我。我希望能够找到具有高非恒定加速度的单词。也许采用二阶导数会更有效。或者也许我这样做过于复杂,并且在发现频道上观看了太多的物理编程。如果可能,请告诉我一个数学示例谢谢!
答案 0 :(得分:8)
首先要注意的是,这可以通过本地问题来近似。也就是说,“趋势”一词实际上仅取决于最近的数据。因此,我们可以立即将数据截断到最近N
天,其中N
是实验确定的最佳值。这大大减少了我们要查看的数据量。
事实上,NPR article暗示了这一点。
然后你需要以某种方式看待增长。这正是衍生物捕获的内容。首先要做的是规范化数据。将所有数据点除以第一个数据点的值。这使得不常见的单词的大量增长不会被流行词的相对较小的增长所淹没。
对于一阶导数,请执行以下操作:
d[i] = (data[i] - data[i+k])/k
对于某些实验确定的k
值(在这种情况下,是天数)。类似地,二阶导数可表示为:
d2[i] = (data[i] - 2*data[i+k] + data[i+2k])/(2k)
更高的衍生品也可以这样表达。然后你需要为这些衍生物分配某种加权系统。这是一个纯粹的实验性程序,它实际上取决于你想要考虑的“趋势”。例如,您可能希望将增长加速度增加到速度的一半。另外需要注意的是,您应该尽量去除数据中的噪声,因为衍生物对噪声非常敏感。您可以通过仔细选择k
的值以及丢弃频率非常低的字词来完成此操作。
我还注意到你乘以频率的对数和。我认为这是为了让流行词语的增长更加重要(因为更流行的词语首先不太可能出现趋势)。衡量单词流行程度的标准方法是查看单词inverse document frequency(IDF)。
我会用一个单词的IDF除以使更多流行单词的增长更加重要。
IDF[word] = log(D/(df[word))
其中D
是文档的总数(例如,对于Twitter,它将是推文的总数),df[word]
是包含word
的文档的数量(例如,包含单词的推文。
高IDF对应于不受欢迎的单词,而低IDF对应于流行单词。
答案 1 :(得分:1)
您的方法(以百分比衡量每日增长)的问题在于它忽视了通常的背景水平"这个词,正如你的例子所示; '欧洲'增长速度超过“经济衰退”,但得分却低得多。
如果单词的背景级别有一个表现良好的分布(高斯,或其他不会偏离平均值的其他东西)那么我认为修改CanSpice的建议会很好理念。使用天C-N+1-T
到C-T
计算每个单词的均值和标准差,其中C是当前日期,N是要考虑的天数,T是天数定义趋势。
(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)
基本上,你可以得到过去三天与背景水平相比最极端的词。
答案 2 :(得分:0)
我首先尝试一个简单的解决方案。相邻日之间的简单加权差异应该可行。也许在那之前记录日志。您可能需要尝试权重。对于例如(-2,-1,1,2),会给出数据爆炸的点。
如果这还不够,您可以尝试斜率过滤(http://www.claysturner.com/dsp/fir_regression.pdf)。由于该算法基于线性回归,因此应该可以将其修改为其他类型的回归(例如二次)。
使用这些过滤技术的所有尝试也具有优势,可以使它们运行得非常快,并且您应该能够找到提供快速过滤的库。