尝试计算 TFIDF 向量上的余弦相似度矩阵时出现内存错误

Memory Error when trying to compute Cosine Similarity Matrix on TFIDF vector

我正在尝试在python3中构建一个基于电影情节(内容)的推荐函数,它以电影标题作为参数并输出与最相似的电影地块。

我整理的数据具有 (45466, 8) 的形状 这就是争论数据的头部:

我正在使用 sklearn.feature_extraction.textTfidVectorizer 中的 fit-transform 方法在 概览 [=58= 上构建所需的 TF-IDF 矩阵] 像这样的功能:

tfidf = TfidfVectorizer(stop_words='english')

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

这会产生一个形状为 (45466, 75827) 的矩阵,用于每部电影的概述,这意味着 - 在删除常见停用词后 - 所有电影的概述汤中有 75827 个不同的词45466 部电影加起来

Post 我想根据上面构造的 tfidf 矩阵计算每部电影的 成对余弦相似度得分 。这应该给我一个 45466 x 45466 矩阵,其中 (i-th, j-th) 单元格是电影 i 和 j 之间的相似度得分。我正在使用 sklearn.metrics.pairwiselinear_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

我在系统 运行 [=82= 上有 8G RAM1G 交换分区 ] 18.04。我该如何解决这个问题?** 无法尽快升级 RAM。

  • 我或许可以尝试使用更小的数据集开始,但这不是我正在寻找的解决方案 .
  • 我也许可以 拆分 tfidf_matrix 并计算每一半与其自身和另一半的余弦相似度 并将它们放回原处。那行得通吗?
  • 是否有我可能遗漏的更简单的解决方案

TIA!

IMO,最简单的解决方案就是增加交换 space。我按顺序使用以下命令添加了一个 15G 交换文件:

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

尽管计算 运行 比实际 RAM 上的计算速度慢,但这确实解决了我的问题。查找详细答案here