使用 scikit 对文本进行分类
Classifying text with scikit
我正在为一个项目学习 Scikit 机器学习,虽然我开始掌握一般过程,但细节仍然有点模糊。
早些时候,我设法构建了一个 classifier,训练它并使用测试集对其进行测试。我用 cPickle 将它保存到磁盘。现在我想创建一个 class 加载这个 classifier 并让用户用它 classify 单个推文。
我认为这是微不足道的,但我似乎从 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)
我做错了什么?我在为它制作 classifier 和 运行 测试集时使用了类似的代码。我是不是忘记了一些重要的步骤?
现在我承认我还没有完全理解这里的拟合和 t运行sforming,因为我发现 Scikit 的教程对此有点模棱两可。如果有人知道对它们的尽可能清楚的解释,我完全支持链接:)
问题是你的分类器是用固定数量的特征(你以前数据的词汇长度)训练的,现在当你 fit_transform
新推文时, TfidfTransformer
会产生新的词汇表和新的特征数量,并将代表这条 space.
中的新推文
解决方案是也保存之前拟合的TfidfTransformer
(包含旧词汇),用分类器和.transform
加载它(不是fit_transform
因为它已经拟合到旧数据)以相同的表示形式的新推文。
您也可以使用包含 TfidfTransformer
和 Classifier
的 Pipeline
并 pickle Pipeline
,这样更简单,推荐。
我正在为一个项目学习 Scikit 机器学习,虽然我开始掌握一般过程,但细节仍然有点模糊。
早些时候,我设法构建了一个 classifier,训练它并使用测试集对其进行测试。我用 cPickle 将它保存到磁盘。现在我想创建一个 class 加载这个 classifier 并让用户用它 classify 单个推文。
我认为这是微不足道的,但我似乎从 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)
我做错了什么?我在为它制作 classifier 和 运行 测试集时使用了类似的代码。我是不是忘记了一些重要的步骤?
现在我承认我还没有完全理解这里的拟合和 t运行sforming,因为我发现 Scikit 的教程对此有点模棱两可。如果有人知道对它们的尽可能清楚的解释,我完全支持链接:)
问题是你的分类器是用固定数量的特征(你以前数据的词汇长度)训练的,现在当你 fit_transform
新推文时, TfidfTransformer
会产生新的词汇表和新的特征数量,并将代表这条 space.
解决方案是也保存之前拟合的TfidfTransformer
(包含旧词汇),用分类器和.transform
加载它(不是fit_transform
因为它已经拟合到旧数据)以相同的表示形式的新推文。
您也可以使用包含 TfidfTransformer
和 Classifier
的 Pipeline
并 pickle Pipeline
,这样更简单,推荐。