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

时间:2016-10-18 15:32:44

标签: python scikit-learn text-mining tf-idf text-analysis

如果我使用TfidfVectorizer中的sklearn生成要素向量:

features = TfidfVectorizer(min_df=0.2, ngram_range=(1,3)).fit_transform(myDocuments)

我如何生成要素矢量来分类新文档?由于您无法计算单个文档的tf-idf。

使用以下方法提取要素名称是否正确?

feature_names = TfidfVectorizer.get_feature_names()

然后根据feature_names

计算新文档的术语频率

但是我不会得到具有重要信息的权重。

2 个答案:

答案 0 :(得分:3)

您需要保存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)

答案 1 :(得分:0)

我宁愿使用gensim和Latent Semantic Indexing作为原始语料库的包装: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

语料库是词袋

正如你可以在tutorials中读到的那样: LSI培训的独特之处在于我们可以随时提供“培训”,只需提供更多培训文件即可。这是通过在称为在线培训的过程中对底层模型的增量更新来完成的。由于这个特性,输入文档流甚至可能是无限的 - 只需在LSI新文档到达时继续提供,同时将计算的转换模型用作只读!

如果您喜欢sci-kit,gensim也是compatible with numpy