基于朴素贝叶斯实现文本分类
数据集介绍
数据集为网上公开的新闻数据,其中数据集包含10个类别。
模型选择
贝叶斯分类贝叶斯公式朴素贝叶斯拉普拉斯平滑引入某个属性的条件概率为0,则会导致整体概率为0,为了避免这个情况,拉普拉斯平滑参数主要是将条件概率为0的属性设置为固定值
文本分类过程
sklearn包名介绍 sklearn.metrics: Metrics 度量(主要各种指标)Model Selection Interface
Classification metrics
Regression metrics
Multilabel ranking metrics
Clustering metrics
Biclustering metrics
Pairwise metricssklearn.naive_bayes: Naive Bayes 朴素贝叶斯
导入包:
import randomimport jiebafrom sklearn import model_selectionfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import accuracy_score, classification_reportimport re, string #re库是Python关于正则表达式的一个内置模块,用于字符串匹配
数据准备
数据预处理:主要是去除文本中的标点符号,并分词
jieba分词,主要是过滤其中特殊字符
def text_to_words(file_path):sentences_arr=[]lab_arr=[]with open(file_path,"r",encoding="utf-8")as f:for line in f.readlines():lab_arr.append(line.split("_!_")[1])#line.split语法,line.split("str")[n],n为返回索引sentence = line.split("_!_")[-1].strip()#移除字符串头尾指定字符sentence = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()《》:]+", "",sentence) #去除标点符号,替换为空sentence=jieba.lcut(sentence,cut_all=False)sentence_arr.append(sentence)return sentence_arr,lab_arr
加载停用词表
def load_stopwords(file_path):stopwords=[line.strip() for line in open(file_path,encoding="utf8").readlines()]return stopwords
遍历数据,去除停用词,统计词频,生成字典
def get_dict(sentence_arr,stopwords):for sentence in sentence_arr:for word in sentence:if word !=' 'and word.asalpha():# word.isalpha() isalpha函数用于判断字符串是否全部由字母组成if word not in stopwords:word_dic[word]=word_dic.get(word,1)+1word_dic=sorted(word_dic.items(),key=lanbda x:x[0],reverse=True)#按照key降序排列return word_dic
构建特征词表,过滤掉频率低于 word_num 的单词,即词向量维度为 word_num, return: 特征词列表
def get_feature_words(word_dic,word_num):n=0feature_words=[]for word in word_dic:if n<word_num:feature_words.append(word[0])n+=1return feature_words
文本特征表示,根据特征词,将数据集中的句子转化为特征向量
def get_text_features(train_data_list, test_data_list, feature_words):def text_features(text, feature_words):text_words = set(text) #转换为集合features = [1 if word in text_words else 0 for word in feature_words] # 形成特征向量return featurestrain_feature_list = [text_features(text, feature_words) for text in train_data_list] #生成训练集特征向量test_feature_list = [text_features(text, feature_words) for text in test_data_list]#生成测试集特征向量return train_feature_list, test_feature_list
调用上述函数,完成词表构建
sentences_arr, lab_arr = text_to_words('news_classify_data.txt') #读取数据集,获取分词后的数据及标签stopwords = load_stopwords('stopwords_cn.txt') #加载停用词表,生成停用词列表word_dic = get_dict(sentences_arr,stopwords) #去除停用词,统计词频,生成字典#将数据集划分为训练集和测试集train_data_list, test_data_list, train_class_list, test_class_list = model_selection.train_test_split(sentences_arr, lab_arr, test_size=0.1)feature_words = get_feature_words(word_dic,1000) #生成特征词列表,词向量维度为1000#将训练集和测试集数据生成特征向量train_feature_list,test_feature_list = get_text_features(train_data_list,test_data_list,feature_words)
查看特征向量,分析输出结果
print(feature_words[:10])print(feature_words.index('年'),feature_words.index('月'))print(train_data_list[0])print(train_feature_list[0])
模型创建、训练和评估
classifier=MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)classifier.fit(train_feature_list,train_class_list)predict=classifier.predict(test_feature_list)test_accuracy=accuracy_score(predict,test_class_list)print("accuracy_score:%.4lf"%(test_accuracy))
模型预测
def load_sentence(sentence):sentence = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()《》:]+", "",sentence) #去除标点符号sentence = jieba.lcut(sentence, cut_all=False) #分词return sentencelab = [ '文化', '娱乐', '体育', '财经','房产', '汽车', '教育', '科技', '国际', '证券']p_data = '快评:欠薪俱乐部获一线生机,中国足协为何总是心太软,还债金元足球到几时?'#'【中国稳健前行】应对风险挑战必须发挥制度优势'sentence = load_sentence(p_data)sentence= [sentence]print('分词结果:', sentence)#形成特征向量p_words = get_text_features(sentence,sentence,feature_words)res = classifier.predict(p_words[0])print("所属类型:",lab[int(res)])
思考:
朴素贝叶斯分类器与贝叶斯分类器有什么不同?朴素贝叶斯的判定准则是什么?
答:朴素贝叶斯分类器的原理是采用属性条件独立性假设,也就是所有属性互相独立,每个属性独立对分类结果产生影响。:如何使用朴素贝叶斯分类器进行垃圾邮件分类?
答:利用公式