使用计数和tfidf作为scikit learn的特征

8

我正在尝试在多项式朴素贝叶斯模型中同时使用计数和tfidf作为特征。以下是我的代码:

text = ["this is spam", "this isn't spam"]
labels = [0,1]
count_vectorizer = CountVectorizer(stop_words="english", min_df=3)

tf_transformer = TfidfTransformer(use_idf=True)
combined_features = FeatureUnion([("counts", self.count_vectorizer), ("tfidf", tf_transformer)]).fit(self.text)

classifier = MultinomialNB()
classifier.fit(combined_features, labels)

但是我在使用FeatureUnion和tfidf时遇到了错误:
TypeError: no supported conversion for types: (dtype('S18413'),)

有什么想法,为什么会出现这种情况?同时使用计数和tfidf作为特征不可能吗?
1个回答

12

错误并不是来自于 FeatureUnion,而是来自于 TfidfTransformer

你应该使用 TfidfVectorizer 而不是 TfidfTransformer,因为转换器需要一个numpy数组作为输入而不是纯文本,这就解释了 TypeError的原因

另外,你的测试句子太短了,用一个更大的句子来进行Tfidf测试,这里是一个例子:

from nltk.corpus import brown

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.pipeline import FeatureUnion
from sklearn.naive_bayes import MultinomialNB

# Let's get more text from NLTK
text = [" ".join(i) for i in brown.sents()[:100]]
# I'm just gonna assign random tags.
labels = ['yes']*50 + ['no']*50
count_vectorizer = CountVectorizer(stop_words="english", min_df=3)
tf_transformer = TfidfVectorizer(use_idf=True)
combined_features = FeatureUnion([("counts", count_vectorizer), ("tfidf", tf_transformer)]).fit_transform(text)
classifier = MultinomialNB()
classifier.fit(combined_features, labels)

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