web-dev-qa-db-ja.com

TF-IDF行列を密にする方法は?

TfidfVectorizer を使用して、生のドキュメントのコレクションをTF-IDF機能のマトリックスに変換し、それをk-meansアルゴリズム(実装します)に入力する予定です。 。そのアルゴリズムでは、重心(記事のカテゴリ)とデータポイント(記事)の間の距離を計算する必要があります。ユークリッド距離を使用するので、これら2つのエンティティは同じ次元である必要があります。私の場合はmax_features。これが私が持っているものです:

tfidf = TfidfVectorizer(max_features=10, strip_accents='unicode', analyzer='Word', stop_words=stop_words.extra_stopwords, lowercase=True, use_idf=True)
X = tfidf.fit_transform(data['Content']) # the matrix articles x max_features(=words)
for i, row in enumerate(X):
    print X[i]

ただし、出力は次のとおりであるため、Xはスパース(?)行列のようです。

  (0, 9)    0.723131915847
  (0, 8)    0.090245047798
  (0, 6)    0.117465276892
  (0, 4)    0.379981697363
  (0, 3)    0.235921470645
  (0, 2)    0.0968780456528
  (0, 1)    0.495689001273

  (0, 9)    0.624910843051
  (0, 8)    0.545911131362
  (0, 7)    0.160545991411
  (0, 5)    0.49900042174
  (0, 4)    0.191549050212

  ...

ここで私は思う(0, col)は、マトリックス内の列インデックスを示します。これは、実際には配列のようであり、すべてのセルがリストを指します。

この行列を密な行列に変換するにはどうすればよいですか(すべての行が同じ数の列を持つように)?


>print type(X)
<class 'scipy.sparse.csr.csr_matrix'>
9
gsamaras

これは次のように単純である必要があります。

_dense = X.toarray()
_

TfIdfVectorizer.fit_transform()はSciPyを返しています csr_matrix() (Compressed Sparse Row Matrix)、これにはこの目的のためだけにtoarray()メソッドがあります。 SciPyにはスパース行列のいくつかの形式がありますが、それらはすべて .toarray() メソッドを持っています。

大きな行列の場合、これは疎行列と比較して膨大な量のメモリを使用するため、一般に、可能な限り疎のままにしておくことをお勧めします。

12
Will