【问题标题】:Adding new words to text vectorizer in scikit-learn在 scikit-learn 中向文本向量器添加新单词
【发布时间】:2013-11-25 13:20:11
【问题描述】:

Scikit-learn CountVectorizer for bag-of-words 方法目前提供了两个子选项:(a) 使用自定义词汇表 (b) 如果自定义词汇表不可用,那么它会根据出现在语料库。

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

有用性:在必须向训练数据中添加其他文档且不必从头开始的情况下,它会有所帮助。

【问题讨论】:

  • 现在写的 scikit 无法做到这一点,所以我看到的唯一选择是向 issue tracker 添加增强请求。

标签: python numpy scipy scikit-learn scikits


【解决方案1】:

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

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

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

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

【讨论】:

  • 旧向量可以通过扩展零来更新它们中没有出现的新术语。
  • 我会发现 CountVectorizerTfidfVectorizer 的词汇管理和标记化功能本身很有用,如果向量化是分开的就好了。
  • 我认为这个答案在“不可行”方面过于强烈。本质上,scikit-learn 中的向量化器确实会随着语料库的处理而增长。也就是说,如果没有给出预先构建的词汇表,那么它们的大小从 0 开始,并随着语料库的处理增长到 N 大小。从大小为 M 的词汇开始应该是可能的。
猜你喜欢
  • 1970-01-01
  • 2017-12-25
  • 2016-07-24
  • 2015-06-15
  • 2020-03-04
  • 2019-04-28
  • 2014-07-31
  • 2017-02-16
  • 2014-08-14
相关资源
最近更新 更多