Произведение разреженных матриц склеарном TfidfVectorizer - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь изучать обработку естественного языка с 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).

Myсостояние памяти около

  • MemTotal: 24570420 кБ
  • MemFree: 10896612 кБ
  • MemAvailable: 19635868 кБ

Так что я думаю, что памятьдостаточноНа самом деле 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

Все они работают в док-контейнере.

1 Ответ

0 голосов
/ 10 февраля 2019

Итак, 2 разреженных матрицы формы (404287, 86152).Второе транспонируется

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...