用scikit对文本进行分类

时间:2015-01-17 19:11:46

标签: python machine-learning scikit-learn classification

我正在学习一个项目的Scikit机器学习,而我开始掌握一般过程,细节仍然有点模糊。

之前我设法构建了一个分类器,训练它并用测试集测试它。我用cPickle将它保存到磁盘。现在我想创建一个加载此分类器的类,并允许用户使用它对单个推文进行分类。

我认为这将是微不足道的,但我似乎从X_new_tfidf = self.tfidf_transformer.fit_transform(fitTweetVec)行获得ValueError('dimension mismatch'),其代码如下:

class TweetClassifier:

classifier = None
vect = TfidfVectorizer()
tfidf_transformer = TfidfTransformer()

#open the classifier saved to disk to be utilized later
def openClassifier(self, name):
    with open(name+'.pkl', 'rb') as fid:
        return cPickle.load(fid)

def __init__(self, classifierName):
    self.classifier = self.openClassifier(classifierName)
    self.classifyTweet(np.array([u"Helvetin vittu miksi aina pitää sataa vettä???"]))

def classifyTweet(self, tweetText):

    fitTweetVec = self.vect.fit_transform(tweetText)
    print self.vect.get_feature_names()
    X_new_tfidf = self.tfidf_transformer.fit_transform(fitTweetVec)
    print self.classifier.predict(X_new_tfidf)

我在这里做错了什么?我在制作分类器并为其运行测试集时使用了类似的代码。我忘记了一些重要的步骤吗?

现在我承认我还没有完全理解这里的拟合和转换,因为我发现Scikit的教程有点含糊不清。如果有人知道尽可能清楚地解释它们,我都是为了链接:)

1 个答案:

答案 0 :(得分:2)

问题是您的分类器是使用固定数量的功能(之前数据的词汇长度)进行培训的,现在当您fit_transform新推文时,TfidfTransformer会生成新的词汇和新的功能,将代表这个领域的新推文。

解决方法是保存以前适合的TfidfTransformer(包含旧词汇表),使用分类器和.transform(不是fit_transform加载它,因为它已经适合旧数据)这个相同表示的新推文。

您还可以使用包含PipelineTfidfTransformer的{​​{1}}并挑选Classifier,这更容易并且推荐使用。