文本主题分类(TFIDF-朴素贝叶斯分类)
大纲 1.背景介绍 2.文本特征提取 3.朴素贝叶斯主题分类实战
背景介绍:
贝叶斯讲的是一种”逆向概率“,当我们没有上帝视角时,无法准确的预知一个事物本质的时候,可以依靠和事物本质相关的事件来进行推断。一个典型的问题:检测试剂呈阳性时,该患者真的患该病的几率有多大?
一些常见的术语:
先验概率:如基于历史数据得出的某疾病的发病率条件概率(P(B|A)):A条件下,B发生的概率后验概率:根据结果推测原因的概率全概率公式:P(A)=P(B1)*P(A|B1)+P(B2)*P(A|B2)概率乘法公式:P(AB)=P(B)*P(A|B)贝叶斯公式:P(B|A)=P(AB)/P(A)=P(B)*P(A|B) / P(B1)*P(A|B1)+P(B2)*P(A|B2)
朴素贝叶斯:假设每个输入变量是独立的,即P(C1C2C3|A)=P(C1|A)P(C2|A)P(C3|A) 贝叶斯分类模型涉及两种概率:每种类别的概率和每种类别下个属性取值的条件概率 模型的训练过程就是在训练集上计算上述概率值,然后测试时用相应的概率计算待分类样本所属各个类别的概率,以最大的概率进行分类。因此预测过程简单快捷高效。 对数据的处理:
离散数据: 取值类别有限或可数的特征,计算概率十分简单就是数数,计算在某一条件下某一个特征出现的概率即为求解条件概率。 连续数据 取值连续的特征,朴素贝叶斯在处理时默认各个连续特征都服从正态分布,根据训练数据计算每个特征的均值和方差,做测试集预测时,带入正态分布的概率密度公直接计算概率密度值作为该特征出现的概率。PS:如果最总的分类数有N中,那么对每个连续特征而言就有N套(均值,方差)分别对应不同的分类类别。
**
文本特征提取:
** 提取文本特征一般有三种常用的模型:词袋模型、TF-IDF、word2vector 简单介绍:
词袋模型:实质上类同于onehot编码,把所有文档的词装到一个袋子里,构成特征,对具体的一份文档或者句子,若出现该词则对应的特征值取1,否则取0;当然也可以用于统计该次出现的具体次数而不是仅仅标识该词是否出现。TF-IDF:计算每篇文档中每词语的TF-IDF值,作为相应的特征值。TF指词语的词频,计算公式为一份文档中该词出现的次数/该文档总的词汇量数,IDF指逆向文档频率,计算公式为log(总文档数 / (该词出现的文档数+1)),其中+1是做了拉普拉斯平滑,避免分母出现0的错误。TF-IDF就是TF*IDF,它表征的意义可以理解为:一个词语在一份文档中出现的频次深度和出现的文档数的广度的权衡,如果一个词语在一篇文档中频繁出现(TF高),但在其他文档中基本不出现(IDF高),这样的词语或特征就可以比较好的区分不同类型的文档。相反的,类似于“我们”,“了”这类词在一份文档内出现的频次很高(TF高),同时在不同的文档中出现的频次也很高(IDF低,因为公式中是做分母)所以计算出的总的TF-IDF要比较低,相较而言该词对文档的区分度就不是很高。由此,又引出了停用词的概念,停用词就是TF-IDF很低的值,对于分类而言没啥大的帮助,可以提前过滤掉减少计算量。word2vector:是深度网络的一种应用。基本含义为把每个词语映射成一个高纬空间的向量,词义或词性相近的词语映射成的向量比较接近。
朴素贝叶斯分类器实战:文本主题分类
数据详情:train test stop三个文件夹 train和test文件夹中的目录为:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200727115527556.png) 文本内容示例: 具体步骤:
导入工具包
import os
import jieba
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB
编写辅助函数用于读取文本文件内容
def loadfile(filepath,leibie):
'''加载文件内容和标签'''
filelist = os.listdir(filepath)
content = []
label = []
for file in filelist:
with open(filepath+"/"+file,encoding='gb18030')as f:
content.append("".join(jieba.cut(f.read())))
label.append(leibie)
return content,label
获取数据
wenbendir = ['train','test']
currentdir = os.getcwd()
traincontent = []
trainlabel = []
testcontent = []
testlabel = []
for wenben in wenbendir:#['train','test']
# os.chdir(wenben)
wenbenlist = os.listdir(wenben)#【女性,体育,文学,校园】
for leibie in wenbenlist:
content,label=loadfile(wenben+"/"+leibie,leibie)
if wenben=="train":
traincontent += content
trainlabel +=label
elif wenben=='test':
testcontent += content
testlabel +=label
os.chdir(currentdir)
加载停用词
with open('stop/stopword.txt',encoding='utf-8')as file:
stopwords = file.read().split("\n")
stopwords
计算文本特征值
tfidf = TfidfVectorizer(stop_words=stopwords,max_df=0.5)
traindata = tfidf.fit_transform(traincontent)
testdata = tfidf.transform(testcontent)
训练模型与测试
#多项式朴素贝叶斯
nb_model = MultinomialNB(alpha=0.001)
nb_model.fit(traindata,trainlabel)
predict_test = nb_model.predict(testdata)
print("多项式朴素贝叶斯文本分类的准确率为:",metrics.accuracy_score(predict_test,testlabel))
#bernoulli朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
ber_model = BernoulliNB(alpha=0.001)
ber_model.fit(traindata,trainlabel)
ber_predict = ber_model.predict(testdata)
print("bernoulli贝叶斯文本分类的准确率为:",metrics.accuracy_score(ber_predict,testlabel))
#高斯贝叶斯分类器
gauss_model = GaussianNB()
gauss_model.fit(traindata.toarray(),trainlabel)
gauss_predict = ber_model.predict(testdata.toarray())
print("GaussianNB贝叶斯文本分类的准确率为:",metrics.accuracy_score(gauss_predict,testlabel))
测试结果展示: 小结:完成了《数据分析实战45讲》关于贝叶斯算法的实战部分,这里小结一下sklearn中提供的三种贝叶斯模型:GaussianNB BernoulliNB MultinomialNB;高斯朴素贝叶斯适用于处理连续特征的情况,默认各个连续的特征服从正态分布,计算均值和方差;BernoulliNB适用于特征取值为0/1的情况,用于标识该特征是否出现;MultinomialNB适用于离散特征,符合多项式分布,特征取值为TF-IDF或者具体的出现次数等。
|