[当我表演时,我大约有100,000篇长文章,总共约5GB的文本
TfidfVectorizer
来自sklearn,它构建了一个6GB的模型。那怎么可能?难道我们只需要存储那4000个单词的文档频率以及那4000个单词是什么?我猜想TfidfVectorizer为每个文档存储这样的4000维向量。是否可能以某种方式错误地设置了某些设置?
TF-IDF矩阵的形状是(文档数,唯一字数)。因此,对于每个文档,您都会从数据集中获得每个单词的功能。对于大型数据集,它可能会肿。
根据您的情况(100000 (docs) * 4000 (words) * 4 (np.float64 bytes))/1024**3 ~ 1.5 Gb
此外,默认情况下,Scipy TfidfVectorizer尝试使用稀疏矩阵(scipy.sparse.csr.csr_matrix)对其进行补偿。即使对于长文档,矩阵也倾向于包含很多零。因此它通常比原始尺寸小一个订单。如果我是正确的话,它应该小于1.5 GB。
因此是问题。您的模型中确实只有4000个字(由TfidfVectorizer(max_features=4000)
控制吗?
如果您不关心单个单词的频率,则可以使用PCA或其他技术来减小矢量大小。
dense_matrix = tf_idf_matrix.todense()
components_number = 300
reduced_data = PCA(n_components=300).fit_transform(dense_matrix)
或者您可以使用诸如doc2vec之类的东西。 https://radimrehurek.com/gensim/models/doc2vec.html
使用它,您将得到形状的矩阵(文档数,嵌入大小)。嵌入大小通常在(100到600)之间。您可以使用dbow_words
参数训练doc2vec模型而无需存储单个单词向量。
如果您关心单个单词的功能,我看到的唯一合理的解决方案是减少单词的数量。
相关的stackoverflow帖子:
----关于减少二值性
How do i visualize data points of tf-idf vectors for kmeans clustering?
----使用发电机训练TFIDF时
Sklearn TFIDF on large corpus of documents
How to get tf-idf matrix of a large size corpus, where features are pre-specified?