Python 从字典子集高效地填充SciPy稀疏矩阵
我需要在几个14000x1000矩阵中存储单词共现计数。因为我知道矩阵是稀疏的,并且我没有足够的RAM来存储它们作为密集矩阵,所以我将它们存储为scipy.sparse矩阵 我已经找到了使用计数器对象收集计数的最有效方法。现在我需要将计数从计数器对象转移到稀疏矩阵,但这需要花费太长时间。目前填充矩阵需要18个小时 我使用的代码大致如下:Python 从字典子集高效地填充SciPy稀疏矩阵,python,python-2.7,scipy,counter,sparse-matrix,Python,Python 2.7,Scipy,Counter,Sparse Matrix,我需要在几个14000x1000矩阵中存储单词共现计数。因为我知道矩阵是稀疏的,并且我没有足够的RAM来存储它们作为密集矩阵,所以我将它们存储为scipy.sparse矩阵 我已经找到了使用计数器对象收集计数的最有效方法。现在我需要将计数从计数器对象转移到稀疏矩阵,但这需要花费太长时间。目前填充矩阵需要18个小时 我使用的代码大致如下: for word_ind1 in range(len(wordlist1)): for word_ind2 in range(len(wordlist2
for word_ind1 in range(len(wordlist1)):
for word_ind2 in range(len(wordlist2)):
word_counts[word_ind2, word_ind1]=word_counters[wordlist1[word_ind1]][wordlist2[word_ind2]]
其中,word\u counts
是scipy.sparse.lil\u矩阵对象,word\u counters
是计数器字典,wordlist1
和wordlist2
是字符串列表
有什么方法可以更有效地执行此操作吗?您使用的是LIL矩阵,不幸的是,它有一个线性时间插入算法。因此,以这种方式构建它们需要二次时间。尝试使用DOK矩阵,它们使用哈希表进行存储 但是,如果您对布尔项出现感兴趣,那么如果您有稀疏项文档矩阵,则计算共现矩阵的速度要快得多。假设
A
是这样一个形状矩阵(n_文档,n_术语)
,则共现矩阵为
A.T * A
什么是
word\u counts
?这是我试图填充的稀疏矩阵。我刚刚编辑了这个问题来说明这一点。很明显,但是什么类型的稀疏矩阵?再次编辑说它是一个lil_矩阵。尝试其他类型的稀疏矩阵可能是值得的,但SciPy文档表示,建议使用这种类型的矩阵进行增量填充,并且如果稀疏结构在填充过程中发生变化,那么它们仍然存在吗?我接受了一个补丁,该补丁改变了LIL矩阵的建议,因为除非对项目进行预排序,否则实际构建它们可能非常昂贵。dok_矩阵类型的速度要快得多。谢谢你的回答。