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