【发布时间】:2013-12-08 18:01:41
【问题描述】:
我有一个使用 Sklearn 的 TfidfVectorizer 对象获得的稀疏矩阵:
vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', vocabulary=my_vocab, stop_words='english')
tfidf = vect.fit_transform([my_docs])
稀疏矩阵为(为了概括,去掉了数字):
<sparse matrix of type '<type 'numpy.float64'>'
with stored elements in Compressed Sparse Row format>]
我正在尝试为每一行获取一个数值,以告诉我文档包含我要查找的术语的高度。我真的不在乎它包含哪些单词,我只想知道它包含了多少。所以我想得到每个或 row*row.T 的规范。但是,我很难使用 numpy 来获得这个。
我的第一个方法是简单地做:
tfidf[i] * numpy.transpose(tfidf[i])
但是,numpy 显然不会转置小于一维的数组,因此只会对向量进行平方。所以我试着做:
tfidf[i] * numpy.transpose(numpy.atleast_2d(tfidf[0]))
但是 numpy.transpose(numpy.atleast_2d(tfidf[0])) 仍然不会转置该行。
我继续尝试获得该行的规范(无论如何,这种方法可能更好)。我最初的方法是使用 numpy.linalg。
numpy.linalg.norm(tfidf[0])
但这给了我一个“尺寸不匹配”的错误。所以我尝试手动计算标准。我首先设置一个等于稀疏矩阵的 numpy 数组版本的变量并打印出第一行的 len:
my_array = numpy.array(tfidf)
print my_array
print len(my_array[0])
它正确打印出 my_array,但是当我尝试访问 len 时它告诉我:
IndexError: 0-d arrays can't be indexed
我只是想获取 fit_transform 返回的稀疏矩阵中每一行的数值。获得规范将是最好的。非常感谢这里的任何帮助。
【问题讨论】:
-
它是什么类型的稀疏矩阵?
-
您好,感谢您的回复。我编辑了答案以显示类型。
-
我可以解释最后一个错误:调用
np.array(tfidf)将整个矩阵的 1 元素和 0 维数组作为对象。要使其成为普通数组,请使用tfidf.toarray()或要获取矩阵,请使用tfidf.todense()。 -
太棒了!那行得通,我可以在行上使用 linalg.norm() 。现在我只需要弄清楚如何不使每一行的范数等于 1。我认为整个 tfidf 矩阵正在被归一化,而不是每一行......
-
我想出了一种方法来使用
tfidf.multiply(tfidf).sum(1)获得稀疏形式的规范。有关详细信息,请参阅我的答案。
标签: python arrays numpy matrix norm