如何将共生矩阵转换为稀疏矩阵

时间:2013-02-22 17:36:49

标签: python scipy sparse-matrix

我开始处理稀疏矩阵,所以我对这个主题并不十分精通。我的问题是,我从单词列表中得到一个简单的共现矩阵,只是一个二维共生矩阵,逐字逐句计算一个单词在同一个上下文中出现的次数。由于语料库不是很大,所以矩阵非常稀疏。我想将它转换为稀疏矩阵,以便能够更好地处理它,最后做一些矩阵乘法。这是我到目前为止所做的事情(仅第一部分,其余部分只是输出格式和清洁数据):

def matrix(from_corpus):    
d = defaultdict(lambda : defaultdict(int))
        heads = set() 
        trans = set()
        for text in corpus:
            d[text[0]][text[1]] += 1
            heads.add(text[0])
            trans.add(text[1])

        return d,heads,trans

我的想法是创建一个新功能:

def matrix_to_sparse(d):
    A = sparse.lil_matrix(d)

这有什么意义吗?然而,这不起作用,不知道我怎么没有获得稀疏矩阵的方式。我应该更好地使用numpy数组吗?什么是最好的方法来做到这一点。我想比较很多处理矩阵的方法。

如果有人能让我朝着这个方向前进,那就太好了。

1 个答案:

答案 0 :(得分:7)

以下是如何使用SciPy的COO格式从一组文档构建文档术语矩阵A,这是易用性和效率之间的良好折衷(*):

vocabulary = {}  # map terms to column indices
data = []        # values (maybe weights)
row = []         # row (document) indices
col = []         # column (term) indices

for i, doc in enumerate(documents):
    for term in doc:
        # get column index, adding the term to the vocabulary if needed
        j = vocabulary.setdefault(term, len(vocabulary))
        data.append(1)  # uniform weights
        row.append(i)
        col.append(j)

A = scipy.sparse.coo_matrix((data, (row, col)))

现在,要获得一个共生矩阵:

A.T * A

(忽略对角线,它保持术语与自身共存,即平方频率)。

或者,请使用一些为您执行此类操作的程序包,例如Gensimscikit-learn。 (我是这两个项目的贡献者,所以这可能不是公正的建议。)