使用 Sklearn 的 TfidfVectorizer 变换

Posted

技术标签:

【中文标题】使用 Sklearn 的 TfidfVectorizer 变换【英文标题】:Using Sklearn's TfidfVectorizer transform 【发布时间】:2013-12-06 13:52:45 【问题描述】:

我正在尝试使用 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】:

如果您只想为给定词汇计算 tf-idf,请使用 vocabulary 参数到 TfidfVectorizer 构造函数,

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)

然后,要使用给定的corpus(即可迭代的文档)拟合(即计算计数),请使用fit

vect.fit(corpus)

方法 fit_transform

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

最后,transform 方法接受语料库,因此对于单个文档,您应该将其作为列表传递,或者将其视为符号的可迭代,每个符号都是一个文档。

doc_tfidf = vect.transform([doc])

【讨论】:

那么fit_transform和transform有什么区别呢?我已经阅读了文档,但我不太清楚。我们使用 fit_transform 来计算文档列表中每个术语的出现次数?然后转换...获取这些计数并计算文档列表的 tf-idf 向量? @Sterling 您使用 fitfit_transform(请参阅更新)来训练 tfidf 转换,并使用 transform 应用而无需更新计数 当 TfidfVectorizer 中的词汇参数是输入变量,而不是从语料库中推断出来的,那么在语料库上拟合的效果是什么?有必要吗?

以上是关于使用 Sklearn 的 TfidfVectorizer 变换的主要内容,如果未能解决你的问题,请参考以下文章

sklearn.svm在建立好模型后怎么使用

sklearn使用小贴士

sklearn.svm在建立好模型后怎么使用

为啥这段代码不用import sklearn就可以使用sklearn函数?

当我应该使用其中之一时,“sklearn.cluster.k_means”和“sklearn.cluster.KMeans”有啥区别?

Sklearn:使用 CalibratedClassifierCV 校准多标签分类