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