sklearn TfidfVectorizer的稀疏矩阵乘积

时间:2019-02-10 17:32:48

标签: python numpy scikit-learn scipy

我正在尝试通过Kaggle能力学习自然语言处理, 但是当我使用sklearn TfidfVectorizer计算稀疏矩阵的乘积时,我遇到了一个问题(内存错误)。

我在下面执行了代码。

s1s2pandas.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.shapetfidf_s2.shape为(404287,86152),因此tfidf_s1.dot(tfidf_s2.transpose)的shpae为(404287,1)。

我的记忆状态约为

  • Mem总计:24570420 kB
  • MemFree:10896612 kB
  • 可用:19635868 kB

所以我认为内存足够。实际上,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容器中工作。

1 个答案:

答案 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)