用sciki对文本进行分类

2024-10-03 15:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我以为这很简单,但我似乎从X_new_tfidf=得到ValueError('dimension mismatch')自耦变压器.fit_transform(fitTweetVec)行,代码如下:

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的教程对此有点模棱两可。如果有人知道一个尽可能清楚的解释,我完全支持链接:)


Tags: 代码selfnew分类器deftransformopenscikit
1条回答
网友
1楼 · 发布于 2024-10-03 15:27:55

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

解决方案是同样保存先前安装的TfidfTransformer(它包含旧词汇表),用分类器和.transform(不是{},因为它已经被拟合到旧数据中)这个相同表示中的新tweet。在

您还可以使用同时包含TfidfTransformer和{}的Pipeline,并对{}进行pickle,这样做比较简单,建议使用。在

相关问题 更多 >