python - python中的内存错误TFIDF余弦相似度
问题描述
有一个包含项目描述的大型数据集。它包含项目 ID 和它的文本描述。可以为描述中的术语的 tf_idf 值构建一个余弦相似度矩阵。
我的数据集包含 300336 个项目的描述。尝试执行我的 python 代码时出现 MemmoryError:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import *
tf = TfidfVectorizer(analyzer='word',
ngram_range=(1, 1),
min_df=0)
tfidf_mx = tf.fit_transform(df.text)
cosine_similarities = linear_kernel(tfidf_mx)
我也尝试过另一种方式
sim_mx = cosine_similarity(tfidf_mx, dense_output=False)
但它也给了我一个 MemoryError 。
即使在用于余弦相似度计算的稀疏矩阵上也可能存在上限?
你知道为什么会出现 MemoryError 以及如何处理吗?
解决方案
发生 MemoryError 是因为输出 (a) 大得离谱且 (b) 密集,无论它是存储在稀疏矩阵还是密集矩阵中。
(a) 如果输入包含 n 个项目,则计算和返回有 n * (n - 1) 个相似度。(由于 sim(i, j) = sim(j, i),实际上只有 n * (n - 1) / 2 个相似点,但矩阵将每个相似点列出两次。)对于 300336 个项目,生成的矩阵将包含 90亿条目。我相信这大约是 720 G 的空间。
(b) 如果这些条目中的大多数为 0,那么稀疏矩阵将节省空间。但通常情况下,相似度得分并非如此。例如,余弦(i,j) 将为 0,仅适用于具有 0 个共同词的项目对。
推荐阅读
- vim - 如何在 vim 的终端模拟器中打开文件
- python - 信号处理程序中的 exit(1) 只是被捕获为 SystemExit,因为它没有任何内容
- python - 如何在 tkinter 上使用填充圆角按钮
- excel - ADO 连接到打开的 Excel 工作簿
- html - 在Vue中输入文本字段时光标跳出
- tableau-api - 使用 REST API 将 PLM 工具连接到 Tableau
- javascript - 使用 JS 在悬停时显示文本
- javascript - 替换所有 HREF 标记的字符串将从 HREF 内部取值
- reactjs - 将对象传递给子组件会丢失其属性和方法
- reactjs - 抽屉标题中的antd浮动图标