我正在尝试通过Kaggle能力学习自然语言处理, 但是当我使用sklearn TfidfVectorizer计算稀疏矩阵的乘积时,我遇到了一个问题(内存错误)。
我在下面执行了代码。
s1
,s2
:pandas.Series
和文字。
它们的长度均为404287。
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer()
vect.fit(pd.concat([s1, s2]))
tfidf_s1 = vect.transform(s1)
tfidf_s2 = vect.transform(s2)
p = tfidf_s1.dot(tfidf_s2.transpose())
然后,它的输出是以下错误消息。
MemoryError Traceback (most recent call last)
in
7 tfidf_s1 = vect.transform(s1)
8 tfidf_s2 = vect.transform(s2)
----> 9 p = tfidf_s1.dot(tfidf_s2.transpose())
/usr/local/lib/python3.5/dist-packages/scipy/sparse/base.py in dot(self, other)
362
363 """
--> 364 return self * other
365
366 def power(self, n, dtype=None):
/usr/local/lib/python3.5/dist-packages/scipy/sparse/base.py in __mul__(self, other)
480 if self.shape[1] != other.shape[0]:
481 raise ValueError('dimension mismatch')
--> 482 return self._mul_sparse_matrix(other)
483
484 # If it's a list or whatever, treat it like a matrix
/usr/local/lib/python3.5/dist-packages/scipy/sparse/compressed.py in _mul_sparse_matrix(self, other)
509 maxval=nnz)
510 indptr = np.asarray(indptr, dtype=idx_dtype)
--> 511 indices = np.empty(nnz, dtype=idx_dtype)
512 data = np.empty(nnz, dtype=upcast(self.dtype, other.dtype))
513
MemoryError:
tfidf_s1.shape
和tfidf_s2.shape
为(404287,86152),因此tfidf_s1.dot(tfidf_s2.transpose)
的shpae为(404287,1)。
我的记忆状态约为
所以我认为内存足够。实际上,cat /proc/meminfo
在执行时显示没有用尽的MemFree。
您能给我一些建议,如何避免发生错误或假设,为什么会发生内存错误。
我的环境:
ubuntu 16.04.5 LTS
python 3.5.2
numpy == 1.15.4
pandas == 0.23.4
scipy == 1.2.0
scikit-learn == 0.20.2
它们都在docker容器中工作。
答案 0 :(得分:0)
因此,形状为(404287, 86152)
的2个稀疏矩阵。第二个被换位
(404287, 86152) * (86152, 404287) => (404287, 404287)
稀疏矩阵乘积分两个步骤完成。首先查看非零的模式,并确定返回的形状和非零的数量。然后分配这样的矩阵,并将其填充。
分配返回矩阵时发生错误。
indptr = np.asarray(indptr, dtype=idx_dtype)
indices = np.empty(nnz, dtype=idx_dtype)
data = np.empty(nnz, dtype=upcast(self.dtype, other.dtype))
return = sparse.csr_matrix((data, indptr, indices), shape...)
显然nnz
太大;过大的超大收益矩阵的比例将为非零。
您为什么认为返回形状应为(404287, 1)
?