AttributeError:' numpy.ndarray'对象没有属性' A'

时间:2015-06-22 06:41:44

标签: python numpy matrix gensim

我正在尝试在矩阵上执行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获取的地方。但是,我重新导入了这个功能。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

self.Anp.matrixsparse矩阵。对于A两种方式,都要返回np.ndarray的副本。换句话说,它将2d矩阵转换为常规numpy数组。如果self已经是数组,则会产生错误。

您似乎已使用自己的TFIDF版本更正了此问题 - 除了使用2个变量mamatrix而不是self.A

我认为您需要更多地查看错误消息和堆栈,以确定.A的位置。还要确保您了解代码期望矩阵的位置,尤其是稀疏矩阵。在这方面你自己的代码是否不同。

我从其他SO问题中回忆起其中一个学习包已经切换到使用稀疏矩阵,并且需要在其代码中添加.todense()(预期密集的代码)。