假设前提 特征词之间相互独立
文档分类贝叶斯公式 C:文本类别,W:文本特征(特征是文本中包含的词,可采用重要性度量获取前k个词作为特征,特征的值为词出现的次数) P( C ):每个文本类别的概率(某文本类别的词数/总文本词数) P(W|C):给定类别条件下文本特征的概率 每个特征词在给定类别条件下概率的计算方法: Ni:特征词F1在C类别文档中出现的总次数 N:C类别文档中所有词出现的总次数
实例
特征词科技娱乐汇总商场95160影院85664支付宝201535云计算63063汇总100121221 预测出现“影院”、“支付宝”、“云计算”三个特征词的文档属于科技、娱乐类的概率 设F1:影院,F2:支付宝,F3:云计算,则W = F1,F2,F3 基于特征词之间相互独立的假设 由于对于同一文档特征词相同因此P(W)相同,根据上述公式对于求文档类别的概率,P(W)可视为常数,真正影响实际概率大小的为分子,因此在计算概率时可不做除以P(W)的处理。预测属于科技类的概率:设类别为Cs,则其概率可近似为 预测属于娱乐类的概率:由于在娱乐类中特征词"云计算"并未出现,根据上述公式可知预测娱乐类的概率为0,这是不符合常理的,我们不能因为某文档未出现某词而判定文档属于某个类别的概率为0,为解决该问题我们引入了拉普拉斯平滑系数。拉普拉斯平滑系数(解决因某词不在文档中而导致的概率为0问题) 引入拉普拉斯系数后,每个特征词在给定类别条件下概率的计算方法: α : 拉 普 拉 斯 平 滑 系 数 、 m : 特 征 词 个 数 \alpha:拉普拉斯平滑系数 、 m:特征词个数 α:拉普拉斯平滑系数、m:特征词个数 由此可避免概率为0的情况。 sklearn模块使用"""以20类新闻数据集为例""" from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.navie_bayes import MultinomialNB from sklearn.metrics import classification_report def naviebayes(): """朴素贝叶斯进行文本分类""" news = fetch_20newsgroups(subset='all') # 进行数据分割 x_train, x_test, y_train, y_test = train_test_split(\ news.data, news.target, test_size=0.25) # 对数据集进行特征抽取 tf = TfidfVectorizer() # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d'] x_train = tf.fit_transform(x_train) print(tf.get_feature_names()) x_test = tf.transform(x_test) # 进行朴素贝叶斯算法的预测 mlt = MultinomialNB(alpha=1.0) print(x_train.toarray()) mlt.fit(x_train, y_train) y_predict = mlt.predict(x_test) print("预测的文章类别为:", y_predict) # 得出准确率 print("准确率为:", mlt.score(x_test, y_test)) print("每个类别的精确率和召回率:", classification_report(\ y_test, y_predict,target_names=news.target_names)) return None