如何针对我的NLP朴素贝叶斯分类器测试新单词集

时间:2019-04-19 00:28:19

标签: python nlp data-science text-classification naivebayes

我使用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袋中获得每个单词的所有概率。

先谢谢

1 个答案:

答案 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的管道来组合这两个步骤