Ошибка памяти при попытке вычислить матрицу сходства косинусов на векторе TFIDF - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь построить функцию рекомендации в python3 на основе Mov ie Plot (content), для которой в качестве аргумента используется заголовок mov ie и выводятся фильмы с большинством похожих сюжетов.

Мои спорные данные имеют Форма (45466, 8) Вот так выглядит заголовок спорных данных:

enter image description here

Я использую метод fit-transform из sklearn.feature_extraction.text TfidVectorizer для построения необходимой матрицы TF-IDF на функции обзор следующим образом:

tfidf = TfidfVectorizer(stop_words='english')

tfidf_matrix = tfidf.fit_transform(movies['overview'])

В результате получается матрица формы (45466, 75827) для обзора каждого движения ie, что означает - после удаления общих стоп-слов - в обзорном супе из всех 45466 есть 75827 различных слов фильмы комбинированные .

После этого я хочу вычислить попарно косинусное сходство каждого движения ie на основе построенной выше матрицы tfidf. Это должно дать мне матрицу 45466 x 45466 , где (i-я, j-я) ячейка будет показателем сходства между фильмами i & j. Я использую sklearn.metrics.pairwise linear_kernel метод для вычисления того же:

cos_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

Это где python3 выбрасывает ошибку памяти:

----
MemoryError                               Traceback (most recent call last)
<ipython-input-5-d884b8c29067> in <module>
      1 #STEP 2: COMPUTING THE COSINE SIMILARITY MATRIX---------------------------
----> 2 cosine_sim = linear_kernel(tv_mat, tv_mat)

~/.local/lib/python3.6/site-packages/sklearn/metrics/pairwise.py in linear_kernel(X, Y, dense_output)
    990     """
    991     X, Y = check_pairwise_arrays(X, Y)
--> 992     return safe_sparse_dot(X, Y.T, dense_output=dense_output)
    993 
    994 

~/.local/lib/python3.6/site-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output)
    153     if (sparse.issparse(a) and sparse.issparse(b)
    154             and dense_output and hasattr(ret, "toarray")):
--> 155         return ret.toarray()
    156     return ret
    157 

~/.local/lib/python3.6/site-packages/scipy/sparse/compressed.py in toarray(self, order, out)
   1023         if out is None and order is None:
   1024             order = self._swap('cf')[0]
-> 1025         out = self._process_toarray_args(order, out)
   1026         if not (out.flags.c_contiguous or out.flags.f_contiguous):
   1027             raise ValueError('Output array must be C or F contiguous')

~/.local/lib/python3.6/site-packages/scipy/sparse/base.py in _process_toarray_args(self, order, out)
   1187             return out
   1188         else:
-> 1189             return np.zeros(self.shape, dtype=self.dtype, order=order)
   1190 
   1191 

MemoryError: Unable to allocate 15.4 GiB for an array with shape (45466, 45466) and data type float64

У меня есть 8G RAM и 1G раздел подкачки в системе с Ubuntu 18.04 . Как решить эту проблему? ** Не удается обновить оперативную память достаточно быстро.

  • Я мог бы попробовать это с гораздо меньшим набором данных для начала, но это не решение, которое я ищу .
  • Я мог бы, возможно, разделить tfidf_matrix пополам и вычислить косинусное сходство каждой половины с собой и другой половиной и сложить их вместе. Будет ли это работать?
  • Есть ли более простое решение , которое я мог бы пропустить?

TIA!

1 Ответ

0 голосов
/ 27 февраля 2020

IMO, самое простое решение - просто увеличить пространство подкачки. Я добавил 15G файл подкачки, используя следующие команды по порядку:

sudo fallocate -l 15G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Хотя вычисления выполнялись медленнее, чем в реальной оперативной памяти, это решило мою проблему. Найти подробный ответ здесь

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