sklearn 中的矢量化似乎非常耗费内存。为什么?

Vectorization in sklearn seems to be very memory expensive. Why?

我需要处理超过 1,000,000 条文本记录。我正在使用 CountVectorizer 来转换我的数据。我有以下代码。

TEXT = [data[i].values()[3] for i in range(len(data))] #these are the text records

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(min_df=1)
X = vectorizer.fit_transform(TEXT)


X_list = X.toarray().tolist()

当我运行这段代码时,结果是MemoryError。我的文字记录大多是短段落(~100 字)。矢量化似乎很昂贵。

更新

我向 CountVectorizer 添加了更多约束,但仍然出现 MemoeryError。 feature_names的长度是2391.

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(min_df=0.003,max_df = 3.05, lowercase = True, stop_words = 'english')
X = vectorizer.fit_transform(TEXT)
feature_names = vectorizer.get_feature_names()

X_tolist = X.toarray().tolist()

Traceback (most recent call last):
File "nlp2.py", line 42, in <module>
X_tolist = X.toarray().tolist()
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 940, in toarray
return self.tocoo(copy=False).toarray(order=order, out=out)
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/coo.py", line 250, in toarray
B = self._process_toarray_args(order, out)
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/base.py", line 817, in _process_toarray_args
return np.zeros(self.shape, dtype=self.dtype, order=order)
MemoryError

为什么会这样以及如何应对?谢谢!!

你的问题是 X 是一个稀疏矩阵,每个文档一行代表该文档中存在哪些词。如果你有一百万个文档,总共有 2391 个不同的单词(你的问题中提供的 feature_names 的长度),那么 x 的密集版本中的条目总数大约是 两个十亿,足以潜在地导致内存错误。

问题在于这一行 X_list = X.toarray().tolist(),它将 X 转换为密集数组。你没有足够的内存,应该有一种方法可以在没有它的情况下做你想做的事情,(因为 X 的稀疏版本有你需要的所有信息。