我正在使用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'>
答案 0 :(得分:10)
这应该简单如下:
dense = X.toarray()
TfIdfVectorizer.fit_transform()
正在返回一个SciPy csr_matrix()
(压缩稀疏行矩阵),它只有toarray()
方法才能实现此目的。 SciPy中有几种稀疏矩阵格式,但它们都有.toarray()
方法。
请注意,对于大型矩阵,与稀疏矩阵相比,这将占用大量内存,因此通常情况下,这是一种尽可能长时间保持稀疏的好方法。