TFIDF 矩阵上的 SVD returns 奇怪的形状

SVD on TFIDF Matrix returns an odd shape

首要问题: 我认为来自 TfidfVectorizerSparseVectors 模型 TruncatedSVD 上的 运行 fit_transform 会产生尺寸为 (n_samples, n_components ),如 here 所述(跳转到 fit_transform 部分)。

但是,我得到了一个形状矩阵 (n_components, n_words)。

这里是重现问题的一个简单示例:

def build_tfidf_model(corpus):
    transformer = TfidfVectorizer(analyzer='word')
    matrix = transformer.fit_transform(corpus)
    return matrix

def svd_tfidf_matrix(matrix):
    svd = TruncatedSVD(n_components=3)
    svd.fit_transform(matrix)
    return svd.components_


corpus = ['sentence one', 'sentence two', 'another one', 'another sentence', 'two sentence', 'one sentence']
tfidf_model = build_tfidf_model(corpus)
reduced_vectors = svd_tfidf_matrix(matrix=tfidf_model)

因此,tfidf_model.shape 产生 (6, 4)。这对我来说很有意义。我有六个文档的语料库,其中总共包含 4 个不同的词。

然而,reduced_vectors.shape 产生 (3,4)。我期待它的形状是 (6,3).

我一定是误解了调用 fit_transform 应该是 return。我可以要求 SVD 将它变成 return 一个矩阵,其中行是文档,列是减少的 space 中的特征?

如果您想要在变换 space 中表示输入,那么 fit_transform 将 return 该对象。目前你在调用它时没有将结果分配给变量。 model.components_ 属性仅描述如何将 tfidf 向量 space 转换为 svd space.

def svd_tfidf_matrix(matrix):
    svd = TruncatedSVD(n_components=3)
    return svd.fit_transform(matrix)