我正在尝试在矩阵上执行tfidf。我想使用gensim,但models.TfidfModel()
仅适用于语料库,因此返回不同长度的列表列表(我想要一个矩阵)。
选项是以某种方式填写列表列表的缺失值,或者只是将语料库转换为矩阵
numpy_matrix = gensim.matutils.corpus2dense(corpus, num_terms=number_of_corpus_features)
选择后者,然后尝试将此计数矩阵转换为tf-idf加权矩阵:
def TFIDF(m):
#import numpy
WordsPerDoc = numpy.sum(m, axis=0)
DocsPerWord = numpy.sum(numpy.asarray(m > 0, 'i'), axis=1)
rows, cols = m.shape
for i in range(rows):
for j in range(cols):
amatrix[i,j] = (amatrix[i,j] / WordsPerDoc[j]) * log(float(cols) / DocsPerWord[i])
但是,我收到错误AttributeError: 'numpy.ndarray' object has no attribute 'A'
我从另一个脚本复制了上面的函数。那是:
def TFIDF(self):
WordsPerDoc = sum(self.A, axis=0)
DocsPerWord = sum(asarray(self.A > 0, 'i'), axis=1)
rows, cols = self.A.shape
for i in range(rows):
for j in range(cols):
self.A[i,j] = (self.A[i,j] / WordsPerDoc[j]) * log(float(cols) / DocsPerWord[i])
我相信它是从A
获取的地方。但是,我重新导入了这个功能。
为什么会这样?
答案 0 :(得分:0)
self.A
是np.matrix
或sparse
矩阵。对于A
两种方式,都要返回np.ndarray
的副本。换句话说,它将2d矩阵转换为常规numpy数组。如果self
已经是数组,则会产生错误。
您似乎已使用自己的TFIDF
版本更正了此问题 - 除了使用2个变量m
和amatrix
而不是self.A
。
我认为您需要更多地查看错误消息和堆栈,以确定.A
的位置。还要确保您了解代码期望矩阵的位置,尤其是稀疏矩阵。在这方面你自己的代码是否不同。
我从其他SO问题中回忆起其中一个学习包已经切换到使用稀疏矩阵,并且需要在其代码中添加.todense()
(预期密集的代码)。