2013-02-22 142 views
3

我开始处理稀疏矩阵,所以我对这个主题不太熟练。我的问题是,我从单词列表中找到一个简单的coo-occurrences矩阵,就是一个二维同现矩阵,通过单词来计算一个单词在同一个上下文中出现多少次。矩阵相当稀疏,因为语料库不是那么大。我想将它转换为稀疏矩阵,以便能够更好地处理它,最终在事后做一些矩阵乘法运算。在这里我做了什么到现在为止(仅第一部分,剩下的只是输出格式和清理数据):如何将共生矩阵转换为稀疏矩阵

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数组吗?什么是最好的方式来做到这一点。我想比较许多处理矩阵的方法。

如果有人能让我朝着这个方向发展,那将会很好。

+0

[this](http://docs.scipy.org/doc/scipy/reference/sparse.html)应该是有用的给你。如果你没有对你的字典做任何事情,我会说直接把它放在矩阵中。 – Raufio 2013-02-22 18:00:07

+0

Yeap,但我也想通过单词映射出现的同现,如果我将语料库直接放入矩阵,这样做会起作用吗?我不信。 – 2013-02-22 20:42:48

回答

7

这里是你如何在SciPy的首席运营官格式的文档集,这也是(*)的易用性和效率之间取得较好的折中构建一个文档长期矩阵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。 (我是这两个项目的贡献者,所以这可能不是没有偏见的建议。)

+0

哦,是的,我听说过scikit-learn,但我还没有尝试过。我猜A.t * A意思是:转置A * A,对吗?有什么简单的方法来实现这个在python中? – 2013-02-22 18:58:43

+0

@El_Patrón:'A.T'是用于转置的Numpy/Scipy语法;只需复制粘贴表达式就像我输入它:) – 2013-02-22 19:56:48

+0

好的,谢谢。我遇到了“extract_terms(doc)”的一些问题,我是否在这里丢失了模块? – 2013-02-22 20:40:07