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

时间:2013-11-13 04:30:10

标签: python numpy scipy scikit-learn scikits

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

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

有用性:当需要向训练数据添加其他文档时,它将有所帮助,并且不必从头开始。

1 个答案:

答案 0 :(得分:2)

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

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

虽然这是可能的,但我(作为核心scikit-learn开发人员)会强烈反对这种变化,因为它会使代码变得非常复杂,可能更慢,即使它会起作用,也会使它无法区分“日益增长的词汇量”以及用户以错误的方式传递数据的更常见情况,因此维度的数量出错了。

如果您想分批提供数据,则使用HashingVectorizer(无词汇表)或对数据进行两次传递以预先收集词汇。