朴素贝叶斯代码实现-商品评论情感分析案例
本文会介绍如何利用朴素贝叶斯模型来实现商品评论情感分析,该案例的重点不在于朴素贝叶斯模型,而是在于如何处理文本数据,如何将文本数据转换成模型能看得懂的矩阵形式。
导入相关的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import jieba #分词包
from sklearn.feature_extraction.text import CountVectorizer #词频统计包,把评论内容转换成词频矩阵
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import MultinomialNB # 多项式朴素贝叶斯对象
一、读取文件,获取原始数据
df = pd.read_csv('书籍评价.csv',encoding='gbk')
df.info()
print(df.head())
二、数据预处理
2.1 添加labels列,充当:标签列. 好评-->1,差评-->0
df['labels'] = np.where(df['评价']=='好评',1,0)
df.info()
print(df.head())
2.2 抽取labels列,作为:标签
y = df['labels']
2.3 演示 jieba分列
jieba.lcut 是 jieba 分词库中最常用的分词函数,作用是把中文句子切分成词语,返回词语列表(list)。
print(jieba.lcut('好好学习,天天向上!你爱我我爱你,蜜雪冰城甜蜜蜜!小明骑车,一把把把把住了'))
结果:['好好学习', ',', '天天向上', '!', '你', '爱', '我', '我爱你', ',', '蜜雪', '冰城', '甜蜜蜜', '!', '小明', '骑车', ',', '一把', '把', '把', '把住', '了']
2.4 对用户的评论信息做切词
# 数据格式[[第1条评论切词1,切词2,切词3],[第2条评论切词1,切词2,切词3],[]]
comment_list = [jieba.lcut(line) for line in df['内容'].values]
print(comment_list)
print(f'\n')
输入上面的代码,我们得到的是一个二维列表:
[[' ', '从', '编程', '小白', '的', '角度看', ',', '入门', '极佳', '。'], ['很', '好', '的', '入门', '书', ',', '简洁', '全面', ',', '适合', '小白', '。'], ['讲解', '全面', ',', '许多', '小', '细节', '都', '有', '顾及', ',', '三个', '小', '项目', '受益匪浅', '。'], ['前半部', '分讲', '概念', '深入浅出', ',', '要言不烦', ',', '很赞'], ['看', '了', '一遍', '还是', '不会', '写', ',', '有个', '概念', '而已'], ['中规中矩', '的', '教科书', ',', '零', '基础', '的', '看', '了', '依旧', '看不懂'], ['内容', '太', '浅显', ',', '个人', '认为', '不', '适合', '有', '其它', '语言', '编程', '基础', '的', '人'], ['破书', '一本'], ['适合', '完完全全', '的', '小白读', ',', '有', '其他', '语言', '经验', '的', '可以', '去', '看', '别的', '书'], ['基础知识', '写', '的', '挺', '好', '的', '!'], ['太', '基础'], ['略', '_', '嗦', '。', '。', '适合', '完全', '没有', '编程', '经验', '的', '小白'], ['真的', '真的', '不', '建议', '买']]
但我们需要的格式是一个一维列表,用,分隔开来,因此需要用.join将这个列表转换一下:
# 演示字符串join的用法
my_list = ['aa','bb','cc']
print(','.join(my_list))
结果:aa,bb,cc
# 要求的格式:['','','']
comment_list = [','.join(jieba.lcut(line)) for line in df['内容'].values]
print(comment_list)
输出上面代码的结果:
[' ,从,编程,小白,的,角度看,,,入门,极佳,。', '很,好,的,入门,书,,,简洁,全面,,,适合,小白,。', '讲解,全面,,,许多,小,细节,都,有,顾及,,,三个,小,项目,受益匪浅,。', '前半部,分讲,概念,深入浅出,,,要言不烦,,,很赞', '看,了,一遍,还是,不会,写,,,有个,概念,而已', '中规中矩,的,教科书,,,零,基础,的,看,了,依旧,看不懂', '内容,太,浅显,,,个人,认为,不,适合,有,其它,语言,编程,基础,的,人', '破书,一本', '适合,完完全全,的,小白读,,,有,其他,语言,经验,的,可以,去,看,别的,书', '基础知识,写,的,挺,好,的,!', '太,基础', '略,_,嗦,。,。,适合,完全,没有,编程,经验,的,小白', '真的,真的,不,建议,买']
2.5 加载停用词列表
即:里面记录的词,不需要参与模型训练,预测,要被删除的词。例如:的,啊,哈,从,都
with open('stopwords.txt','r',encoding='utf-8') as src_f:
# 2.5.1 一次性读取所有的行
stopwords_list = src_f.readlines()
# 2.5.2 删除最后的 '\n'
stopwords_list = [line.strip() for line in stopwords_list]
# 2.5.3
stopwords_list = list(set(stopwords_list))
print(stopwords_list)
代码解释:
1.with关键字:自动帮我们管理文件资源。只要缩进里的文件读取代码执行结束,不管程序运行正常还是中途出错,都会自动关闭这个文本文件,防止文件被一直锁定占用,不用我们手动写代码关闭文件.
2.open打开文件
3.as把打开的文件记为src_f
4.src_f.readlines()可以读取所有的行,回车键也会读取成\n
5.line.strip()可以移除字符串首尾的空白字符(中间的不会删),返回处理后的新字符串,原字符串不变。
6.set可以将列表转换为集合,由于集合的特性是不能有重复值,因此利用set再list的操作可以去重
7.总结: with 与 open 经常一起用,目的是在这部分代码块能够读取文件,然后把文件里的内容按照格式储存到新的变量,最后自动关闭这个文件。
2.6 创建向量化对象,从评论切词列表中删除停用词,并且统计词频(单词矩阵)
CountVectorizer()是文本向量化工具,作用:
把一堆中文 / 英文分词后的文本,转换成数值型单词计数矩阵(词频矩阵),让计算机可以处理文本数据。
transfer = CountVectorizer(stop_words=stopwords_list) # 参数:停用词列表
2.7 统计词频矩阵
transfer.fit(comment_list)
# x 的格式:[[第一条评论的切词分布,有就是1,没有就是0],[第二条评论的切词分布,有就是1,没有就是0],...]
x = transfer.transform(comment_list).toarray()
print(x) # 每个评论都会变成长度为37的列表-->0表示没有这个词,1表示有这个词
代码结果:生成一个13行,37列的矩阵,1表示有这个词,0表示没有这个词;
[[0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
0]
[0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0
0]
[0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1
1]
[0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0
0]
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0]
[0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0]
[0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
0]
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0]
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
0]
[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0]
[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0
0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0
0]]
2.8 看一下我们13条评论,切词,且删除停用词后,一共剩下多少词了
print(transfer.get_feature_names_out())
print(transfer.get_feature_names_out().size) # 一共37个词,
2.9 前10条当训练集,后三条当测试集
x_train = x[:10]
y_train = y[:10]
x_test = x[10:]
y_test = y[10:]
三、模型训练
estimator = MultinomialNB() # 创建朴素贝叶斯模型对象
estimator.fit(x_train, y_train)
四、模型预测结果
y_pred = estimator.predict(x_test)
print(y_pred)
五、模型评估
print(f'准确率:{estimator.score(x_test, y_test)}')

浙公网安备 33010602011771号