52

次のタイプのスキーマを含む Sqlite データベースがあります。

termcount(doc_num, term , count)

このテーブルには、ドキュメント内のそれぞれのカウントを持つ用語が含まれています。お気に入り

(doc1 , term1 ,12)
(doc1, term 22, 2)
.
.
(docn,term1 , 10)

各ドキュメントにはゼロ以外の値を持つ用語がほとんど含まれていないため、このマトリックスはスパース マトリックスと見なすことができます。

コサイン類似度を使用してドキュメント間の類似度を計算する必要があるため、numpy を使用してこの疎行列から密行列を作成するにはどうすればよいでしょうか。

この密行列は、最初の列として docid を持ち、すべての用語が最初の行としてリストされ、残りのセルにはカウントが含まれるテーブルのように見えます。

4

2 に答える 2

99
 from scipy.sparse import csr_matrix
 A = csr_matrix([[1,0,2],[0,3,0]])
 >>>A
 <2x3 sparse matrix of type '<type 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>
 >>> A.todense()
   matrix([[1, 0, 2],
           [0, 3, 0]])
 >>> A.toarray()
      array([[1, 0, 2],
            [0, 3, 0]])

これは、疎行列をscipyから取得した密行列に変換する方法の例です

于 2013-05-12T09:03:53.843 に答える
11

Pandasを使用してこの問題を解決しました。ドキュメント ID と用語 ID を保持したいからです。

from pandas import DataFrame 

# A sparse matrix in dictionary form (can be a SQLite database). Tuples contains doc_id        and term_id. 
doc_term_dict={('d1','t1'):12, ('d2','t3'):10, ('d3','t2'):5}

#extract all unique documents and terms ids and intialize a empty dataframe.
rows = set([d for (d,t) in doc_term_dict.keys()])  
cols = set([t for (d,t) in doc_term_dict.keys()])
df = DataFrame(index = rows, columns = cols )
df = df.fillna(0)

#assign all nonzero values in dataframe
for key, value in doc_term_dict.items():
    df[key[1]][key[0]] = value   

print df

出力:

    t2  t3  t1
d2  0  10   0
d3  5   0   0
d1  0   0  12
于 2014-08-02T03:49:05.243 に答える