首要问题:我认为在模型上运行fit_transform
TruncatedSVD
在TfidfVectorizer
的SparseVectors
上运行将产生维度(n_samples,n_components)的组件,如此处所述(跳转到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
应该返回什么召唤。我可以调用什么SVD
让它返回一个矩阵,其中行是文档,列是缩减空间中的要素?
转换空间中表示输入,则fit_transform将返回该对象。当前,您正在调用它而不将结果分配给变量。model.components_属性仅描述如何将 tfidf 向量空间转换为 svd 空间。
def svd_tfidf_matrix(matrix):
svd = TruncatedSVD(n_components=3)
return svd.fit_transform(matrix)