2013-02-22 145 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