scikit-learn的TfidfVectorizer在线版本

2 投票
2 回答
3009 浏览
提问于 2025-04-18 11:47

我想用scikit-learn里的HashingVectorizer,因为它非常适合在线学习的问题(文本中的新词汇一定会映射到一个“桶”里)。不过,scikit-learn里面的这个实现似乎不支持tf-idf特性。请问,把向量化的结果通过TfidfTransformer处理,是让在线更新和tf-idf特性一起工作的唯一方法吗?还是说还有更好的解决方案呢?

2 个回答

4

其实,你可以进行“在线”的TF-IDF计算,这和之前被接受的答案说的不一样。

实际上,每个搜索引擎(比如Lucene)都是这么做的。

如果你假设TF-IDF的向量都在内存里,那就不太行。

像Lucene这样的搜索引擎,通常不会把所有数据都放在内存里。相反,它们会一次加载一列数据(因为数据稀疏,所以每次加载的量不多)。IDF的计算很简单,直接根据倒排列表的长度就能得出。

关键是,你并不是先把数据转化为TF-IDF,然后再用标准的余弦相似度来计算。

而是,在计算相似度时,使用当前的 IDF 权重,通过加权的余弦相似度来进行计算(通常还会加上一些额外的权重、提升某些项、惩罚某些项等等)。

这种方法基本上适用于任何允许在评估时进行属性加权的算法。很多算法都可以,但很少有实现足够灵活,遗憾的是大多数都要求你在训练之前就把权重乘到数据矩阵里。

3

本质上,你不能以在线的方式使用TF-IDF,因为每当有新文档加入时,所有过去特征的IDF值都会发生变化。这就意味着你需要重新查看和训练所有之前的文档,这样就不算是在线处理了。

虽然可能有一些近似的方法,但你需要自己去实现这些方法。

撰写回答