如果我使用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
?
但是这样我就不会得到包含单词重要性信息的权重
您需要保存TfidfVectorizer的实例,它将记住用于适合它的术语频率和词汇表。如果不使用fit_transform
,而单独使用fit
和transform
,可能会使事情更有意义:
vec = TfidfVectorizer(min_df=0.2, ngram_range=(1,3))
vec.fit(myDocuments)
features = vec.transform(myDocuments)
new_features = fec.transform(myNewDocuments)
我宁愿使用带有潜在语义索引的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