scikit-learn的TfidfVectorizer在线版本
我想用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值都会发生变化。这就意味着你需要重新查看和训练所有之前的文档,这样就不算是在线处理了。
虽然可能有一些近似的方法,但你需要自己去实现这些方法。