Scikit-learn CountVectorizer for bag-of-words方法目前提供了两个子选项:(a)使用自定义词汇(b)如果自定义词汇不可用,则它根据语料库中存在的所有单词制作词汇表。
我的问题:我们是否可以首先指定一个自定义词汇表,但请确保在处理语料库时看到新单词时对其进行更新。我假设这是可行的,因为矩阵是通过稀疏表示存储的。
有用性:当必须向训练数据添加其他文档并且不必从头开始时,这将有所帮助。
不,目前这是不可能的。它也不是"可行的",原因如下。
CountVectorizer
和TfidfVectorizer
旨在将文本文档转换为矢量。这些向量需要具有相同数量的元素,这反过来又等于词汇的大小,因为该约定在所有scikit-learn代码中根深蒂固。如果允许词汇量增长,那么在不同时间产生的向量具有不同的长度。例如,这会影响在此类向量上训练的线性(或其他参数)分类器中的参数数量,然后这些参数也需要能够增长。它会影响 k 均值和降维类。它甚至会影响像矩阵乘法这样简单的东西,这些事情不能再通过简单地调用 NumPy 的 dot
例程来处理,而是需要自定义代码。换句话说,在矢量化器中允许这种灵活性是没有意义的,除非你调整所有scikit-learn来处理结果。
虽然这是可能的,但我(作为核心scikit-learn开发人员)强烈反对这一更改,因为它使代码非常复杂,可能更慢,即使它可以工作,也将无法区分"不断增长的词汇量"和用户以错误方式传递数据的更常见的情况, 这样维度的数量就错了。
如果要批量输入数据,请使用HashingVectorizer
(无词汇表)或对数据进行两次传递以预先收集词汇表。