我有一个稀疏矩阵,是通过使用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>]
我将尝试为每一行获取一个数字值,以告诉我文档中包含我正在查找的术语的数量有多高。我并不在意它包含哪些单词,我只想知道它包含了多少个单词。因此,我希望获得每行或行*行.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数组版本,并打印第一行的长度:
my_array = numpy.array(tfidf)
print my_array
print len(my_array[0])
它正确地打印出了我的数组,但当我尝试访问长度时,它告诉我:
IndexError: 0-d arrays can't be indexed
我只是想获取fit_transform返回的稀疏矩阵中每行的数字值,最好能得到范数。非常感谢您的帮助。
np.array(tfidf)
会将整个矩阵作为对象生成一个1元素和0维数组。要将其转换为普通数组,请使用tfidf.toarray()
,或者要获取矩阵,请使用tfidf.todense()
。 - askewchansparse
形式获取范数的方法,即tfidf.multiply(tfidf).sum(1)
。请查看我的答案以获取更多细节。 - askewchan