【问题标题】:Classifying text with scikit使用 scikit 对文本进行分类
【发布时间】:2015-03-16 04:40:40
【问题描述】:

我正在为一个项目学习 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 的教程对此有点模棱两可。如果有人尽可能清楚地解释它们,我完全支持链接:)

【问题讨论】:

    标签: python machine-learning scikit-learn classification


    【解决方案1】:

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

    解决方案是同时保存之前拟合的TfidfTransformer(包含旧词汇表),用分类器和.transform(不是fit_transform,因为它已经拟合到旧数据)加载新推文在同一个表示中。

    您也可以使用同时包含TfidfTransformerClassifierPipeline 并腌制Pipeline,这更容易且推荐。

    【讨论】:

    • 谢谢!得到它的工作。酸洗管道也是一个好主意。
    猜你喜欢
    • 2017-08-08
    • 2016-05-16
    • 2015-01-07
    • 2015-02-05
    • 2019-10-08
    • 2017-04-07
    • 2015-07-05
    • 2017-09-30
    • 2014-10-02
    相关资源
    最近更新 更多