有一个包含项目描述的大型数据集。它包含商品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以及如何处理吗?
答案 0 :(得分:0)
发生MemoryError的原因是,无论输出是存储在稀疏矩阵还是密集矩阵中,输出(a)都非常大,并且(b)密集。
(a)如果输入包含n个项目,则存在计算和返回的n *(n-1)个相似点。 (因为sim(i,j)= sim(j,i),所以实际上只有n *(n-1)/ 2个相似度,但是矩阵将每个相似度列出两次。)如果有300336个项,则所得矩阵将包含90个十亿个条目。我相信大约有720 G的空间。
(b)如果这些条目大多数都是0,那么稀疏矩阵将节省空间。但是,相似性得分通常并非如此。例如,仅对于共有0个单词的项对,余弦(i,j)将为0。