Я пытаюсь построить функцию рекомендации в python3 на основе Mov ie Plot (content), для которой в качестве аргумента используется заголовок mov ie и выводятся фильмы с большинством похожих сюжетов.
Мои спорные данные имеют Форма (45466, 8) Вот так выглядит заголовок спорных данных:
Я использую метод 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!