在scikit-learn中向文本矢量化器添加新单词

use*_*075 5 python numpy scipy scikits scikit-learn

Scikit-learn CountVectorizer for bag-of-words方法目前提供两个子选项:(a)使用自定义词汇表(b)如果自定义词汇不可用,则它根据语料库中存在的所有单词创建词汇表.

我的问题:我们可以指定一个自定义词汇表,但要确保在处理语料库时看到新词时会更新.我假设这是可行的,因为矩阵是通过稀疏表示存储的.

实用性:当需要在训练数据中添加其他文档时,它将有所帮助,而且不必从头开始.

Fre*_*Foo 2

不,目前这是不可能的。这也不是“可行的”,原因如下。

CountVectorizer旨在TfidfVectorizer将文本文档转换为向量。这些向量需要具有相同数量的元素,而这些元素又等于词汇表的大小,因为该约定在所有 scikit-learn 代码中都根深蒂固。如果允许词汇量增长,那么不同时间产生的向量具有不同的长度。这会影响在此类向量上训练的线性(或其他参数)分类器中的参数数量,然后这些分类器也需要能够增长。它影响 k 均值和降维类别。它甚至会影响像矩阵乘法这样简单的事情,这些事情不再可以通过简单调用 NumPy 的dot例程来处理,而是需要自定义代码。换句话说,除非您调整所有scikit-learn 来处理结果,否则在矢量化器中允许这种灵活性没有什么意义。

虽然这是可能的,但我(作为核心 scikit-learn 开发人员)会强烈反对这一更改,因为它使代码变得非常复杂,可能会更慢,而且即使它可以工作,也会使人无法区分“正在增长的”词汇表”以及更常见的情况是用户以错误的方式传递数据,从而导致维数出现错误。

如果您想批量输入数据,则可以使用HashingVectorizer(无词汇)或对数据进行两次传递以预先收集词汇。