使用Sklearn的TfidfVectorizer进行转换

37

我试图使用Sklearn的TfidfVectorizer对象获取单个文档的tf-idf向量。我基于一些训练文档创建了一个词汇表,并使用fit_transform来训练TfidfVectorizer。然后,我想要找到任何给定测试文档的tf-idf向量。

from sklearn.feature_extraction.text import TfidfVectorizer

self.vocabulary = "a list of words I want to look for in the documents".split()
self.vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', 
                 stop_words='english')
self.vect.fit_transform(self.vocabulary)

...

doc = "some string I want to get tf-idf vector for"
tfidf = self.vect.transform(doc)
问题在于此函数返回一个有n行的矩阵,其中n是我的文档字符串的大小。我希望它只返回代表整个字符串的单个向量,表示tf-idf。如何使其将字符串视为单个文档,而不是将每个字符视为一个文档?另外,我对文本挖掘非常陌生,如果我在概念上做错了什么,那将是很好的了解。任何帮助都将不胜感激。
1个回答

48
如果您想只针对给定的词汇计算tf-idf,请在TfidfVectorizer构造函数中使用"vocabulary"参数。
vocabulary = "a list of words I want to look for in the documents".split()
vect = TfidfVectorizer(sublinear_tf=True, max_df=0.5, analyzer='word', 
           stop_words='english', vocabulary=vocabulary)

接着,为了适应一个给定的语料库(即一组文档),也就是计算数量,使用fit

vect.fit(corpus)

fit_transform方法是一个缩写,表示

vect.fit(corpus)
corpus_tf_idf = vect.transform(corpus) 

最后,transform 方法接受一个语料库作为参数,所以对于一个单独的文档,您应该将其作为列表传递,否则它会被视为符号的可迭代对象,每个符号表示一个文档。
doc_tfidf = vect.transform([doc])

4
fit_transform和transform有什么区别?我已经读了文档,但不是很明白。我们使用fit_transform来计算文档列表中每个词语的出现次数?然后transform...将这些计数并计算tf-idf向量用于文档列表? fit_transform是一种用于训练模型并转换数据的方法,而transform则是只对已经训练好的模型进行数据转换的方法。我们使用fit_transform来计算文档列表中每个词语的出现次数,然后transform会使用这些计数,并为文档列表计算tf-idf向量。 - Sterling
6
您可以使用 fitfit_transform(请参见更新)来训练 TF-IDF 转换,使用 transform 进行应用而无需更新计数。 - alko
1
当TfidfVectorizer中的vocabulary参数是一个输入变量而不是从语料库中推断出来时,拟合语料库的效果是什么?这是必要的吗? - Moniba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接