2015-01-17 3 views
1

나는 프로젝트를위한 Scikit 기계 학습을 배우고 있으며 일반적인 과정을 이해하기 시작하면서 세부 사항은 여전히 ​​약간 퍼지다.scikit으로 텍스트 분류하기

이전에 나는 분류기를 만들고, 훈련하고, 테스트 세트로 테스트했습니다. cPickle로 디스크에 저장했습니다. 이제이 분류자를로드하는 클래스를 만들고이를 사용하여 하나의 트윗을 분류 할 수있게하려고합니다.

나는이 사소한 것이라고 생각하지만 난에 ValueError ('차원 불일치') X_new_tfidf에서 = self.tfidf_transformer.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의 튜토리얼이 약간 모호하다는 것을 알았 기 때문에 필자가 아직 피팅과 변형을 완전히 이해하지 못했다고 인정한다. 누군가가 가능한 한 명확한 설명을 알고 있다면 나는 모두를위한 것이다. :)

답변

2

문제는 분류기가 고정 된 수의 기능 (이전 데이터의 어휘 길이)으로 교육 받았고 이제 새로운 짹짹 fit_transform 일 때 TfidfTransformer은 새로운 어휘와 새로운 기능을 생성하며이 공간에서 새로운 짹짹을 나타냅니다.

이 솔루션은 또한 (구 어휘를 포함) 이전에 장착 TfidfTransformer는, 분류 및 .transform으로로드 저장하는 것입니다 (하지 fit_transform 이미 이전 데이터에 장착 되었기 때문에)이 같은 표현의 새로운 트윗을.

또한 모두 TfidfTransformerClassifier와는 Pipeline 피클이 포함 된 Pipeline을 사용할 수 있습니다,이 쉽고 좋습니다.

+0

감사합니다. 알았어. 또한 파이프 라인을 절이는 것이 좋습니다. – Tumetsu

관련 문제