AttributeError: 'numpy.ndarray' object has no attribute 'A'

AttributeError: 'numpy.ndarray' object has no attribute 'A'

我正在尝试对矩阵执行 tfidf。我想使用 gensim,但是 models.TfidfModel() 只适用于语料库,因此 returns 一个不同长度的列表列表(我想要一个矩阵)。

选项是以某种方式填充列表列表的缺失值,或者只是将语料库转换为矩阵

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 的地方。但是,我重新导入了该功能。

为什么会这样?

self.Anp.matrixsparse 矩阵。对于这两个 A 的意思,return 的副本是 np.ndarray。换句话说,它将二维矩阵转换为常规的 numpy 数组。如果 self 已经是一个数组,它会产生你的错误。

您似乎已经使用自己的 TFIDF 版本更正了这一点 - 除了使用 2 个变量,mamatrix 而不是 self.A

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

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