【问题标题】:Creating ngrams from scikit learn and count vectorizer throws Memory Error从 scikit 学习和计数向量器创建 ngram 会引发内存错误
【发布时间】:2015-01-09 08:25:07
【问题描述】:

我正在使用 scikit-learn 从多个文本文档构建 ngrams。我需要使用 countVectorizer 构建 document-frequency

示例

document1 = "john is a nice guy"

document2 = "person can be a guy"

所以,文档频率将是

{'be': 1,
 'can': 1,
 'guy': 2,
 'is': 1,
 'john': 1,
 'nice': 1,
 'person': 1}

这里的文档只是字符串,但是当我尝试使用 大量数据 时。它会抛出 MEMORY ERROR。

代码:

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
document = [Huge amount of data around 7MB] # ['john is a guy', 'person guy']
vectorizer = CountVectorizer(ngram_range=(1, 5))
X = vectorizer.fit_transform(document).todense()
tranformer = vectorizer.transform(document).todense()
matrix_terms = np.array(vectorizer.get_feature_names())
lst_freq =  map(sum,zip(*tranformer.A))          
matrix_freq = np.array(lst_freq)
final_matrix = np.array([matrix_terms,matrix_freq])

错误:

Traceback (most recent call last):
  File "demo1.py", line 13, in build_ngrams_matrix
    X = vectorizer.fit_transform(document).todense()
  File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.py", line 605, in todense
    return np.asmatrix(self.toarray(order=order, out=out))
  File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 901, in toarray
    return self.tocoo(copy=False).toarray(order=order, out=out)
  File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/coo.py", line 269, in toarray
    B = self._process_toarray_args(order, out)
  File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.py", line 789, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)
MemoryError

【问题讨论】:

  • 我认为using todense() 同时生成MEMORY ERROR。但是当它不使用todense() 时,它会在sparse matrix 中给出输出。我不知道阅读那个稀疏矩阵。有什么帮助吗?
  • 如果您真的想查看稀疏矩阵,可以查看其中的一小部分(例如前 10 行),例如 X[:10,:].todense()。大多数其他操作,例如求和,对稀疏和密集矩阵的工作方式相同,因此您实际上不需要调用todense/A/toarray

标签: python memory numpy scikit-learn n-gram


【解决方案1】:

正如 cmets 所提到的,当您将大型稀疏矩阵转换为密集格式时,您会遇到内存问题。试试这样的:

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
document = [Huge amount of data around 7MB] # ['john is a guy', 'person guy']
vectorizer = CountVectorizer(ngram_range=(1, 5))

# Don't need both X and transformer; they should be identical
X = vectorizer.fit_transform(document)
matrix_terms = np.array(vectorizer.get_feature_names())

# Use the axis keyword to sum over rows
matrix_freq = np.asarray(X.sum(axis=0)).ravel()
final_matrix = np.array([matrix_terms,matrix_freq])

编辑:如果您想要从词到频率的字典,请在致电fit_transform 后尝试此操作:

terms = vectorizer.get_feature_names()
freqs = X.sum(axis=0).A1
result = dict(zip(terms, freqs))

【讨论】:

  • 感谢@perimosocordiae。建议我使用 fit_transform() ,因为两者是相同的。
  • @perimosocordiae :需要更多帮助。你final_matrix 是一个矩阵。现在我想以rapid 的方式将其转换为dictionary。我用dict(zip(final_matrix[0],final_matrix[1]))这个。但这需要几秒钟的时间。有没有其他方法可以将矩阵转换为字典?
  • 我不确定它是否会更快,但我已经更新了我的答案以展示如何制作你想要的字典。
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 2018-09-06
  • 2014-03-15
  • 2016-04-29
  • 2015-04-15
  • 2019-02-28
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多