使用 scikit 对文本进行分类



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

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

我认为这将是微不足道的,但我似乎从 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将产生一个新的词汇表和新的特征数量,并将在这个空间中表示新的推文。

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

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

相关内容

  • 没有找到相关文章

最新更新