我目前想使用python中的余弦相似度和Tfidf功能来计算全对文档相似度。我的基本方法如下:
from sklearn.feature_extraction.text import TfidfVectorizer
#c = [doc1, doc2, ..., docn]
vec = TfidfVectorizer()
X = vec.fit_transform(c)
del vec
Y = X * X.T
工作正常,但不幸的是,不适用于我的大型数据集。X的尺寸为(350363, 2526183)
,因此输出矩阵Y应该具有(350363, 350363)
。由于tfidf功能,X非常稀疏,因此很容易装入内存(仅2GB左右)。但是,乘法在运行一段时间后给了我一个内存错误(即使内存未满,但我认为scipy非常聪明,以至于无法预期内存使用情况)。
我已经尝试过使用dtypes并没有成功。我还确保numpy和scipy链接了它们的BLAS库-但这不会对csr_matrix点功能产生影响,因为它是在C语言中实现的。我想也许会使用诸如memmap之类的东西,但是我不确定那。
有谁知道如何最好地解决这个问题?
您可能需要查看random_projection
scikit-learn中的模块。在约翰逊Lindenstrauss引理说,随机投影矩阵是保证维持成对距离高达一些宽容eta
,这是一个超参数,当你计算出所需的随机投影的数量。
长话短说,SparseRandomProjection
这里看到的scikit-learn类是为您执行此操作的转换器。如果在X上运行它,vec.fit_transform
您应该会看到功能尺寸的相当大的减少。
的公式sklearn.random_projection.johnson_lindenstrauss_min_dim
表明,要保留高达10%的公差,您只需要johnson_lindenstrauss_min_dim(350363, .1)
10942个特征。这是一个上限,因此您可以花更少的钱就可以逃脱。即使是1%的公差,也只需要johnson_lindenstrauss_min_dim(350363, .01)
1028192个功能,这仍然比您现在拥有的功能要少得多。
编辑:尝试简单-如果您的数据是dtype ='float64',请尝试使用'float32'。仅此一项就可以节省大量空间,尤其是在您不需要双精度的情况下。
如果问题是您也不能在内存中存储“最终矩阵”,我建议您在HDF5Store中使用数据(如在使用pytables的熊猫中所见)。该链接具有一些不错的入门代码,您可以迭代地计算点乘积的大块并写入磁盘。我最近在一个45GB数据集的项目中广泛使用了此方法,如果您决定采用这种方法,可以提供更多帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句