多 项 式 朴 素 贝 叶 斯 : sklearn.naive_ bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)主要用于离散特征分类,例如文本分类单词统计,以出现的次数作为特征值。
参数说明:alpha 为可选项,默认 1.0,添加拉普拉修/Lidstone 平滑参数;fit_prior 默认True,表示是否学习先验概率,参数为 False 表示所有类标记具有相同的先验概率;class_prior类似数组,数组大小为(n_classes,),默认 None,类先验概率。
这个案例是主要根据评价来推测这个书的好坏
文本数据预处理:sklearn 中 CountVectorizer、TfidfTransformer 和 TfidfVectorizer 是 文 本 数 据 预 处 理 : sklearn 中 CountVectorizer 、 TfidfTransformer 和TfidfVectorizer, 文本数据预处理的第一步通常是进行分词,分词后会进行向量化的操作。在介绍向量化之前,我们先来了解下词袋模型。
词袋模型假设我们不考虑文本中词与词之间的上下文关系,仅仅只考虑所有词的权重。
而权重与词在文本中出现的频率有关。
词袋模型首先会进行分词,在分词之后,通过统计每个词在文本中出现的次数,我们就
可以得到该文本基于词的特征,如果将各个文本样本的这些词与对应的词频放在一起,就是
我们常说的向量化。向量化完毕后一般也会使用 TF-IDF 进行特征的权重修正,再将特征
进行标准化。再进行一些其他的特征工程后,就可以将数据带入机器学习模型中计算。
词袋模型的三部曲:分词(tokenizing),统计修订词特征值(counting)与标准化
(normalizing)。
词袋模型有很大的局限性,因为它仅仅考虑了词频,没有考虑上下文的关系,因此会丢
失一部分文本的语义。
在词袋模型统计词频的时候,可以使用 sklearn 中的 CountVectorizer 来完成。
CountVectorizer 类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素 a[i][j],
它表示 j 词在 i 类文本下的词频。它通过 fit_transform 函数计算各个词语出现的次数,通过
get_feature_names()可获取词袋中所有文本的关键字,通过 toarray()可看到词频矩阵的结果。
TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF 是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF 加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
TF-IDF 的主要思想是:如果某个词或短语在一篇文章中出现的频率 TF 高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF。
import pandas as pd
import numpy as np
import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# 加载数据
data = pd.read_csv("./data.csv", encoding='gbk')
# print("data:",data)
print("data 的列索引:", data.columns)
# 提取内容这一列数据
content = data['内容 ']
# 评论标号 0 代表差评,1代表好评
data.loc[data.loc[:, '评价'] == '好评', '评论标号'] = 1
data.loc[data.loc[:, '评价'] == '差评', '评论标号'] = 0
# 获取标号这一列数据
comment = data['评论标号'].values
# print("data:",data)
#
# print(content)
#
stopwords = []
# 加载停用词
with open("./stopwords.txt", 'r', encoding='utf-8') as f:
lines = f.readlines()
# print(lines)
for tmp in lines:
# 对每一个元素进行出去空格
line = tmp.strip()
# 加入到一个大列表中
stopwords.append(line)
# 对停用词列表进行去重
stopwords = list(set(stopwords))
# print(stopwords)
# 进行分词,统计词出现的次数,--->贝叶斯进行预测类别,进行与真实值比对,来正确率
comment_list = []
for tmp in content:
# print(tmp)
# 进行每一行数据的切词
seg_list = jieba.cut(tmp, cut_all=False)
# print(seg_list)
# 将切好的次 按照 ,进行拼接成字符串
seg_str = ",".join(seg_list)
# print(seg_str)
# 将每一行的字符串添加到列表中取
comment_list.append(seg_str)
# print(comment_list)
# 进行统计词的个数
# 实例化CountVectorizer对象
con_vec = CountVectorizer(min_df=1, stop_words=stopwords)
# 进行词数统计
X = con_vec.fit_transform(comment_list)
print(con_vec.get_feature_names())
# print(X.toarray().shape)
# 文本信息转化为系数矩阵类型
print(X.toarray())
print(type(X.toarray()))
# 借助贝叶斯算法进行评论类别预测
# 准备训练集
x_train = X.toarray()[:10, :]
y_train = comment[:10]
# 准备测试集
x_test = X.toarray()[10:, :]
y_test = comment[10:]
# 构建贝叶斯算法分类器
# alpha 拉普拉斯平滑系数
nb = MultinomialNB(alpha=1.0)
# 进行训练集训练数据
nb.fit(x_train, y_train)
# 进行预测
y_predict = nb.predict(x_test)
print("预测值:", y_predict)
print("真实值:", y_test)