Python 使用scikit对文本进行分类

Python 使用scikit对文本进行分类,python,machine-learning,scikit-learn,classification,Python,Machine Learning,Scikit Learn,Classification,我正在为一个项目学习Scikit机器学习,虽然我开始掌握一般过程,但细节仍然有点模糊 早些时候,我设法构建了一个分类器,对其进行训练,并使用测试集对其进行测试。我用cPickle把它保存到磁盘上。现在我想创建一个类来加载这个分类器,让用户用它对单个tweet进行分类 我原以为这很简单,但我似乎从X_new_tfidf=self.tfidf_transformer.fit_transform(fitTweetVec)行中获得ValueError(“维度不匹配”),代码如下: class Tweet

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

早些时候,我设法构建了一个分类器,对其进行训练,并使用测试集对其进行测试。我用cPickle把它保存到磁盘上。现在我想创建一个类来加载这个分类器,让用户用它对单个tweet进行分类

我原以为这很简单,但我似乎从X_new_tfidf=self.tfidf_transformer.fit_transform(fitTweetVec)行中获得ValueError(“维度不匹配”),代码如下:

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的教程对此有点含糊不清。如果有人尽可能清楚地解释它们,我完全支持链接:)

问题是,你的分类器是用固定数量的特征(你以前数据的词汇长度)训练的,现在当你
fit_transform
新推文时,
TfidfTransformer
将产生一个新的词汇表和一系列新的功能,并将代表这个空间中的新tweet

解决方案还包括保存以前安装的
TfidfTransformer
(其中包含旧词汇表),用分类器加载它,然后
转换
(不是
fit_transform
,因为它已经安装到旧数据中)以相同的表示方式加载新的tweet


您还可以使用同时包含
TfidfTransformer
分类器的
管道
,并对
管道
进行pickle处理,这样做更简单,建议使用。

谢谢!让它工作起来。另外,对管道进行酸洗也是一个好主意。