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