【问题标题】:How to resolve memory overloading by passing an iterator to CountVectorizer?如何通过将迭代器传递给 CountVectorizer 来解决内存过载问题?
【发布时间】:2019-09-09 11:44:08
【问题描述】:

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

这里的问题很常见:​​拟合CountVectorizer 模型时内存不足。

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())

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

【问题讨论】:

    标签: scikit-learn nlp


    【解决方案1】:

    CountVectorizer会消耗更多内存的原因是CountVectorizer需要在内存中存储词汇字典,而HashingVectorizer的内存性能更好,因为它不需要存储词汇字典.这两个向量化器的主要区别在HashingVectorizerDoc中提到:

    这种策略有几个优点:

    • 内存非常低,可扩展到大型数据集,因为无需在内存中存储词汇字典
    • pickle 和 un-pickle 很快,因为它除了构造函数参数之外没有任何状态
    • 它可用于流式传输(部分拟合)或并行管道,因为在拟合期间不计算任何状态。

    还有一些缺点(与使用 CountVectorizer 和 记忆词汇):

    • 无法计算逆变换(从特征索引到字符串特征名称),这在尝试 反思哪些特征对模型最重要。
    • 可能存在冲突:不同的标记可以映射到相同的特征索引。然而在实践中,这很少是一个问题,如果 n_features 足够大(例如 2 ** 18 用于文本分类 问题)。
    • 没有 IDF 加权,因为这会使转换器有状态。

    当然CountVectorizer 将一次加载一个文档,进行调整,然后加载下一个文档。在此过程中,CountVectorizer 将随着内存使用量的激增建立其词汇词典。

    要优化内存,您可能需要减小文档数据集的大小,或者提供较低的max_features 参数也可能会有所帮助。但是,如果您想彻底解决此内存问题,请尝试使用HashingVectorizer 而不是CountVectorizer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多