2014-12-21 79 views
1

我正在使用scikit-learn MultinomialNB和Vectorizer來構建評論是好還是壞的預測模型。用scikit-learn預測電影評論

對標記數據進行培訓後,如何使用它來預測新評論(或現有評論)?我收到下面的錯誤消息。

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.cross_validation import train_test_split 
from sklearn.naive_bayes import MultinomialNB 

X = vectorizer.fit_transform(df.quote) 
X = X.tocsc() 
Y = (df.fresh == 'fresh').values.astype(np.int) 

xtrain, xtest, ytrain, ytest = train_test_split(X, Y) 

clf = MultinomialNB().fit(xtrain, ytrain) 

new_review = ['this is a new review, movie was awesome'] 
new_review = vectorizer.fit_transform(new_review) 

print df.quote[15] 
print(clf.predict(df.quote[10])) #predict existing review in dataframe 
print(clf.predict(new_review)) #predict new review 


Technically, Toy Story is nearly flawless. 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-91-27a0698bbd1f> in <module>() 
    15 
    16 print df.quote[15] 
---> 17 print(clf.predict(df.quote[10])) #predict existing quote in dataframe 
    18 print(clf.predict(new_review)) #predict new review 

//anaconda/lib/python2.7/site-packages/sklearn/naive_bayes.pyc in predict(self, X) 
    60    Predicted target values for X 
    61   """ 
---> 62   jll = self._joint_log_likelihood(X) 
    63   return self.classes_[np.argmax(jll, axis=1)] 
    64 

//anaconda/lib/python2.7/site-packages/sklearn/naive_bayes.pyc in _joint_log_likelihood(self, X) 
    439   """Calculate the posterior log probability of the samples X""" 
    440   X = atleast2d_or_csr(X) 
--> 441   return (safe_sparse_dot(X, self.feature_log_prob_.T) 
    442     + self.class_log_prior_) 
    443 

//anaconda/lib/python2.7/site-packages/sklearn/utils/extmath.pyc in safe_sparse_dot(a, b, dense_output) 
    178   return ret 
    179  else: 
--> 180   return fast_dot(a, b) 
    181 
    182 

TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe' 
+0

只是FYI,這就是所謂的情感分析。而你的問題與你的錯誤沒有多大關係。 – keyser

+0

謝謝,是的,這就是所謂的情感分析。我試圖用clf.predict()預測一個新的評論。可能錯過了一些東西,讓我知道,我可以澄清。 @keyser – ananuc

回答

1

您需要的詞語表示的包傳遞到文本直接predict不能及的。你幾乎正確地使用new_review,只需更改new_review = vectorizer.transform(new_review),(請參閱@Stergios評論)。試試這個:

print(clf.predict(X[10, :])) 
+0

真棒,謝謝!代碼clf.predict(new_review)不起作用,它給我一個錯誤「ValueError:尺寸不匹配」。任何想法? @elyase – ananuc

+0

請將new_review = vectorizer.fit_transform(new_review)更改爲new_review = vectorizer.transform(new_review)。該模型只適用於訓練數據。 – Stergios

+0

很酷,謝謝你們倆! – ananuc