如何使TF-IDF矩阵致密



我正在使用TfidfVectorizer将原始文档的集合转换为TF-IDF特征矩阵,然后我计划将其输入到k-means算法中(我将实现)。在该算法中,我必须计算质心(文章类别)和数据点(文章)之间的距离。我将使用欧几里得距离,所以我需要这两个实体具有相同的维度,在我的例子中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'>

这应该像这样简单:

dense = X.toarray()

TfIdfVectorizer.fit_transform()返回一个 SciPy csr_matrix()(压缩稀疏行矩阵),该矩阵具有仅用于此目的的toarray()方法。SciPy 中有几种格式的稀疏矩阵,但它们都有一个.toarray()方法。

请注意,对于大型矩阵,与稀疏矩阵相比,这将使用大量内存,因此通常将其保持稀疏状态是一种好方法。

最新更新