如何使用tf-idf对新文档进行分类?

9
如果我使用来自sklearn的TfidfVectorizer生成特征向量如下:
features = TfidfVectorizer(min_df=0.2, ngram_range=(1,3)).fit_transform(myDocuments)
那么我该如何生成用于分类新文档的特征向量呢?由于无法计算单个文档的TF-IDF,因此这种方法是否正确呢?
是不是应该先用以下代码提取特征名称:
feature_names = TfidfVectorizer.get_feature_names()
然后根据feature_names计算新文档的词频?
但是这样做就无法得到包含单词重要性信息的权重了。
2个回答

11

您需要保存TfidfVectorizer的实例,它将记住用于拟合的术语频率和词汇表。如果不使用fit_transform,而是分别使用fittransform,可能会使事情更加清晰明了:

vec = TfidfVectorizer(min_df=0.2, ngram_range=(1,3))
vec.fit(myDocuments)
features = vec.transform(myDocuments)
new_features = fec.transform(myNewDocuments)

3
最后一行有一个错别字,应该是:new_features = vec.transform(myNewDocuments) - X. L

2
我更倾向于使用gensim作为原始语料库的包装器,其中包含潜在语义索引:bow->tfidf->lsi。
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=300)
corpus_lsi = lsi[corpus_tfidf] # create a double wrapper over the original corpus: bow->tfidf->fold-in-lsi

如果您需要继续培训:
new_tfidf = models.TfidfModel(corpus)
new_corpus_tfidf = new_tfidf[corpus]
lsi.add_documents(another_tfidf_corpus) # now LSI has been trained on corpus_tfidf + another_tfidf_corpus
lsi_vec = model[tfidf_vec] # convert some new document into the LSI space

当语料库是词袋模型时,正如您可以在他们的 教程 中阅读到的那样: LSI训练具有独特性,我们可以通过提供更多的训练文档来任意时刻继续“训练”。这是通过增量更新底层模型来完成的,在一个称为在线训练的过程中。由于这个功能,输入的文档流甚至可能是无限的——只要不断地将新文档馈送给LSI,同时在此期间使用计算出的转换模型作为只读即可! 如果您喜欢Sci-kit,Gensim也与NumPy 兼容

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