Scikit learn 如何通过向CountVector传递迭代器来解决内存过载问题?

Scikit learn 如何通过向CountVector传递迭代器来解决内存过载问题?,scikit-learn,nlp,Scikit Learn,Nlp,我正在使用CountVectorizer从大量文档(约1500万个文档)中提取文本特征。我还研究了HashingVectorizer作为替代方案,但我认为CountVectorizer是我所需要的,因为它提供了有关文本功能和其他内容的更多信息 这里的问题有点常见:我在安装countvectorier型号时没有足够的内存 def getTexts(): # an iterator that will yield each document from the database vector

我正在使用
CountVectorizer
从大量文档(约1500万个文档)中提取文本特征。我还研究了
HashingVectorizer
作为替代方案,但我认为
CountVectorizer
是我所需要的,因为它提供了有关文本功能和其他内容的更多信息

这里的问题有点常见:我在安装
countvectorier
型号时没有足够的内存

def getTexts():
    # an iterator that will yield each document from the database

vectorizer = CountVectorizer(max_features=500, ngram_range=(1,3))
X = vectorizer.fit_transform(getTexts())

这里,假设我有一个迭代器,它将从数据库一次生成一个文档。如果我将此迭代器作为参数传递给
CountVectorizer
fit()
函数,那么词汇表是如何构建的?它是等到加载完所有文档后再执行一次
fit()
,还是一次加载一个文档,再执行fit,然后加载下一个文档?解决内存开销的可能方法是什么?

CountVectorizer会消耗更多内存的原因是
CountVectorizer
需要在内存中存储词汇词典,
hashingvectorier
具有更好的内存性能,因为它不需要存储词汇词典。这两个矢量器之间的主要区别在
hashingvectoryzer

这一战略有几个优点:

  • 它的内存非常低,可扩展到大型数据集,因为不需要在内存中存储词汇词典
  • pickle和unpickle很快,因为除了构造函数参数外,它不保存任何状态
  • 它可以在流式(部分拟合)或并行管道中使用,因为拟合期间没有计算状态
使用带有 记忆中词汇表):

  • 没有办法计算反变换(从特征索引到字符串特征名称),这在尝试 反思哪些特征对模型最重要
  • 可能存在冲突:不同的标记可以映射到相同的功能索引。然而,在实践中,如果 n_特征足够大(例如2**18用于文本分类 问题)
  • 没有IDF权重,因为这将使变压器处于有状态
当然,
countvectorier
会一次加载一个文档,进行拟合,然后加载下一个文档。在此过程中,
CountVectorizer
将随着内存使用量的激增而构建词汇词典

要优化内存,您可能需要减小文档数据集的大小,或者提供较低的
max\u features
参数也可能有所帮助。但是,如果要完全解决此内存问题,请尝试使用
hashingvectorier
而不是
countvectorier