scikit-learn 的 TfidfVectorizer 在线版
Posted
技术标签:
【中文标题】scikit-learn 的 TfidfVectorizer 在线版【英文标题】:Online version of scikit-learn's TfidfVectorizer 【发布时间】:2014-08-22 10:59:12 【问题描述】:我希望使用 scikit-learn 的 HashingVectorizer
,因为它非常适合在线学习问题(文本中的新标记保证映射到“桶”)。不幸的是,scikit-learn 中包含的实现似乎不包括对 tf-idf 功能的支持。通过TfidfTransformer
传递矢量化器输出是使在线更新与 tf-idf 功能一起使用的唯一方法,还是有更优雅的解决方案?
【问题讨论】:
【参考方案1】:与接受的答案中所说的相反,您可以“在线”执行 TF-IDF。
事实上,每个搜索引擎(例如 Lucene)都会这样做。
如果假设您的内存中有 TF-IDF 向量,什么不起作用。
lucene 等搜索引擎自然会避免将所有数据保存在内存中。相反,他们一次加载一列(由于稀疏性不是很多)。 IDF 由倒排列表的长度产生。
关键是,您不要将您的数据转换为 TF-IDF,然后进行标准余弦相似度。
相反,您在计算相似度时使用当前 IDF 权重,使用加权余弦相似度(通常通过额外的权重、提升项进行修改,惩罚条款等)
这种方法基本上适用于任何允许在评估时进行属性加权的算法。许多算法都可以,但不幸的是,很少有实现足够灵活。不幸的是,大多数人希望您在训练之前将权重乘以数据矩阵。
【讨论】:
这不允许以在线方式学习。以在线方式维护 TF-IDF 值与以在线方式使用 TF-IDF 学习模型是有区别的。该问题专门针对“在线学习问题” 嗯,你可以把这个整合到一些学习方法中。最明显的是,kNN 分类可以正常工作。大多数基于距离的其他方法也可以:距离函数的权重会发生变化,但对于许多方法来说,它们无论如何都可能依赖于查询! 只有幼稚的情况才可以。如果您对距离度量使用任何加速查询结构,例如支持增量构建的 kdtree,它将不再起作用。最终,一般情况是除非您开发一些近似值,否则您无法做到。 k-d-tree 可以很好地处理权重。但是无论如何,这些都不适用于文本等高维数据。对于文本等稀疏数据,倒排列表是最好的索引,请参阅 Lucene。 没有人提到加权数据,你为什么要谈论权重? kdtree 在 IDF 的增量设置中不起作用,因为 IDF 会更改所有先前特征的值 - 使所有 kdtree 都错误。你所说的一切都没有改变 kNN 是你可以进行在线 TF-IDF 的特殊情况,但即便如此也只能在受限场景中使用。【参考方案2】:本质上,您不能以在线方式使用 TF IDF,因为所有过去功能的 IDF 都会随着每个新文档而改变 - 这意味着重新访问和重新训练所有以前的文档,这将不再在线。
可能有一些近似值,但您必须自己实现它们。
【讨论】:
Lucene 等不是有效地做“在线”TF IDF 吗? 不是为了学习模型,不。仅用于进行更容易和不同问题的搜索。以上是关于scikit-learn 的 TfidfVectorizer 在线版的主要内容,如果未能解决你的问题,请参考以下文章
[机器学习与scikit-learn-2]:如何学习Scikit-learn