增量 IDF(逆文档频率)

机器算法验证 时间序列 文本挖掘
2022-02-27 08:47:26

在文本挖掘应用程序中,一种简单的方法是使用启发式方法来创建向量作为文档的紧凑稀疏表示。这对于批处理设置来说很好,其中整个语料库是先验已知的,因为需要整个语料库tfidfidf

idf(t)=log|D||{d:td}|

其中是一个术语,是一个文档,是文档语料库,(未显示)是字典。tdDT

然而,随着时间的推移,通常会收到新的文件。一种选择是继续使用现有的,直到收到一定数量的新文档,然后重新计算它。然而,这似乎相当低效。如果提前看到所有数据,有谁知道(可能近似地)收敛到值的增量更新方案?或者,是否有另一种度量可以捕获相同的概念但可以以增量方式计算?idf

还有一个相关的问题是,随着时间的推移由于 idf 捕获了语料库词频的概念,因此可以想象语料库中较旧的文档(例如,我的语料库包含超过 100 年的期刊文章),因为不同词的频率随时间而变化。在这种情况下,当新文档进来时丢弃旧文档实际上可能是明智的,实际上使用滑动窗口可以想象,还可以存储所有以前向量作为计算新的向量,然后如果我们想检索 1920-1930 年的文档,我们可以使用从该日期范围内的文档计算这种方法有意义吗?idfidfidfidf

编辑:关于字典有一个单独但相关的问题。随着时间的推移,会出现以前没有出现过的新词典术语,所以将需要增长,因此需要增长向量的长度。看起来这不会是一个问题,因为零可以附加到旧的向量。T|T|idfidf

1个回答

好的,感谢 Steffen 的有用评论。我想答案最终很简单。正如他所说,我们需要做的就是存储当前分母(称为):z

z(t)=|{d:td}|

现在给定一个新文档,我们只需通过以下方式更新分母:d

z(t)=z(t)+{1iftd0otherwise

然后我们必须根据新的向量tfidfidf

与删除旧文档类似,我们以类似的方式递减分子。

确实意味着我们要么必须存储整个矩阵以及矩阵(内存需求加倍),要么我们必须在需要时计算分数(增加计算成本)。我看不出有什么办法。tftfidftfidf

对于问题的第二部分,关于向量随时间的演变,似乎我们可以使用上述方法,并为不同的日期范围(或者可能是内容子集)存储一组“地标”向量(分母) . 当然是字典长度的密集向量,因此存储大量这些将是内存密集型的;然而,这可能比在需要时重新计算向量更可取(这将再次需要存储矩阵或代替)。idfzzidftf