我使用python scikit-learn基于Naive基础构建了NLP分类器
关键是,我希望我的分类器对新文本进行分类“不属于我的任何训练或测试数据集”
在另一个模型中,例如“回归”,我可以提取Theta的值,以便可以预测任何新值。
但是我知道,天真的基于通过计算每个单词针对每个班级的概率来工作。
例如
我的数据集包括(某些文本的1000条记录),例如 “太好了” “ 我喜欢 ” “我不喜欢这部电影” 等等,每个文本都分类为+ ev或-ev
我将数据集分为训练和测试集。一切都很好。现在我想对全新的文本进行分类,例如“哦,我喜欢这部电影,而且音轨非常完美”
如何使我的模型预测此文字!
这是代码
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features=850)
X = cv.fit_transform(corpus).toarray()
y = dataset.iloc[:, 1].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 10)
from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)
y_pred = classifier.predict()
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
现在,我希望能做一些新的文字,例如“好电影,好音轨”和“表演很糟糕”。然后让我的分类器预测它的好坏!
Xnew = [[“好电影,音轨不错”],[“表演很糟糕”]] ynew = classifier.predict(Xnew)
but i get a super error
jointi = np.log(self.class_prior_[i])
436 n_ij = - 0.5 * np.sum(np.log(2. * np.pi * self.sigma_[i, :]))
--> 437 n_ij -= 0.5 * np.sum(((X - self.theta_[i, :]) ** 2) /
438 (self.sigma_[i, :]), 1)
439 joint_log_likelihood.append(jointi + n_ij)
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
我也想知道我能否在我的语料库的NLP袋中获得每个单词的所有概率。
先谢谢
答案 0 :(得分:0)
在将注释传递到模型之前,必须对其向量化。
docs_new = ["good movie and nice sound track", "acting was so bad"]
X_new_counts = cv.transform(docs_new)
classifier.predict(X_new_counts)
获得概率分数
classifier.predict_proba(X_new_counts)
或者,您可以使用sklearn的管道来组合这两个步骤