有效地从字典子集填充SciPy稀疏矩阵
我需要在几个14000x10000的矩阵中存储单词共现的计数。因为我知道这些矩阵会很稀疏,而且我的内存不够用来存储所有的密集矩阵,所以我选择用scipy.sparse矩阵来存储它们。
我发现使用Counter对象来收集计数是最有效的方法。现在我需要把这些计数从Counter对象转移到稀疏矩阵中,但这个过程太慢了。目前填充这些矩阵大约需要18个小时。
我使用的代码大致如下:
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_counts
是一个scipy.sparse.lil_matrix对象,word_counters
是一个计数器的字典,而wordlist1
和wordlist2
是字符串的列表。
有没有什么方法可以更高效地完成这个操作呢?
1 个回答
2
你正在使用LIL矩阵,但不幸的是,它的插入算法需要线性时间。因此,以这种方式构建它们会花费平方时间。你可以试试DOK矩阵,它使用哈希表来存储数据。
不过,如果你对布尔术语的出现次数感兴趣,那么如果你有一个稀疏的术语-文档矩阵,计算共现矩阵会快得多。假设A
是一个形状为(n_documents, n_terms)
的矩阵,那么共现矩阵是
A.T * A